我要为此扯掉我的头发。 我的所有实例都有一个名为“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"
}
]
现在我们想要具有值为“Data”的 Key 的标签: .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[]
:现在我们想要具有值为“Data”的 Key 的标签:
.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 和结果:我们完成了!