如何从ec2 describe-instances中提取特定的键值标记

Mic*_*nez 1 amazon-ec2 amazon-web-services aws-cli jq

我从describe-instances中得到了以下内容:

{
    "Reservations": [
        {
            "Instances": [
                {
                   PublicDnsName": "ec2-xxxxx.amazonaws.com",
                    "Tags": [
                        {
                            "Value": "yyyyy",
                            "Key": "Name"
                        },
                        {
                            "Value": "zzzzz",
                            "Key": "budget_cluster"
                        },
                        {
                            "Value": "aaaaaaa",
                            "Key": "poc"
                        },
Run Code Online (Sandbox Code Playgroud)

对于每个实例,我想提取PublicDnsName和"budget_cluster"标记键的值.如何使用ec2 describe-instances或使用jq

Jor*_*ips 6

修改Frédéric的答案:

aws ec2 describe-instances --output text --query \
   'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
Run Code Online (Sandbox Code Playgroud)

会产生:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
Run Code Online (Sandbox Code Playgroud)

我已经将输出更改为文本,这会删除尽可能多的格式并选择单个标记值,| [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]]'
Run Code Online (Sandbox Code Playgroud)

还会产生:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
Run Code Online (Sandbox Code Playgroud)

但通过电线,您只能得到您关心的实例,从而节省带宽费用.