web-dev-qa-db-ja.com

aws-cli 1.3.6を使用して他のデータの中でインスタンス名を一覧表示する

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]'

これに対処するために私が考え出した唯一の方法は、join関数を使用することです。期待する要素は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]動作しないようです?

前もって感謝します!

28
c-garcia

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

この質問の言い方は、実際には解決策を示唆しています。つまり、 パイプ式 (ただし、バージョン1.3.7以降の aws-cli でのみ利用可能です。したがって、理解することはできません。質問時にアウト):

pipe-expression  = expression "|" expression

パイプ式は、|で区切られた2つの式を組み合わせます。キャラクター。これは、2つの重要な違いがある部分式に似ています。

  1. 右側では任意の式を使用できます。サブ式は、右側で使用できる式のタイプを制限します。
  2. パイプ式は、右側に伝播するために左側の投影を停止します。左側の式がプロジェクションを作成する場合、それは右側には適用されません。

次の例に示すように、強調された部分が重要です。

代わりに最初のサブリスト["first1"、 "second1"]のみが必要な場合は、パイプ式を使用できます。

foo[*].bar[0] -> ["first1", "first2"]
foo[*].bar | [0] -> ["first1", "second1"]

解決

したがって、パイプ式を適用すると、望ましい結果が得られます。

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

----------------------------------
|        DescribeInstances       |
+--------------------+-----------+
|  Name1             |  stopped  |
|  Name2             |  stopped  |
+--------------------+-----------+
24
Steffen Opel

サーバーの状態とともにインスタンスIDを通知します

Command:
aws ec2 describe-instances --filter Name=tag:Name,Values=eep --query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table

Query part in the above command
It changes as per the requirement
--query 'Reservations[*].Instances[*].{id:State,ID:InstanceId}' --output table
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"
1
Junhui Liu