特定のVPCでaws cliを使用して、タグ名、インスタンスのプライベートIPアドレス、およびインスタンスIDを使用してインスタンスをリストするにはどうしますか?


19

最も近い方法は、次のコマンドを使用することです。

このコマンドは、インスタンスのすべての名前をリストします。

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value[]'

このコマンドは、私が必要としないすべてのプライベートIPアドレス、インスタンスID、およびすべてのタグをリストします。名前だけが必要です。

aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-e2f17e8b | jq '.Reservations[].Instances[] | {PrivateIpAddress, InstanceId, Tags}'

この方法でコマンドを実行できない理由がわかりません:

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags[?Key==`Name`].Value[]'

このコマンドは機能しますが、すべてのタグキー名が表示されます。

aws ec2 describe-instances | jq '.["Reservations"]|.[]|.Instances|.[]|.PrivateIpAddress + " " + .InstanceId + " " + .Tags'

1
これらのコマンドの動作を理解しようとせずに、どこかからこれらのコマンドをコピーするだけですか?
マイケルハンプトン

そうではありませんが、jqの使用方法と、必要な基本的なjson出力を取得する方法を理解しようとしました。しかし、私が達成しようとしていることの例は見つかりませんでした。Nameキー名値出力のフィルターとして「Tags [?Key == ] .Value []」を使用できるのは、aws-cli v1.3.0以降のみです。そして、--filterとjqの組み合わせを使用して、必要な出力を取得しています。最も近いコマンドはaws ec2 describe-instances --filters Name = vpc-id、Values = vpc-e2f17e8b | jq '.Reservations []。Instances [] | {PrivateIpAddress、InstanceId、Tags} 'jqを使用してTag Key = Nameを参照する方法を知る必要があります。
イマジニア14年

回答:


24

答えを正しくフォーマットするには、バックスラッシュをエスケープする必要があります。

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

だから、これはあなたが望む実際のコマンドです:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2

そして、あなたは必要ありません.Value[]。を使用するだけで.Value、同じ出力が得られます。

ところで、これは素晴らしいです。これを自分で実装します!

修正:の値.Valueが「なし」の場合、上記は機能しません。これはうまく機能します:

$ aws ec2 describe-instances --filters Name=vpc-id,Values=vpc-ac973bc9 --query 'Reservations[].Instances[].[PrivateIpAddress,InstanceId,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /'
10.101.255.10   i-91efd39b Server1
10.101.255.9    i-f1e8d4fb Server2
10.101.255.8    i-f6c2450a      None
10.101.255.7    i-34a6afce Server3

sedコマンドについて説明してもらえますか?sedでの間接的なシェル展開を理解していないために、インスタンスID /名前を1つずつ取得しています。
ヨルフス

3
インスタンスに名前が付けられていない場合(Tag:key = Nameが設定されていない場合)、次のインスタンスが同じ行に出力されます。最初のsedコマンドは、文字列「None \ n」を出力してその問題を軽減します。2番目のsedコマンドは、インスタンスIDから改行を取り除き、Tag:key = Name文字列が同じ行に出力されるようにします。
-DrStrangepork

8

これを試して

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,Tags[?Key==`Name`].Value|[0],State.Name,PrivateIpAddress,PublicIpAddress]' --output text | column -t

3
コードの説明を含める必要があります。このコードが問題を解決する方法と理由を説明することは、OPや他の読者がこの問題や同様の問題を自分で解決するのに役立つため、より便利です。
アンソニーG-モニカの正義

これは機能しますが、実際、なぜ機能するのですか?|なんらかのフィルターですか?
aairey

7

上記の答えは問題ありませんが、私のお気に入りは同じです。

aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t

実際、BASH関数リストリストに配置できます。

awsls () { aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name,InstanceType,PrivateIpAddress,PublicIpAddress,Tags[?Key==`Name`].Value[]]' --output json | tr -d '\n[] "' | perl -pe 's/i-/\ni-/g' | tr ',' '\t' | sed -e 's/null/None/g' | grep '^i-' | column -t }

次に、プロンプトから「awsls」として呼び出します


1つのファイルに複数の関数を追加して、必要な関数を呼び出すにはどうすればよいですか?
ストライカー

2

このようなもの?

aws ec2 describe-instances --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed '$!N;s/\n/ /'

1

インスタンス状態「running」にフィルターを追加しました。誰にとっても役立つ場合は、ここに投稿してください。

私のユースケースはわずかに異なり、Ansibleホストファイルを生成しているので、実行中のすべてのホストでプライベートIP#名が必要です。

aws ec2 describe-instances --profile=$PROFILE --filters Name=vpc-id,Values=$VPCID Name=instance-state-name,Values=running --query 'Reservations[].Instances[].[PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output text | sed 's/None$/None\n/' | sed '$!N;s/\n/ /' | awk '{print $1 " #" $2 }'

0

インスタンス情報を取得する方法を検索するときにこの投稿を見つける人々のためにこれを追加します。selectステートメントにVPCを追加して、それを受け取ることもできます。

PowerShellでは、次を使用できます。

(Get-EC2Instance -ProfileName Profile).Instances | select InstanceId,PrivateIPAddress,PublicIpAddress @{Name="Servername";Expression={$_.tags | where key -eq "Name" | select Value -expand Value}} | Format-Table.

AWS CLIでは、次を使用できます。

aws ec2 describe-instances --region=us-east-1 --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==Name].Value|[0],PrivateIpAddress,PublicIpAddress]' --output text --profile ProfileName

回答を編集して、コマンドをコマンド/コードとしてフォーマットしました。最初のコマンドの最後のピリオドが必要であることを再確認してください。ない場合は、感謝を編集、それを喜ば
JimLohse
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.