前回の記事で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