How to extract a particular Key-Value Tag from ec2 describe-instances

自作多情 提交于 2019-12-11 04:46:10

问题


I've got the following from describe-instances:

{
    "Reservations": [
        {
            "Instances": [
                {
                   PublicDnsName": "ec2-xxxxx.amazonaws.com",
                    "Tags": [
                        {
                            "Value": "yyyyy",
                            "Key": "Name"
                        },
                        {
                            "Value": "zzzzz",
                            "Key": "budget_cluster"
                        },
                        {
                            "Value": "aaaaaaa",
                            "Key": "poc"
                        },

For each instance, I would like to extract the PublicDnsName and the value of the "budget_cluster" tag key. How to do this either with ec2 describe-instances or with jq ?


回答1:


Modifying Frédéric's answer:

aws ec2 describe-instances --output text --query \
   'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'

Would produce:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy

I've changed the output to text, which removes as much formatting as possible and selected the individual tag value with | [0] since there will only ever be one per instance anyway. Finally, I removed the [] at the end so that the resulting list isn't flattened. That way in text output each entry will be on its own line.

You can also make this more robust by only selecting instances that actually have that tag. You could do so with further modifications to the --query parameter, but it is better in this case to use the --filters parameter since it does service-side filtering. Specifically you want the tag-key filter: --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]]'

Would still produce:

ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy

But over the wire you would only be getting the instances you care about, thus saving money on bandwidth.




回答2:


Using jq 1.5 or later (version 1.5 being the most recent official release), the simplest approach is to use from_entries.

After a minimal fix of the illustrative input, the following invocation:

$ jq '.Reservations[]
      | .Instances[]
      | [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json

produces:

[
  "ec2-xxxxx.amazonaws.com",
  "zzzzz"
]

If you do not have jq 1.5 or later, the following should work:

$ jq1.4 '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json



回答3:


The answer of @peak is great and I keep learning from him on the jq part but again you can achieve quite a lot from the AWS CLI

aws ec2 describe-instances --query \
   'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}'

would produce

[
    {
        "PublicDnsName": "ec2-xxxxx.amazonaws.com",
        "Budget": [
                "zzzz",
        ]
    }
]

If you do not want to make a new strict JSon out of it, just take the values

aws ec2 describe-instances --query \
   'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]'

will produce

[
    "ec2-xxxxx.amazonaws.com",
    [
        "zzzz"
    ]
]


来源:https://stackoverflow.com/questions/39902587/how-to-extract-a-particular-key-value-tag-from-ec2-describe-instances

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!