使用 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 |
+--------------------------------------------------+-----------+---------------+----------+------------+
很容易更改以适应您想要的特定细节,并且不需要您安装额外的工具。
我想获取某个区域中所有实例的简单列表,每条记录应包含实例的 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 |
+--------------------------------------------------+-----------+---------------+----------+------------+
很容易更改以适应您想要的特定细节,并且不需要您安装额外的工具。