ワークフローをawsコントロールパネルからCLIに切り替えようとしていますが、非常に奇妙な問題が発生しました。 リージョン内のインスタンスを説明する方法は知っていますが、リージョンに関係なくすべてのインスタンスを説明するにはどうすればよいですか? または、少なくともすべてのec2リージョンの出力を取得して、これをプログラムで1つずつ実行できるようにします(つまり、 aws ec2 list-regions
ようなもの)。
cliはコントロールパネルとは異なる名前をリージョンに使用しているように見えるため、これは非常に奇妙です。 1つは、すべてのインスタンスがリージョン「us-west-2」で開始されているようですが(少なくともこれまでのところ)、コントロールパネルのどこにもその文字列が見つかりません。 実際、デフォルトの地域をリストしている場所はまったく見つからないようです。
これを行うaws内のコマンドはありますか?
コンソールでは、リージョンに関係なくすべてのインスタンスを一覧表示することはできませんが、リージョン識別子をより説明的なテキストで非表示にします。 たとえば、 us-west-2
は、オレゴンにあるデータセンターです。 コンソールページの右上に、リージョンを選択できるドロップダウンがあります(下の図を参照)。
ほとんどのサービスでは、現在、利用可能な地域をプログラムで検出する方法がないため、このリストを参照する必要があります。 ただし、EC2はdescribe-regions
関数を提供するため、例外の1つです。 CLIはサービスAPIのラッパーであるため、サービスがCLIをサポートしていない限り、マルチリージョン検索を実行することはできません(たとえば、S3はほとんどリージョンに依存しません)。 別のリージョンでクエリを実行するには、リージョンに--region
引数を指定する必要があります。
デフォルトのリージョンは構成ファイル(UNIXシステムでは~/.aws/config
)にあり、 aws configure
コマンドで表示および設定できます。
Googleからここに到着する人のために、AWS CLIを使用してすべてのリージョンのすべてのインスタンスを一覧表示する1つの方法を次に示します(上記の説明に基づく)。
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region
done
JSONを目で解析したくないという方のために、 jqを使用して次に示します。
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, type: .InstanceType, key: .KeyName})'
done
出力例:
Listing Instances in region:'us-west-1'...
{
"state": "stopped",
"name": "scanner-1",
"type": "t2.micro",
"key": "scan1"
}
{
"state": "stopped",
"name": "cors",
"type": "t2.micro",
"key": "cors"
}
{
"state": "stopped",
"name": "scanner-2",
"type": "t2.medium",
"key": "scan2"
}
@nonbeingニース! これを頻繁に使用する場合は、エイリアスにすることを検討してください。
もう1つのオプションは、Linux、Mac、およびWindowsでネイティブに実行されるAWS PowerShell .NETCoreモジュールを使用することです。
foreach ($Region in (Get-AWSRegion)) {
Get-EC2Instance -Region $Region.Region
}
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
GroupNames : {}
Groups : {}
Instances : {asdf}
OwnerId : 123
RequesterId : 123
ReservationId : r-asdf
デフォルトでは、AWS PowerShellモジュールの現在のバージョンでは、EC2インスタンスはPowerShellの「リスト」形式で返されます。 ただし、これはFormat-Table
コマンドを使用して、表形式に簡単に変更できます。
$InstanceList = @()
foreach ($Region in (Get-AWSRegion)) {
$InstanceList += Get-EC2Instance -Region $Region.Region -ProfileName CIDBTest
}
$InstanceList | Format-Table
GroupNames Groups Instances OwnerId RequesterId ReservationId RunningInstance
---------- ------ --------- ------- ----------- ------------- ---------------
{} {} {asdf222} 123 123 r-123 {asdf222}
{} {} {asdf222} 123 123 r-123 {asdf222}
{} {} {asdf222} 123 123 r-123 {asdf222}
依存関係を追加したい場合は、 jq
使用するか、AWSCLIに組み込まれている--query
を使用することができます。
aws --profile whatever ec2 describe-instances --query 'Reservations[].Instances[].[State.Name,InstanceType]'
[
[
"running",
"t2.small"
],
[
"running",
"t2.small"
],
[
"running",
"m3.medium"
]
]
読み取り中-rr;エコー開始領域:$ r; -riを読みながら行う; instance-idをエコーします:$ i 2>&1;完了<<(aws ec2 describe-instances --query "Reservations []。Instances []。InstanceId"-region $ r --profile prd | perl -nl -e's / \ s + / \ n / g; print '); echo "停止領域:$ r";完了<<(aws ec2 describe-regions --output text --profile prd | cut -f 3)
for region in `aws ec2 describe-regions --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region | jq '.Reservations[] | ( .Instances[] | {state: .State.Name, name: .KeyName, Tag_Name: .Tags[].Value,type: .InstanceType, key: .KeyName})'
done
私が書いたちょうど別の解決策!
この小さなスクリプトは、すべてのリージョンでコマンドを実行できます
使用例:
sudo ./aws-x.sh ec2 describe-instances
sudo ./aws-x.sh ec2 describe-instances | grep PrivateDnsName
echo "AWSの利用可能なリージョンの取得:"
sudo aws ec2 describe-regions --region eu-west-2 | grep RegionName | cut -d '"' -f 4> /tmp/regions.txt
cat /tmp/regions.txt
領域の読み取り中。 行う
echo "Executing" $ @ "on" $ region ":"
aws --region $ region $ @
終わり
rm /tmp/regions.txt
エコーすべてのリージョンでインスタンスを取得します。しばらくお待ちください。
aws ec2 describe-regions --output text | cut -f3
地域の場合
行う
aws ec2 describe-instances --region $ region --query'Reservations []。Instances []。[State.Name、InstanceType、PublicIpAddress、Placement.AvailabilityZone] '--output text
終わり
aws cliは「query」パラメーターをサポートします。これは、このようなことをビルトインとして
ありがとうobijan! IIは数ヶ月前にjqを使い始め、それが私の人生を変えました:)
AWS Cli Docsは、より高度な使用法としてJQを推奨していることに注意してください。
--queryでは不可能な高度な機能が必要な場合は、コマンドラインJSONプロセッサであるjqを確認できます。 ダウンロードして、 http: //stedolan.github.io/jq/で公式チュートリアルを見つけることができます。
IMHO、 --query
は、AWS CLIでネイティブにサポートされているため、クエリのユースケースで機能するかどうかを確認する価値があります。 このオプションは、 2013/10/18にリリースされたaws cliv。1.2.0で追加されたため、古いバージョンのCLIを使用していない限り、このオプションを必ず使用する必要があります。
--query
パラメータを使用する場合は、クエリ言語としてチュートリアルも一見の価値があります。
次のクエリは、aws cliを使用してデフォルトリージョンのRDSインスタンスを一覧表示し、JQとJMESPathを使用してそこからのjson出力を解析します
たとえば、同様のクエリは、JMESPathではるかに読みやすいOOTBのようです。
# Using Jquery
aws rds describe-db-instances --output json | jq -r '.DBInstances[] | "\(.DBInstanceIdentifier) -> \(.DBInstanceStatus) ( \(.DBInstanceClass), \(.Endpoint.Address):\(.Endpoint.Port) ) " '
## Outputs
someinstancename -> available ( db.t2.small, xxxxx.rds.amazonaws.com:1234 )
## Show a list of properties for DBInstances which have a status containing the word 'avail'
aws rds describe-db-instances --output json --query "DBInstances[?contains(DBInstanceStatus, 'avail')].[DBInstanceIdentifier, DBInstanceClass, DBInstanceStatus, Endpoint.[Address, Port]]"
## Outputs
[
[
"someinstancename",
"db.t2.small",
"available",
[
"xxxxx.rds.amazonaws.com",
1234
]
]
]
場合はopt-in-not-required
あなたが実行したときの出力の第3列はaws ec2 describe-regions --output text
、あなたが変更することができますcut -f3
にcut -f4
それほどなどを:
for region in `aws ec2 describe-regions --output text | cut -f4`
do
done
おそらく、より堅牢な方法は、次のようにJMESPathクエリを使用することです。
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text)
do
done
grep
を使用して、さらに解析を実行して、必要な領域にフィルターをかけることもできます。
たとえば、 awscli-aliasesをインストールした後、以下を~/.aws/cli/alias
に追加して、インスタンスを一覧表示します。
list-instances =
!f() {
echo "Filtering by \`$1\`"
for region in $(aws ec2 describe-regions --query "Regions[*].RegionName" --output text | tr "\t" "\n" | grep "$1")
do
echo "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region \
--output table \
--query "Reservations[*].Instances[*].{
Instance:InstanceId,
Type:InstanceType,
AZ:Placement.AvailabilityZone,
KeyName:KeyName,
Name:Tags[?Key==\`Name\`]|[0].Value,
Project:Tags[?Key==\`project\`]|[0].Value,
IP:PublicIpAddress,
State:State.Name,
CPUcores:CpuOptions.CoreCount,
CPUThreads:CpuOptions.ThreadsPerCore
}"
done
}; f
使用法:
$ aws list-instances
リージョンコードにフィルタを適用します。たとえば、米国のリージョンの場合はus
です。
$ aws list-instances 'us'
aws ec2 describe-regions --output text | cut -f3
地域の場合
行う
echo -e "\ nリージョン内のインスタンスを一覧表示します: '$ region' ..."
aws ec2 describe-instances --region $ region | grep running> file.txt
cat file.txt | wc -l
終わり
最も参考になるコメント
Googleからここに到着する人のために、AWS CLIを使用してすべてのリージョンのすべてのインスタンスを一覧表示する1つの方法を次に示します(上記の説明に基づく)。