私はこれで髪を引き裂こうとしています。 すべてのインスタンスには「Data」という名前のタグがあり、「Data」の値は「foo = yes、bar = yes」、「foo = yes、bar = no」、「foo = no、bar」のいずれかです。 = yes "、" foo = no、bar = no "、 --query
を実行して、" foo = yes "を含むタグ" Data "値を持つインスタンスのInstanceIdを返します。 だから何かのような
aws --region us-east-1 ec2 describe-instances --query 'Reservations[].Instances[].[?contains(Tags[?Key==`Data`].Value, `foo=yes` == `true`)].InstanceId'
しかし、それはうまくいきません。
それは確かにトリッキーなものです! 私はそれを次の式で管理しました:
"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
それは長いので、少しずつ分割していきます。 手始めに、次のサンプルデータを使用してみましょう。
{
"Reservations": [{"Instances": [
{
"InstanceId": "id-target1",
"Tags": [
{"Key": "Data", "Value": "foo=yes,bar=no"},
{"Key": "Name", "Value": "target"}
]
},
{
"InstanceId": "id-target2",
"Tags": [
{"Key": "Data", "Value": "foo=yes,bar=yes"},
{"Key": "Name", "Value": "target"}
]
},
{
"InstanceId": "id-invalid1",
"Tags": [
{"Key": "Data", "Value": "foo=no,bar=no"},
{"Key": "Name", "Value": "invalid"}
]
},
{
"InstanceId": "id-invalid2",
"Tags": [
{"Key": "Data", "Value": "foo=no,bar=yes"},
{"Key": "Name", "Value": "invalid"}
]
}
]}]
}
まず、インスタンスリストを取得したいので、 Reservations[].Instances[]
から始めます。
[
{
"Tags": [
{
"Value": "foo=yes,bar=no",
"Key": "Data"
},
{
"Value": "target",
"Key": "Name"
}
],
"InstanceId": "id-target1"
},
{
"Tags": [
{
"Value": "foo=yes,bar=yes",
"Key": "Data"
},
{
"Value": "target",
"Key": "Name"
}
],
"InstanceId": "id-target2"
},
{
"Tags": [
{
"Value": "foo=no,bar=no",
"Key": "Data"
},
{
"Value": "invalid",
"Key": "Name"
}
],
"InstanceId": "id-invalid1"
},
{
"Tags": [
{
"Value": "foo=no,bar=yes",
"Key": "Data"
},
{
"Value": "invalid",
"Key": "Name"
}
],
"InstanceId": "id-invalid2"
}
]
今、私たちは値「データ」とのキーを持っているタグをしたい: .Tags[?Key == 'Data']
完全な表現のためのReservations[].Instances[].Tags[?Key == 'Data']
と結果:
[
[
{
"Value": "foo=yes,bar=no",
"Key": "Data"
}
],
[
{
"Value": "foo=yes,bar=yes",
"Key": "Data"
}
],
[
{
"Value": "foo=no,bar=no",
"Key": "Data"
}
],
[
{
"Value": "foo=no,bar=yes",
"Key": "Data"
}
]
]
ここで、そのタグの値に「foo = yes」を含める必要があるため、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
の条件&& contains(Value, 'foo=yes')
Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
と結果を追加します。
[
[
{
"Value": "foo=yes,bar=no",
"Key": "Data"
}
],
[
{
"Value": "foo=yes,bar=yes",
"Key": "Data"
}
],
[],
[]
]
さて、完全な式Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
とその結果について、そのリストを[]
でフラット化しましょう。
[
{
"Value": "foo=yes,bar=no",
"Key": "Data"
},
{
"Value": "foo=yes,bar=yes",
"Key": "Data"
}
]
さて、これで必要なタグができましたが、完全なインスタンスデータが必要です。 それでは、そのタグフィルターをインスタンスのフィルターとして戻しましょう。 したがって、完全な式はReservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]
なり、結果は次のようになります。
[
[
{
"Tags": [
{
"Value": "foo=yes,bar=no",
"Key": "Data"
},
{
"Value": "target",
"Key": "Name"
}
],
"InstanceId": "id-target1"
},
{
"Tags": [
{
"Value": "foo=yes,bar=yes",
"Key": "Data"
},
{
"Value": "target",
"Key": "Name"
}
],
"InstanceId": "id-target2"
}
]
]
もう少し説明すると、 ?
は真の値をチェックしています。 適切なタグがないインスタンスの場合、 ?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
は偽の値であるnull
を返します。
あとは、そのリストをフラット化して、完全な式"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
と結果の[].InstanceId
を含むインスタンスIDを選択するだけです。
[
"id-target1",
"id-target2"
]
これで完了です。
うわ〜すごい! Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
ステップは私が脱線したところです。 ありがとうございました!
* アップデート *
私の目的では、以下ははるかに簡単なアプローチでした(これは、2年以上前の日付のスレッドにアクセスすることで得られるものです)。
--filter "Name=tag:aws:cloudformation:stack-name,Values=*$1*"
* オリジナルメッセージ *
これは機能していないようです。 [?Tagsが.Tagsに置き換えられた最後のステップまでずっと機能しました..ユースケースで実行すると、空のセットが取得されます(期待どおりの結果が得られた後)
Reservations[].Instances[].Tags[?Key == 'aws:cloudformation:stack-name' && contains(Value, 'target')][]
最も参考になるコメント
それは確かにトリッキーなものです! 私はそれを次の式で管理しました:
それは長いので、少しずつ分割していきます。 手始めに、次のサンプルデータを使用してみましょう。
まず、インスタンスリストを取得したいので、
Reservations[].Instances[]
から始めます。今、私たちは値「データ」とのキーを持っているタグをしたい:
.Tags[?Key == 'Data']
完全な表現のためのReservations[].Instances[].Tags[?Key == 'Data']
と結果:ここで、そのタグの値に「foo = yes」を含める必要があるため、完全な式
Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
の条件&& contains(Value, 'foo=yes')
Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')]
と結果を追加します。さて、完全な式
Reservations[].Instances[].Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
とその結果について、そのリストを[]
でフラット化しましょう。さて、これで必要なタグができましたが、完全なインスタンスデータが必要です。 それでは、そのタグフィルターをインスタンスのフィルターとして戻しましょう。 したがって、完全な式は
Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]]
なり、結果は次のようになります。もう少し説明すると、
?
は真の値をチェックしています。 適切なタグがないインスタンスの場合、?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]
は偽の値であるnull
を返します。あとは、そのリストをフラット化して、完全な式
"Reservations[].Instances[?Tags[?Key == 'Data' && contains(Value, 'foo=yes')][]][].InstanceId"
と結果の[].InstanceId
を含むインスタンスIDを選択するだけです。これで完了です。