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

Get a list of names and ARNs of instances using AWS CLI

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

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

但在输出中找不到 ARN。

如果在您的用例中可能的话,您可以通过了解区域、账户 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"
      }
    ]
  }
]

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


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

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。这会生成响应的彩色 table 表示。这通常对于 return 小数据集或已过滤数据的命令最有用。

现在进入--query。这个看起来很长,其实很简单。第一部分是Reservations[].Instances[]。此 return 是所有 returned 实例的扁平化列表。

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

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

您想要的 table 完全取决于您。例如,如果您想添加 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  |
+--------------------------------------------------+-----------+---------------+----------+------------+

很容易更改以适应您想要的特定细节,并且不需要您安装额外的工具。