AWS Command Line Interface
ユーザーガイド

AWS CLI からのコマンド出力の制御

このセクションでは、AWS Command Line Interface (AWS CLI) からの出力を制御するためのさまざまな方法を示します。

出力形式を選択する方法

AWS CLI は、次の 3 つの出力形式をサポートします。

  • JSON (json)

  • タブ区切りテキスト (text)

  • ASCII 形式のテーブル (table)

設定」トピックで説明したように、出力形式は 3 つの異なる方法で指定できます。

  • config ファイルの名前付きプロファイルでの output オプションの使用。次の例は、デフォルトの出力形式を text に設定します。

    [default] output=text
  • AWS_DEFAULT_OUTPUT 環境変数を使用する。次の出力は、変数が変更されるか、セッションが終了するまで、このコマンドラインセッションでのコマンドの形式を table に設定します。この環境変数を使用すると、config ファイルで設定された値が上書きされます。

    $ export AWS_DEFAULT_OUTPUT="table"
  • コマンドラインの --output オプションを使用する。次の例は、この 1 つのコマンドの出力を json に設定します。このコマンドでこのオプションを使用すると、現在設定されている環境変数または config ファイルの値をオーバーライドします。

    $ aws swf list-domains --registration-status REGISTERED --output json

AWS CLI 優先順位ルールが適用されます。たとえば、AWS_DEFAULT_OUTPUT 環境変数を使用すると、config ファイルで設定された値をオーバーライドし、AWS CLI コマンドに --output で渡された値は、環境変数または config ファイルで設定された値をオーバーライドします。

json オプションは、さまざまな言語または jq (コマンドライン JSON プロセッサ) を介してプログラムで出力を処理するのに最適です。

table は読みやすい形式です。

text 形式は、sedgrepawk など、従来の Unix テキスト処理ツールでも、Windows PowerShell スクリプトでも機能します。

どの形式の結果も、--query パラメータを使用してカスタマイズおよびフィルタリングすることができます。詳細については、「--query オプションを使用して出力をフィルタリングする方法」を参照してください。

JSON 出力形式

JSON は AWS CLI のデフォルトの出力形式です。ほとんどの言語は、組み込み関数を使用するか、一般利用可能なライブラリを使用して、簡単に JSON 文字列をデコードできます。前のトピックで出力例と共に示したように、--query オプションでは、AWS CLI の JSON 形式の出力をフィルタ処理および書式設定する強力な機能を使用できます。

--query では可能でないことがある、より高度な機能が必要な場合は、コマンドライン JSON プロセッサの jq をお試しください。これをダウンロードし、公式のチュートリアルを http://stedolan.github.io/jq/ で見ることができます。

テキストの出力形式

テキスト形式では、AWS CLI の出力がタブ区切りの行に整形されます。grepsedawk など、従来の Unix テキストツールでも、PowerShell スクリプトによって実行されるテキスト処理でも機能します。

テキスト出力形式は、以下に示す基本的な構造に従います。列は、基になる JSON オブジェクトの対応するキー名によってアルファベット順にソートされます。

IDENTIFIER sorted-column1 sorted-column2 IDENTIFIER2 sorted-column1 sorted-column2

次はテキスト出力の例です。

$ aws ec2 describe-volumes --output text VOLUMES us-west-2a 2013-09-17T00:55:03.000Z 30 snap-f23ec1c8 in-use vol-e11a5288 standard ATTACHMENTS 2013-09-17T00:55:03.000Z True /dev/sda1 i-a071c394 attached vol-e11a5288 VOLUMES us-west-2a 2013-09-18T20:26:15.000Z 8 snap-708e8348 in-use vol-2e410a47 standard ATTACHMENTS 2013-09-18T20:26:16.000Z True /dev/sda1 i-4b41a37c attached vol-2e410a47

重要

text 出力を指定する場合は、--query オプションも必ず使用して、一貫した動作を確保することを強くお勧めします。これは、テキスト形式では出力列が基本の JSON オブジェクトのキー名のアルファベット順に並べられるためであり、同様のリソースが同じキー名を持つとは限らないためです。たとえば、Linux ベースの EC2 インスタンスの JSON 表現は、Windows ベースのインスタンスの JSON 表現にはない要素を持つことがあり、逆も同様です。また、リソースのキー値要素が将来の更新で追加または削除されて、列の順序が変わる可能性があります。このような場合、--query はテキスト出力の機能を補強して、出力形式に対する完全な制御を提供します。次の例では、コマンドは表示する要素を指定し、列の順序をリスト表記 [key1, key2, ...] で定義します。これにより、正しいキー値が常に予期される列に表示されることを確信できます。最後に、AWS CLI は存在しないキーの値として None を出力することに注意してください。

$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size, FakeKey]' --output text vol-e11a5288 i-a071c394 us-west-2a 30 None vol-2e410a47 i-4b41a37c us-west-2a 8 None

次の例は、grep および awkaws ec2 describe-instances コマンドからの text 出力で使用する方法を示しています。最初のコマンドは各インスタンスのアベイラビリティーゾーン、現在の状態、およびインスタンス ID をテキスト出力で表示します。2 番目のコマンドは、その出力を処理して、us-west-2a アベイラビリティーゾーンで実行中のすべてのインスタンスのインスタンス ID のみを表示します。

$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text us-west-2a running i-4b41a37c us-west-2a stopped i-a071c394 us-west-2b stopped i-97a217a0 us-west-2a running i-3045b007 us-west-2a running i-6fc67758 $ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | grep us-west-2a | grep running | awk '{print $3}' i-4b41a37c i-3045b007 i-6fc67758

次の例は、さらに一歩踏み込んで、出力をフィルタリングする方法だけでなく、その出力を使用して、停止した各インスタンスのインスタンスタイプの変更を自動化する方法も示しています。

$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[State.Name, InstanceId]' --output text | > grep stopped | > awk '{print $2}' | > while read line; > do aws ec2 modify-instance-attribute --instance-id $line --instance-type '{"Value": "m1.medium"}'; > done

テキスト出力は、PowerShell でも使用できます。text 出力の列はタブ区切りであるため、PowerShell の `t 区切り記号を使用することによって簡単に配列に分割できます。次のコマンドは、最初の列 (AvailabilityZone) が文字列 us-west-2a に一致する場合に 3 列目 (InstanceId) の値を表示します。

PS C:\>aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | %{if ($_.split("`t")[0] -match "us-west-2a") { $_.split("`t")[2]; } } i-4b41a37c i-a071c394 i-3045b007 i-6fc67758

ヒント

テキスト出力を行い、--query パラメータを使用して出力を単一のフィールドにフィルタリングすると、出力は 1 行のタブ区切り値になります。次の例に示すように、各値を別々の行に入れるには、出力フィールドを角括弧で囲みます。

タブ区切りの単一の行の出力

$ aws iam list-groups-for-user --user-name susan --output text --query "Groups[].GroupName" HRDepartment Developers SpreadsheetUsers LocalAdmins

[GroupName] を角括弧で囲むことで、各値を 1 行におさめることができます。

$ aws iam list-groups-for-user --user-name susan --output text --query "Groups[].[GroupName]" HRDepartment Developers SpreadsheetUsers LocalAdmins

テーブルの出力形式

table 形式は、複雑な AWS CLI 出力を人間が読み取れる表現で、表形式で生成します。

$ aws ec2 describe-volumes --output table --------------------------------------------------------------------------------------------------------------------- | DescribeVolumes | +-------------------------------------------------------------------------------------------------------------------+ || Volumes || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || AvailabilityZone | CreateTime | Size | SnapshotId | State | VolumeId | VolumeType || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || us-west-2a | 2013-09-17T00:55:03.000Z | 30 | snap-f23ec1c8 | in-use | vol-e11a5288 | standard || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| ||| Attachments ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| AttachTime | DeleteOnTermination | Device | InstanceId | State | VolumeId ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| 2013-09-17T00:55:03.000Z | True | /dev/sda1 | i-a071c394 | attached | vol-e11a5288 ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| || Volumes || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || AvailabilityZone | CreateTime | Size | SnapshotId | State | VolumeId | VolumeType || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| || us-west-2a | 2013-09-18T20:26:15.000Z | 8 | snap-708e8348 | in-use | vol-2e410a47 | standard || |+------------------+---------------------------+-------+----------------+---------+----------------+--------------+| ||| Attachments ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| AttachTime | DeleteOnTermination | Device | InstanceId | State | VolumeId ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+|| ||| 2013-09-18T20:26:16.000Z | True | /dev/sda1 | i-4b41a37c | attached | vol-2e410a47 ||| ||+---------------------------+------------------------+-------------+--------------+------------+----------------+||

--query オプションを表形式と組み合わせて、raw 出力から事前に選択された要素のセットを表示することができます。ディクショナリ表記とリスト表記の出力の違いに注意してください。最初の例では、列名はアルファベット順ですが、2 番目の例では、名前のない列がユーザーによって定義された順序になっています。--query オプションの詳細については、「--query オプションを使用して出力をフィルタリングする方法」を参照してください。

$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output table ------------------------------------------------------ | DescribeVolumes | +------------+----------------+--------------+-------+ | AZ | ID | InstanceId | Size | +------------+----------------+--------------+-------+ | us-west-2a| vol-e11a5288 | i-a071c394 | 30 | | us-west-2a| vol-2e410a47 | i-4b41a37c | 8 | +------------+----------------+--------------+-------+ $ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId,Attachments[0].InstanceId,AvailabilityZone,Size]' --output table ---------------------------------------------------- | DescribeVolumes | +--------------+--------------+--------------+-----+ | vol-e11a5288| i-a071c394 | us-west-2a | 30 | | vol-2e410a47| i-4b41a37c | us-west-2a | 8 | +--------------+--------------+--------------+-----+

--query オプションを使用して出力をフィルタリングする方法

AWS CLI は、--query オプションによって、組み込みの JSON ベースの出力フィルタリング機能を提供します。--query パラメータは、JMESPath の仕様に準拠している文字列を受け入れます。

重要

指定する出力タイプ (jsontext、または table) により、--query オプションの動作に影響があります。

  • --output text を指定した場合、出力は --query フィルタが適用される前にページ分割され、AWS CLI は出力の各ページで 1 回クエリを実行します。これにより、予期しない追加の出力が生成される場合があります (特に、フィルタで [0] のような配列要素をしている場合)。その場合、出力には各ページで最初に一致する要素が含まれるためです。

  • --output json を指定した場合、出力は完全に処理され、JSON 構造に変換されてから --query フィルタが適用されます。AWS CLI により、出力全体に対して 1 回のみクエリが実行されます。

--output text を使用する場合に作成される可能性がある追加の出力を回避するには、--no-paginate を指定できます。これにより、フィルタは完全な結果セットにのみ適用されますが、ページ分割は削除されないため、長い出力になる可能性があります。また、headtail など他のコマンドラインツールを使用して、必要な値のみにさらに出力をフィルタリングすることもできます。

--query の機能を示すために、まず以下のデフォルトの JSON 出力で開始します。この出力では、2 つの Amazon Elastic Block Store (Amazon EBS) ボリュームが個別の Amazon EC2 インスタンスにアタッチされています。

$ aws ec2 describe-volumes { "Volumes": [ { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }, { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-18T20:26:16.000Z", "InstanceId": "i-4b41a37c", "VolumeId": "vol-2e410a47", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-2e410a47", "State": "in-use", "SnapshotId": "snap-708e8348", "CreateTime": "2013-09-18T20:26:15.000Z", "Size": 8 } ] }

まず、Volumes リストから最初のボリュームのみ表示されるように選択するために、配列の最初のボリュームのインデックスを作成する次のコマンドを使用します。

$ aws ec2 describe-volumes --query 'Volumes[0]' { "AvailabilityZone": "us-west-2a", "Attachments": [ { "AttachTime": "2013-09-17T00:55:03.000Z", "InstanceId": "i-a071c394", "VolumeId": "vol-e11a5288", "State": "attached", "DeleteOnTermination": true, "Device": "/dev/sda1" } ], "VolumeType": "standard", "VolumeId": "vol-e11a5288", "State": "in-use", "SnapshotId": "snap-f23ec1c8", "CreateTime": "2013-09-17T00:55:03.000Z", "Size": 30 }

次の例では、ワイルドカード表記 [*] を使用して、リストのすべてのボリュームを反復処理し、それぞれから VolumeIdAvailabilityZone、および Size の 3 つの要素を抽出します。ディクショナリ表記では、{Alias1:JSONKey1,Alias2:JSONKey2} のように、各 JSON キーのエイリアスを指定する必要があります。ディクショナリは本質的に順不同であるため、構造内のキーエイリアスの順序に一貫性がない場合があります。

$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,AZ:AvailabilityZone,Size:Size}' [ { "AZ": "us-west-2a", "ID": "vol-e11a5288", "Size": 30 }, { "AZ": "us-west-2a", "ID": "vol-2e410a47", "Size": 8 } ]

ディクショナリ表記では、key1.key2[0].key3 のようにキーを連結して、構造内で深く入れ子になった要素をフィルタリングすることもできます。以下の例では、単純に Attachments[0].InstanceId に対して InstanceId キーのエイリアスを作成して、これを示します。

$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' [ { "InstanceId": "i-a071c394", "AZ": "us-west-2a", "ID": "vol-e11a5288", "Size": 30 }, { "InstanceId": "i-4b41a37c", "AZ": "us-west-2a", "ID": "vol-2e410a47", "Size": 8 } ]

リスト表記 [key1, key2] を使用して、複数の要素をフィルタリングすることもできます。これにより、フィルタリングされたすべての属性が、型に関係なく、オブジェクトごとに 1 つの順序付きリスト形式になります。

$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId, Attachments[0].InstanceId, AvailabilityZone, Size]' [ [ "vol-e11a5288", "i-a071c394", "us-west-2a", 30 ], [ "vol-2e410a47", "i-4b41a37c", "us-west-2a", 8 ] ]

特定のフィールドの値によって結果をフィルタ処理するには、JMESPath "?" 演算子を使用します。次のクエリの例では、us-west-2a アベイラビリティーゾーンのボリュームのみを出力します。

$ aws ec2 describe-volumes --query 'Volumes[?AvailabilityZone==`us-west-2a`]'

注記

JMESPath クエリ式で上記の "us-west-2" のようなリテラル値を指定するときは、適切に読み込まれるように、値をバックティック (` `) で囲む必要があります。

コマンドの出力から必要な詳細のみを取得する方法を示す他の例を以下に示します。

以下の例では、Amazon EC2 ボリュームを表示します。このサービスでは、us-west-2a アベイラビリティーゾーンの使用中のすべてのボリュームのリストが生成されます。--query パラメータでは、Size 値が 50 を超えるボリュームにのみ出力を制限し、ユーザー定義の名前を持つ指定されたフィールドのみ表示されます。

$ aws ec2 describe-volumes \ --filter "Name=availability-zone,Values=us-west-2a" "Name=status,Values=attached" \ --query 'Volumes[?Size > `50`].{Id:VolumeId,Size:Size,Type:VolumeType}' [ { "Id": "vol-0be9bb0bf12345678", "Size": 80, "Type": "gp2" } ]

次の例では、いくつかの基準を満たすイメージのリストを取得します。--query パラメータを使用して、CreationDate で出力を絞り込み、最新のイメージのみ選択します。その結果、1 つのイメージの ImageId が表示されます。

$ aws ec2 describe-images \ --owners amazon \ --filters "Name=name,Values=amzn*gp2" "Name=virtualization-type,Values=hvm" "Name=root-device-type,Values=ebs" \ --query "sort_by(Images, &CreationDate)[-1].ImageId" \ --output text ami-00ced3122871a4921

次の例では、--query パラメータを使用してリスト上の特定の項目を検索し、その項目から情報を抽出します。この例では、指定されたサービスエンドポイントに関連付けられているすべてのアベイラビリティーゾーンをリストします。指定された ServiceName が含まれる ServiceDetails リストから項目を抽出し、選択されたその項目から AvailabilityZones フィールドを出力します。

$ aws --region us-east-1 ec2 describe-vpc-endpoint-services --query 'ServiceDetails[?ServiceName==`com.amazonaws.us-east-1.ecs`].AvailabilityZones' [ [ "us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d", "us-east-1e", "us-east-1f" ] ]

また、--query パラメータを使用して、出力の項目をカウントすることもできます。次の例では、1000 IOPS を超える利用可能なボリュームの数を表示します。

$ aws ec2 describe-volumes \ --filter "Name=status,Values=available" \ --query 'length(Volumes[?Iops > `1000`])' 3

次の例は、指定された日付以降に作成されたすべてのスナップショットを一覧表示する方法を示しています (例: 出力の利用可能な一部のフィールド)。

$ aws ec2 describe-snapshots --owner self --output json \ --query 'Snapshots[?StartTime>=`2018-02-07`].{Id:SnapshotId,VId:VolumeId,Size:VolumeSize}' \ [ { "id": "snap-0effb42b7a1b2c3d4", "vid": "vol-0be9bb0bf12345678", "Size": 8 } ]

次の例では、作成した最新の 5 つの AMI を最新のものから古いものの順に並べ替えています。

$ aws ec2 describe-images --owners self \ --query 'reverse(sort_by(Images,&CreationDate))[:5].{id:ImageId,date:CreationDate}' [ { "id": "ami-0a1b2c3d4e5f60001", "date": "2018-11-28T17:16:38.000Z" }, { "id": "ami-0a1b2c3d4e5f60002", "date": "2018-09-15T13:51:22.000Z" }, { "id": "ami-0a1b2c3d4e5f60003", "date": "2018-08-19T10:22:45.000Z" }, { "id": "ami-0a1b2c3d4e5f60004", "date": "2018-05-03T12:04:02.000Z" }, { "id": "ami-0a1b2c3d4e5f60005", "date": "2017-12-13T17:16:38.000Z" } ]

次の例では、指定した AutoScaling グループ内の異常なインスタンスの InstanceId のみを表示しています。

$ aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name My-AutoScaling-Group-Name --output text\ --query 'AutoScalingGroups[*].Instances[?HealthStatus==`Unhealthy`].InstanceId'

--query オプションは、以下のセクションで詳細に説明する 3 つの出力形式との組み合わせにより、出力の内容とスタイルをカスタマイズするために使用できる強力なツールです。

JMESPath の詳細な例と完全な仕様、基盤となる JSON 処理ライブラリについては、「http://jmespath.org/specification.html」を参照してください。