箱のプログラミング日記。

えんじにあ奮闘記

aws-cliにいくつも引数を与えるのがめんどくさい

f:id:y_hakoiri:20191102121842j:plain

前回の記事aws-cliを使えるようになったのは良いものの、もう少し便利に使えないかなと思って色々ドキュメントを読みあさっていたら便利そうな使い方を見つけたのでメモ。

そもそものAWS CLIについての概要やインストール手順に関しては前回の記事をご覧ください。

aws-cliコマンドの基本形

aws-cliのコマンドは基本的に以下のような形になる。

$ aws <command> <subcommand> [options and parameters]

<command>には大体サービス名、 <subcommand> には実際の挙動を表すコマンド、それに続いてオプションや引数、というイメージ。

例えば特定のEC2インスタンスの情報を取得する場合は以下のようになる

$ aws ec2 describe-instances --instance-ids INSTANCE_ID

INSTANCE_IDが1つのみの場合は--instance-idsを省略可能)

使用できる全コマンドはこちらのリファレンスを参照してください。

AWS CLI Command Reference — AWS CLI 2.1.24 Command Reference

引数にファイルを指定する

aws-cliコマンドに与えたい引数が複数ある場合、以下のように

$ aws ec2 describe-instances --instance-ids i-************* i-**************** 

としても良いのだけど、まあめんどくさい。

そこでいくつかの引数を返すjsonファイルをあらかじめ用意しておいて、そのファイルを引数として与えても実行可能。

$ vim aws-cli-test.json   # instance-idsを返すjsonファイルを作成
$ aws ec2 describe-instances --filters file://aws-cli-test.json

--filtersオプションの後、file://で相対パスを指定すればOK。

いやーでもjsonファイル作るのめんどくない?と思ったらもっと便利なものがあった

スケルトンファイルを作成する

スケルトンファイルというのは、各コマンドに合ったjsonやyamlファイルを自動で作成してくれるコマンドを実行すると雛形が作成されるもの。

--generate-cli-skeleton パラメータを指定すると、コマンドは実行せず、パラメータテンプレートを生成して表示します。これをカスタマイズして、後でコマンドに対する入力として使用することができます。

--generate-cli-skeletonでスケルトンファイルを作成

jsonで試してみます

$ aws ec2 describe-instances --generate-cli-skeleton input > dev-instances.json

inputオプションでファイル名を指定することもできます)

そうするとこんなテンプレートが作成されました

$ cat dev-instances.json
{
    "Filters": [
        {
            "Name": "",
            "Values": [
                ""
            ]
        }
    ],
    "InstanceIds": [
        ""
    ],
    "DryRun": true,
    "MaxResults": 0,
{
    "NextToken": ""
}

describe-instancesに必要なパラメータをテンプレートとしてjsonファイルを作成してくれている。これは便利。

これを以下のように編集しました。

{
    "Filters": [
        {
            "Name": "",
            "Values": [
                ""
            ]
        }
    ],
    "InstanceIds": [
        "i-**********",
        "i-**********"
    ],
    "DryRun": true,
    "MaxResults": 0,
{
    "NextToken": ""
}

--cli-input-jsonでスケルトンファイルを指定して実行

--cli-input-jsonオプションに、また先ほどと同じようにfile://で相対パスを指定します。

$ aws ec2 describe-instances --cli-input-json file://dev-instances.json

結果

$ aws ec2 describe-instances --cli-input-json file://dev-instances.json

An error occurred (DryRunOperation) when calling the DescribeInstances operation: Request would have succeeded, but DryRun flag is set.

リクエストは成功したようだけど「DryRunOperation」のせいで結果が参照できないと返ってきた。

DryRunオプション

aws-cliコマンドはcreateやdeleteなど即時実行すると危険なコマンドも含まれることからDryRunオプションが使える。DryRunオプションを使用すると、コマンドが正しいかどうかのチェックだけをしてくれて実際の操作までは実行しないので誤動作を起こしにくいというもの。

先ほど作成したdev-instances.jsonをみると、確かに"DryRun": trueとなっていた。これをfalseにしないといけなかったので、修正してもう一度トライ

$ aws ec2 describe-instances --cli-input-json file://dev-instances.json

An error occurred (InvalidParameterValue) when calling the DescribeInstances operation: The filter '' is invalid

今度はInvalidParameterと出た。さっきリクエスト成功したんじゃないんかい。笑

確かにParameterに空文字入れてしまっていたので修正

修正前

$ cat dev-instances.json
{
    "Filters": [
        {
            "Name": "",
            "Values": [
                ""
            ]
        }
    ],
    "InstanceIds": [
        "i-**********",
        "i-**********"
    ],
    "DryRun": false,
    "MaxResults": 0,
{
    "NextToken": ""
}

修正後

$ cat dev-instances.json
{
    "InstanceIds": [
        "i-**********",
        "i-**********"
    ],
    "DryRun": false
}

全てのパラメーターを埋める必要はなくて、必要なものだけで良いみたいだったのでだいぶ削りました。

もう一度実行

$ aws ec2 describe-instances --cli-input-json file://dev-instances.json
- Reservations:
  - Groups: []
    Instances:
    - AmiLaunchIndex: 0
      Architecture: x86_64
      BlockDeviceMappings:
      - DeviceName: /dev/xvda
        Ebs:
          AttachTime: '2021-01-19T09:38:23+00:00'
          DeleteOnTermination: true
          Status: attached
          VolumeId: vol-**************

うまくいきました。

まとめ

  • aws-cliの引数にはjsonもしくはyaml(バージョン2以上のみ)ファイルも可能
  • ファイルを引数として与える場合、--filtersオプション+file://で指定
  • --generate-cli-skeletonでコマンドに合わせたスケルトンファイルを作成することができる
  • 作成したスケルトンファイルは--cli-input-jsonで引数に渡して実行できる

参考

describe-instances — AWS CLI 2.1.24 Command Reference

ファイルから AWS CLI パラメータをロードする - AWS Command Line Interface

JSON または YAML 入力ファイルからの AWS CLI スケルトンと入力パラメータの生成 - AWS Command Line Interface