如何从 ec2 描述实例中提取特定的键值标签
How to extract a particular Key-Value Tag from ec2 describe-instances
我从描述实例中得到以下信息:
{
"Reservations": [
{
"Instances": [
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Tags": [
{
"Key": "Name",
"Value": "yyyyy"
},
{
"Key": "budget_cluster",
"Value": "zzzzz"
},
{
"Key": "poc",
"Value": "aaaaaaa"
}
]
}
]
}
]
}
对于每个实例,我想提取 PublicDnsName 和 "budget_cluster" 标签键的值。如何使用 ec2 describe-instances
或 jq
?
使用jq 1.5或更高版本,最简单的方法是使用from_entries
。
在对说明性输入进行最小修正后,调用如下:
$ jq '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json
产生:
[
"ec2-xxxxx.amazonaws.com",
"zzzzz"
]
如果您没有 jq 1.5 或更高版本,以下方法应该有效:
$ jq1.4 '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json
@peak 的回答很棒,我一直在向他学习 jq
部分,但同样您可以从 AWS CLI 中获得很多
aws ec2 describe-instances --query \
'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}'
会产生
[
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Budget": [
"zzzz",
]
}
]
如果您不想从中创建一个新的严格 JSon,只需取值
aws ec2 describe-instances --query \
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]'
会产生
[
"ec2-xxxxx.amazonaws.com",
[
"zzzz"
]
]
修改 Frédéric 的回答:
aws ec2 describe-instances --output text --query \
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
我已将输出更改为文本,这会尽可能多地删除格式并使用 | [0]
选择单个标记值,因为无论如何每个实例都只有一个。最后,我删除了末尾的 []
,这样生成的列表就不会展平。这样在文本输出中每个条目将在其自己的行上。
您还可以通过仅选择实际具有该标签的实例来使其更加稳健。您可以通过进一步修改 --query
参数来实现此目的,但在这种情况下最好使用 --filters
参数,因为它会进行服务端过滤。具体来说,您需要 tag-key
过滤器:--filters "Name=tag-key,Values=budget_cluster"
aws ec2 describe-instances --output text \
--filters "Name=tag-key,Values=budget_cluster" --query \
'Reservations[].Instances[?Tags[?Key==`budget_cluster`]].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
仍会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
但是通过网络您只会获得您关心的实例,从而节省带宽费用。
我从描述实例中得到以下信息:
{
"Reservations": [
{
"Instances": [
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Tags": [
{
"Key": "Name",
"Value": "yyyyy"
},
{
"Key": "budget_cluster",
"Value": "zzzzz"
},
{
"Key": "poc",
"Value": "aaaaaaa"
}
]
}
]
}
]
}
对于每个实例,我想提取 PublicDnsName 和 "budget_cluster" 标签键的值。如何使用 ec2 describe-instances
或 jq
?
使用jq 1.5或更高版本,最简单的方法是使用from_entries
。
在对说明性输入进行最小修正后,调用如下:
$ jq '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json
产生:
[
"ec2-xxxxx.amazonaws.com",
"zzzzz"
]
如果您没有 jq 1.5 或更高版本,以下方法应该有效:
$ jq1.4 '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json
@peak 的回答很棒,我一直在向他学习 jq
部分,但同样您可以从 AWS CLI 中获得很多
aws ec2 describe-instances --query \
'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}'
会产生
[
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Budget": [
"zzzz",
]
}
]
如果您不想从中创建一个新的严格 JSon,只需取值
aws ec2 describe-instances --query \
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]'
会产生
[
"ec2-xxxxx.amazonaws.com",
[
"zzzz"
]
]
修改 Frédéric 的回答:
aws ec2 describe-instances --output text --query \
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
我已将输出更改为文本,这会尽可能多地删除格式并使用 | [0]
选择单个标记值,因为无论如何每个实例都只有一个。最后,我删除了末尾的 []
,这样生成的列表就不会展平。这样在文本输出中每个条目将在其自己的行上。
您还可以通过仅选择实际具有该标签的实例来使其更加稳健。您可以通过进一步修改 --query
参数来实现此目的,但在这种情况下最好使用 --filters
参数,因为它会进行服务端过滤。具体来说,您需要 tag-key
过滤器:--filters "Name=tag-key,Values=budget_cluster"
aws ec2 describe-instances --output text \
--filters "Name=tag-key,Values=budget_cluster" --query \
'Reservations[].Instances[?Tags[?Key==`budget_cluster`]].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
仍会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
但是通过网络您只会获得您关心的实例,从而节省带宽费用。