Help us understand the problem. What is going on with this article?

【備忘録】AWS CLI 便利オプション一覧

はじめに

某プロジェクトで客先AWSを扱う際、「セキュリティ的にGUIは見せられないんだよね」と言われ、
完全にゼロの状態からAWS CLIのみで環境構築を行なっていたのですが、
全部コマンドて……画面からポチポチさせてくれや……)というフラストレーションが溜まる一方
すっかり aws cli のコマンドが手に馴染んでしまうという事態に発展してしまったので、個人的によく使うコマンド / オプションをまとめてみました。

やっていることは特に難しくないです。

1. 実行結果の一覧表示(テーブル形式)

Lambdaファンクションの関数名、ハンドラ、ランタイムとか、いい感じに見たいなー、という時はこのコマンド。

aws lambda list-functions --query "Functions[].[FunctionName,Handler,runtime,memory]" --output table

--output tableオプションによりテーブル形式に整形して表示してくれます。--queryオプションの値はカスタマイズ可能。

2. 実行結果の一覧表示(リスト形式)

先述のコマンドと似ていますが、「ファンクション名の一覧だけ欲しい」という場合はこれ。

aws lambda list-functions --query "Functions[].[FunctionName]" --output text

--output textとすることで、半角スペース区切りで一覧取得できるので、配列に食わせてループ処理に投げながら一気に更新、なんてこともできます。

3. 実行結果のソート

  1. Lambdaファンクションの一覧表示 で取得したファンクションはソートされていない状態なので、ソートしたい項目がある場合、以下のようなコマンドを使用します。
aws events list-rules --query "sort_by(Rules[].{name:Name,role:RoleArn,schedule:ScheduleExpression,state:State},&name)" --output table

CloudWatchイベントの一覧表示の例です。
重要なのはやはり --query オプション。
sort_by() メソッドは第一引数に表示する結果、第二引数にソート対象となるキーオブジェクトを指定します。
表示結果が1項目のみの場合は、sort()メソッドを使用することも可能です。

sort()sort_by() 共に、デフォルトは昇順のソートですが、降順に並び替えたい場合は reverse() メソッドを使うことができます。

※ソート用のコマンドの記述方法は何通りかあるので、気になる方は適宜調べてみてください。

4. 再帰処理

S3大量のログを出力するのはよくあるパターンかと思いますが、それらや各種ファイルに対して
「フォルダA配下のファイルの一覧を再帰的に表示したい」「フォルダB以下のファイルをごそっとローカルにダウンロードしたい」「フォルダC以下のファイルをごっそり消してやりたい」という場合は--recursiveオプションを使用します。
一発で気持ちよくやってくれます。

表示

aws s3 ls s3://<bucket-name>/<folder-name>/ --recursive

任意のフォルダ以下のファイルをカレントディレクトリに取得

aws s3 cp s3://<bucket-name>/<folder-name> ./ --recursive

5. CloudWatch Logs のリアルタイム表示 : awslogs, -w

デバッグや単体テストなどを行う際、Lambdaのファンクションをinvokeしながら、出力されるログをリアルタイムで見たいことがありますよね。
ありませんか。ありますね。

そんな場合はawslogsという別のコマンドを使用します。
正しくはPython製のツールで、これまで説明した aws cli とは異なるものなので、別途 yum などで install する必要があります。
↓詳細はクラスメソッドさんが記事にしてくれています ↓
ターミナルから直感的にCloudWatch Logsを検索できるawslogsコマンドの紹介

awlogs 自身は設定ファイルを持ち、EC2などにインストールすると、任意のログをカスタマイズしたフォーマットでCloudWatch Logsに出力させることができます。
使用例としてはこちらの方が一般的かもしれませんが、僕はLambdaファンクションのログをtailfする用途で主に使用していました。

awslogs get -w -G --timestamp <log-group-name>

-wオプションにより、tail -fのように実行することができます。

6. 可読性の向上

S3を眺めていると、ファイルサイズがバイト単位での表記になっていることに気づくと思います。明らかに読みづらいですね。
そんな時でも--human-readableオプションをつけると、Bytes, KiB, MiBなど適切に単位を付与していい感じに表示してくれます。

オプションなし

[root@host tmp]# aws s3 ls s3://test-bucket
                           PRE backup/
                           PRE export/
2019-04-11 11:06:48  513034566 Documents.zip
2019-03-06 10:28:52   57172295 test_data.csv
2019-03-06 10:45:43      12331 test_result.csv
2018-11-20 18:21:09    1898705 employee.csv
2018-12-25 11:01:42 1263271147 var_log_messages.zip

オプションあり

[root@host tmp]# aws s3 ls s3://test-bucket --human-readable
                           PRE backup/
                           PRE export/
2019-04-11 11:06:48  489.3 MiB Documents.zip
2019-03-06 10:28:52   54.5 MiB test_data.csv
2019-03-06 10:45:43   12.0 KiB test_result.csv
2018-11-20 18:21:09    1.8 MiB employee.csv
2018-12-25 11:01:42    1.2 GiB var_log_messages.zip

読みやすくなってハッピーですね!!!

7. 特定の条件のデータのみを表示

describe-instances などでEC2のインスタンスの一覧を取得したい場合、出力される項目も多いためインスタンスの数が増えるほど可読性が悪くなります。
先述の--queryオプションなどで「取得したいパラメータを絞る」ことは可能ですが、インスタンスの数が多いとそれもあまり効果が無かったりします。
そんな中で、「あるサブネットに属するインスタンスの情報のみ表示したい」など条件による絞り込みを行いたい場合、--filtersオプションを使用します。

全インスタンスのID,タイプ、プライベートIPを取得

[root@host tmp]# aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,InstanceType,PrivateIpAddress]" --output table
----------------------------------------------------------
|                    DescribeInstances                   |
+---------------------+--------------+-------------------+
|  i-02XXXXXXXXXXXXX98|  t2.micro    |  192.168.0.31     |
|  i-0aXXXXXXXXXXXXX8d|  m5.large    |  192.168.0.18     |
|  i-03XXXXXXXXXXXXX62|  t2.medium   |  192.168.0.102    |
|  i-03XXXXXXXXXXXXX73|  m4.large    |  192.168.0.21     |
|  i-04XXXXXXXXXXXXX59|  t2.large    |  192.168.0.11     |
|  i-02XXXXXXXXXXXXX2f|  t2.micro    |  192.168.0.19     |
|  i-07XXXXXXXXXXXXX59|  t2.medium   |  192.168.0.32     |
|  i-0eXXXXXXXXXXXXX04|  r5.xlarge   |  192.168.5.13     |
|  i-0dXXXXXXXXXXXXX0f|  m5.large    |  192.168.0.24     |
|  i-0bXXXXXXXXXXXXXe2|  t2.small    |  192.168.0.15     |
|  i-08XXXXXXXXXXXXXc0|  m4.large    |  192.168.2.11     |
|  i-0aXXXXXXXXXXXXX1c|  m4.large    |  192.168.5.12     |
|  i-04XXXXXXXXXXXXX76|  t2.micro    |  192.168.2.12     |
|  i-05XXXXXXXXXXXXX11|  t1.micro    |  192.168.0.28     |
|  i-01XXXXXXXXXXXXX0b|  t2.medium   |  192.168.0.101    |
|  i-00XXXXXXXXXXXXX46|  t2.micro    |  192.168.0.16     |
|  i-01XXXXXXXXXXXXX50|  t2.micro    |  192.168.0.25     |
|  i-0dXXXXXXXXXXXXX15|  m4.large    |  192.168.5.11     |
|  i-05XXXXXXXXXXXXX43|  t2.micro    |  192.168.0.26     |
|  i-04XXXXXXXXXXXXXcd|  m5.large    |  192.168.0.23     |
|  i-07XXXXXXXXXXXXX41|  t2.small    |  192.168.0.13     |
|  i-0bXXXXXXXXXXXXXd9|  t2.micro    |  192.168.0.104    |
|  i-07XXXXXXXXXXXXX5e|  m3.large    |  192.168.2.10     |
<以下略>

上記のような出力に対し、「 インスタンスタイプが m4.large のもののみ表示したい 」という場合、修正したコマンドは以下のようになります。

[root@host tmp]# aws ec2 describe-instances \
[root@host tmp]#   --query "Reservations[].Instances[].[InstanceId,InstanceType,PrivateIpAddress]" \
[root@host tmp]#   --filters "Name=instance-type,Values=m4.large" --output table
--------------------------------------------------
|                DescribeInstances               |
+----------------------+-----------+-------------+
|  i-03XXXXXXXXXXXXX73 |  m4.large |  10.0.0.21  |
|  i-08XXXXXXXXXXXXXc0 |  m4.large |  10.0.2.11  |
|  i-0aXXXXXXXXXXXXX1c |  m4.large |  10.0.5.12  |
|  i-0dXXXXXXXXXXXXX15 |  m4.large |  10.0.5.11  |
|  i-02XXXXXXXXXXXXX64 |  m4.large |  10.0.0.17  |
|  i-00XXXXXXXXXXXXXd4 |  m4.large |  10.0.5.10  |
|  i-06XXXXXXXXXXXXX3f |  m4.large |  10.0.5.9   |
+----------------------+-----------+-------------+

少し長いので改行していますが、--queryオプションによる出力パラメータの絞り込みはそのままに、--filtersオプションで条件を指定しています。
ここで注意すべきは--filtersオプションに渡される引数です。
オプションなしの通常の出力(json形式)の場合、各パラメータ名はキャメルケースで表示されますが、
--filtersオプションのNameに代入するパラメータ名はAWS APIのフィルター仕様に従って「全て小文字にし、単語を - (ハイフン)で区切る」必要があるという点です。

フィルターに使用できる項目は以下のようにhelpコマンドで確認することができます。

aws ec2 describe-instances help

Valuesによる絞り込みのための値は、カンマ区切りで複数指定することも可能です。
また、NameValuesの組み合わせをJSONファイルとして保存しておけば、ファイル指定も可能です。

8. デバッグモードで実行

awscli のコマンドを使用したことがある方はエラーメッセージの不親切さを感じたことはありませんか?僕はあります。あまり詳細を表示してくれないんですよね。。。
そんな時は--debugオプションを付与しましょう。
以下にキーペア作成コマンドの実行時の例を示します。

$ aws ec2 describe-key-pairs --key-name $KEY_PAIR_NAME --debug

これにより、実行コマンドのログが詳細に表示されるようになります。

まとめ

数は少ないですが、aws cliコマンドもオプションや使い方一つで色々便利にできそうだったのでまとめてみました。
便利なオプションや使用例が見つかれば随時更新したいと思います。

2019/04/25
・[6. 可読性の向上]を追加
2019/05/08
・[7. 特定の条件のデータのみを表示 : --filters]を追加。
・各サブタイトルにオプションを追記
2019/07/30
・[8. デバッグモードで実行 : --debug]を追加。細かい修正。

fin.

yut0201
毎月お茶が届く会員です。モルモットを2匹飼育中。 情報発信はAWSメインです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした