28

aws-cli 1.3.6 を使用して、名前と状態を含む ec2 インスタンスの単純なテーブルを取得しようとしています。--query と JMESpath のドキュメントを見ていて、「キー」項目が名前と等しいマップの「値」項目を選択できました。これは、インスタンス名を取得するのに役立ちます。したがって、以下のコードは機能するようです

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'

そしてこれを提供します:

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  Name2          |
+-----------------+

ただし、状態を追加したい場合は、期待どおりにならないことがあります。使用する

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'

配達します

-------------------
|DescribeInstances|
+-----------------+
|  Name1          |
|  stopped        |
|  Name2          |
|  stopped        |
+-----------------+

名前と状態を持つ 2 列のテーブルの代わりに。

出力を JSON にすると、タグの選択によってリスト (1 要素のリスト) が返されることがわかります。これがおそらく問題です。

[
    [
        [
            "Name1"
        ],
        "stopped"
    ],
    [
        [
            "Name2"
        ],
        "stopped"
    ]
]

最初の要素を選択して、このリストをスカラーに変換できませんでした。これは動作しません。名前として空のリストを返します。

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'

これと同じ

aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'

これに対処する唯一の方法は、結合機能を使用することです。要素は 1 つしか期待していないので問題ありませんが、少しハッキリしているようです。

aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'

---------------------------
|    DescribeInstances    |
+-------------+-----------+
|  Name1      |  stopped  |
|  Name2      |  stopped  |
+-------------+-----------+

したがって、問題は次のとおりです。フィルターの結果の最初の要素を選択する方法はあります(?Key==XXXX)[0]?

前もって感謝します!

4

3 に答える 3

1
#!/bin/bash
for r in `aws ec2 describe-regions --query Regions[*].RegionName --output text`
do

    #echo $r
    aws ec2 describe-instances --region $r --query 'Reservations[*].Instances[*].{ID:InstanceId, type:InstanceType, launched:LaunchTime, name:Tags[?Key==`Name`].Value[]}' --output json | jq --arg R $r -r '.[] | .[] | [$R, .ID, .type, .launched, .name[0]] | @csv'

done

出力:

"us-east-1","i-054f8253b9ed0746d","t2.micro","2018-10-31T01:57:52.000Z","xxx"
"us-east-1","i-0638792b8b3057ce2","t2.nano","2018-10-23T03:49:24.000Z","yyy"
于 2018-11-29T09:13:38.290 に答える