2017-01-27 72 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'標準完成的例子將是這個答案的一個很好的補充。 –