Amazon AWS Command Line Tools を使用して、指定されたタグを持たないすべてのインスタンスを見つけようとしています。
タグ付きのすべてのインスタンスを見つけるのは簡単です。
ec2-describe-instances --filter "tag-key=Name"
しかし、そのフィルターを反転して、「名前」タグのないインスタンスのみを返すにはどうすればよいでしょうか?
Amazon AWS Command Line Tools を使用して、指定されたタグを持たないすべてのインスタンスを見つけようとしています。
タグ付きのすべてのインスタンスを見つけるのは簡単です。
ec2-describe-instances --filter "tag-key=Name"
しかし、そのフィルターを反転して、「名前」タグのないインスタンスのみを返すにはどうすればよいでしょうか?
これはあなたが求めていることを行います - 「YOUR_KEY_NAME_HERE」という名前のタグを含まないすべてのインスタンスを見つけます (「名前」という名前のタグのないインスタンスの 2 行目のフィルター):
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"} ]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"} ]}) | not)'
タグの名前ではなく、タグの値に対してフィルタリングする場合、このクエリは、値が EXCLUDE_ME である YOUR_KEY_NAME_HERE という名前のタグを含まないすべてのインスタンスを一覧表示します。(2 行目は、"testbox1" という名前ではないインスタンスを一覧表示します。)
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "YOUR_KEY_NAME_HERE"}, {Value: "EXCLUDE_ME"}]}) | not)'
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(contains({Tags: [{Key: "Name"}, {Value: "testbox1"}]}) | not)'
フェリペは正しい。AWS API はこの機能を提供しておらず、公式の AWS CLI も提供していないため、出力を解析することが唯一の方法です。JSON 出力は、特に古い CLI がデフォルトで出力する複数行のテキスト レコードと比較すると、非常に解析可能です。
http://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html
API 自体は JSON を返し、新しい awscli はその JSON をデフォルトの出力形式として出力します。「jq」プログラムはそれを解析するのに非常に便利で、端末に送信されたときに色付けすることもできます。また、テキストを出力して文字列に戻すこともできます。
残念ながら、基礎となる API 呼び出しのDescribeInstancesは逆タグ フィルタリングをサポートしていないため、CLI もサポートしていません。ただし、 JMESPath検索--query
を実行するパラメータを使用して、クライアント側のフィルタリングを実行できます。これにより、user2616321 の回答のようにパイプを使用する必要がなくなります。
例えば:
aws ec2 describe-instances --query "Reservations[].Instances[?Tags[?Key == 'Name']][]"
その末尾に追加.InstanceId
して、インスタンス ID を取得します。
私も、これを CLI 経由で行うのがいかに難しいかということに完全にショックを受けました。user2616321 の回答は気に入りましたが、インスタンスごとに必要な正確なフィールドを出力するのに少し問題がありました。クエリ構文で JMESPath をいじって失敗した後、これを行うための小さな Ruby スクリプトを作成するだけになりました。誰かが自分で書いて数分節約したい場合は、次のとおりです。
#!/usr/bin/env ruby
require 'json'
# We'll output any instance that doesn't contain all of these tags
desired_tags = if ARGV.empty?
%w(Name)
else
ARGV
end
# Put the keys we want to output per instance/reservation here
reservation_keys = %w(OwnerId RequesterId)
instance_keys = %w(Tags InstanceId InstanceType PublicDnsName LaunchTime PrivateIpAddress KeyName)
instances_without_tags = []
# Just use CLI here to avoid AWS dependencies
reservations = JSON.parse(
`aws ec2 describe-instances`
)["Reservations"]
# A reservation is a single call to spin up instances. You could potentially
# have more than one instance in a reservation, but often only one is
# spun up at a time, meaning there is a single instance per reservation.
reservations.each do |reservation|
reservation["Instances"].each do |instance|
# Filter instances without the desired tags
tag_keys = instance["Tags"].map { |t| t["Key"] }
unless (tag_keys & desired_tags).length == desired_tags.length
instances_without_tags <<
reservation.select { |k| reservation_keys.include?(k) }.
merge(instance.select { |k| instance_keys.include?(k) })
end
end
end
puts JSON.pretty_generate(instances_without_tags)
CLIから直接知る限り、それはできません。
使用している構文から、古い cli を使用していると推測できます。新しい CLI http://aws.amazon.com/cli/をダウンロードして呼び出すことをお勧めします。
aws ec2 describe-instances --output json
Python、Ruby、または任意のスクリプト言語から、必要に応じて適切な正規表現を使用して json 出力フィルタリングを解析することができます
あなたはいつでもこれを行うことができます:
ec2-describe-instances | grep -v "Name"
:p