我想获得某个区域中所有实例的简单列表,每条记录应包含id,ARN和实例名称。 我尝试过使用
ec2 describe-instances --region us-east-1
但在输出中找不到ARN。
答案 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 |
+--------------------------------------------------+-----------+---------------+----------+------------+
根据您想要的具体细节进行更改非常容易,并且不需要安装其他工具。