使用AWS CLI获取实例的名称和ARN列表

时间:2017-01-27 12:33:03

标签: amazon-web-services aws-cli

我想获得某个区域中所有实例的简单列表,每条记录应包含id,ARN和实例名称。 我尝试过使用

ec2 describe-instances --region us-east-1

但在输出中找不到ARN。

2 个答案:

答案 0 :(得分:6)

如果您的用例可以通过了解区域,帐户ID +实例ID来构建ARN:

arn:aws:ec2:region:account-id:instance/instance-id
arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0

实际上 - 当我查看JSON响应时,OwnerId似乎包含account-id,因此从describe-instances的结果中构建它应该相当简单。

编辑:使用jq构建您正在寻找的输出的示例:

aws ec2 describe-instances --region us-east-1 | jq -r '.Reservations[] | .OwnerId as $OwnerId | ( .Instances[] | { "ARN": "arn:aws:ec2:\(.Placement.AvailabilityZone[:-1]):\($OwnerId):instance/\(.InstanceId)", "AvailabilityZone": "\(.Placement.AvailabilityZone)", InstanceId, PublicDnsName, PrivateDnsName, Tags} )' | jq -s .

会产生如下输出:

[
  {
    "ARN": "arn:aws:ec2:us-east-1:123456789012:instance/i-0a9842b2da1xxxxxx",
    "AvailabilityZone": "us-east-1a",
    "InstanceId": "i-0a9842b2da1xxxxxx",
    "PublicDnsName": "ec2-72-32-69-225.compute-1.amazonaws.com",
    "PrivateDnsName": "ip-10-0-0-68.ec2.internal",
    "Tags": [
      {
        "Value": "my-beanstalk",
        "Key": "elasticbeanstalk:environment-name"
      },
      {
        "Value": "awseb-e-emiwxxxxxx-stack",
        "Key": "aws:cloudformation:stack-name"
      }
    ]
  },
  {
    "ARN": "arn:aws:ec2:us-east-1:123456789012:instance/i-0a9842b2ca1xxxxxx",
    "AvailabilityZone": "us-east-1a",
    "InstanceId": "i-0a9842b2ca1xxxxxx",
    "PublicDnsName": "ec2-72-32-69-226.compute-1.amazonaws.com",
    "PrivateDnsName": "ip-10-0-0-69.ec2.internal",
    "Tags": [
      {
        "Value": "my-beanstalk-2",
        "Key": "elasticbeanstalk:environment-name"
      },
      {
        "Value": "awseb-e-emizxxxxxx-stack",
        "Key": "aws:cloudformation:stack-name"
      }
    ]
  }
]

答案 1 :(得分:1)

查看此示例 - 之前来自我在SO Docs中的条目。

实例有很多元数据可以通过调用describe-instances返回,但通常您只想查看基础知识。您可以使用结合表输出的JMESPath查询以易于阅读的方式显示简洁的实例信息。

aws ec2 describe-instances --output table --query "Reservations[].Instances[].{Name: Tags[?Key == 'Name'].Value | [0], Id: InstanceId, State: State.Name, Type: InstanceType}"

-----------------------------------------------------
|                 DescribeInstances                 |
+-----------+---------------+----------+------------+
|    Id     |     Name      |  State   |   Type     |
+-----------+---------------+----------+------------+
|  i-abc123 |  None         |  stopped |  m3.large  |
|  i-def456 |  amazon linux |  stopped |  t2.micro  |
|  i-ghi789 |  proxy        |  running |  t2.micro  |
+-----------+---------------+----------+------------+

现在让我们一块一块地打破它。首先,我们有--output table。这将生成响应的彩色表表示。对于返回小数据集的命令或者已经过滤掉数据的命令,这通常最有用。

现在进入--query。这看起来很长,但实际上很简单。第一部分是Reservations[].Instances[]。这将返回所有返回实例的展平列表。

查询的下一部分用.{}封装。这样做是为列表中的每个项创建一个新的json对象,其中每个值都是要应用于源对象的JMESPath查询(在本例中为Instance)。其中大多数都很简单,但Name有点复杂。

获取Name的完整查询是Tags[?Key == 'Name'].Value | [0]。第一部分,Tags[?Key == 'Name']正在实例的标签中搜索关键字为Name的标签。下半部.Value | [0]正在选择每个标签的值,然后从列表中取出第一个项目(在这种情况下,只会有一个)。

你在桌子里想要的完全取决于你。例如,如果您想添加DNS信息,则可以轻松添加新密钥DNS: PublicDnsName

aws ec2 describe-instances --output table --query "Reservations[].Instances[].{Name: Tags[?Key == 'Name'].Value | [0], Id: InstanceId, State: State.Name, Type: InstanceType, DNS: PublicDnsName}"

--------------------------------------------------------------------------------------------------------
|                                           DescribeInstances                                          |
+--------------------------------------------------+-----------+---------------+----------+------------+
|                        DNS                       |    Id     |     Name      |  State   |   Type     |
+--------------------------------------------------+-----------+---------------+----------+------------+
|                                                  |  i-abc123 |  None         |  stopped |  m3.large  |
|                                                  |  i-def456 |  amazon linux |  stopped |  t2.micro  |
|  ec2-192-168-1-1.us-west-2.compute.amazonaws.com |  i-ghi789 |  proxy        |  running |  t2.micro  |
+--------------------------------------------------+-----------+---------------+----------+------------+

根据您想要的具体细节进行更改非常容易,并且不需要安装其他工具。