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]
動作しないようです?
前もって感謝します!
したがって、問題は、フィルタの結果の最初の要素(?Key == XXXX)を選択する方法はありますか。
この質問の言い方は、実際には解決策を示唆しています。つまり、 パイプ式 (ただし、バージョン1.3.7以降の aws-cli でのみ利用可能です。したがって、理解することはできません。質問時にアウト):
pipe-expression = expression "|" expression
パイプ式は、|で区切られた2つの式を組み合わせます。キャラクター。これは、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 |
+--------------------+-----------+
サーバーの状態とともにインスタンス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
#!/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"