2017-01-27 9 views
2

特定の地域のすべてのインスタンスの単純なリストを取得したいと思います。各レコードには、インスタンス、ARN、インスタンス名が含まれていなければなりません。 私はAWS CLIを使用してインスタンスの名前とARNのリストを取得する

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

を使用してみましたが、出力のARNを見つけることができません。

答えて

5

それが地域、アカウント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の結果からこれを構築するのはかなり簡単です。

EDIT:あなたが探しているの出力を構築するために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 '.Reservations [] | .OwnerId as $ OwnerId | (InstanceId)」、「AvailabilityZone」:「\(。Plain.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 | 
+-----------+---------------+----------+------------+ 

今1枚ずつそれを破ることができます。まず、--output tableがあります。これにより、応答の色付き表が作成されます。これは一般に、小さなデータセットを返すコマンドやデータをフィルタリングした場所で最も有用です。

今すぐ--queryに。これは長く見えますが、実際は非常に簡単です。最初の部分はReservations[].Instances[]です。これは、返されたすべてのインスタンスのフラット化されたリストを返します。

クエリの次の部分は、.{}でカプセル化されています。これがしていることは、各値がソースオブジェクト(この例ではインスタンス)に適用されるJMESPathクエリであるリスト内の各項目の新しいjsonオブジェクトを作成することです。これらのほとんどは非常に単純ですが、Nameは少し複雑です。

Nameを取得する完全なクエリはTags[?Key == 'Name'].Value | [0]です。最初の部分であるTags[?Key == 'Name']は、インスタンスのタグでキーがNameのタグを検索しています。後半の.Value | [0]は、これらのタグのそれぞれの値を選択してから、最初の項目をリストから取り出します(この場合は1つだけです)。

あなたが望むのは、完全にあなた次第です。あなたが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 | 
+--------------------------------------------------+-----------+---------------+----------+------------+ 

あなたがしたい具体的な詳細に合うとdoesnのように変更するのは簡単です追加のツールをインストールする必要があります。

+1

+1。私は '--query'基準を見てみましたが、ARNを出力することは、可変サポートを必要としていたように、' jq'にパイプを張らずに応答からのみ達成することはできませんでした。これを '--query'基準でどのように行うことができるかの例は、この回答には非常に役立ちます。 –

関連する問題