2017-01-27 48 views

回答

5

你可以构建ARN如果有可能在你的使用情况通过了解该地区,帐户ID +实例ID:

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" 
     } 
    ] 
    } 
] 
+0

是的,我知道,但我不想手动构造它。 – dimid

+0

@dimid:更新以显示如何使用jq构建它:https://stedolan.github.io/jq/ –

+0

谢谢!有没有办法重复这个地区?顺便说一句,我还会添加标签 'aws ec2 describe-instances --region us-east-1 | jq -r'。保留[] | .OwnerId作为$ OwnerId | (.Instances [] | {“ARN”:“arn:aws:ec2:us-east-1:\($ OwnerId):instance/\(。InstanceId)”,“AvailabilityZone”:“\(。Placement.AvailabilityZone )“,InstanceId,PublicDnsName,PrivateDnsName,Tags})' – dimid

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查询。其中大部分非常简单,但Name稍微复杂一些。

完整查询获得NameTags[?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 | 
+--------------------------------------------------+-----------+---------------+----------+------------+ 

这是很容易改变,以适应您想要的具体细节并没有按不要求你安装额外的工具。

+1

+1。我看着使用'--query'标准,但没有看到任何输出ARN的方式可以完全从响应中完成,而不需要连接到'jq',因为它似乎需要可变支持。这个可以用'--query'标准完成的例子将是这个答案的一个很好的补充。 –