異なるリージョン間でインスタンスを頻繁に切り替えます。別のリージョンから実行中のインスタンスをオフにするのを忘れることがあります。Amazonコンソールで実行中のすべてのインスタンスを表示する方法が見つかりませんでした。
リージョンに関係なく、実行中のすべてのインスタンスを表示する方法はありますか?
Resource Groups > Tag Editor
、GUIオプションとして使用できます。以下の私の答えを参照してください。
異なるリージョン間でインスタンスを頻繁に切り替えます。別のリージョンから実行中のインスタンスをオフにするのを忘れることがあります。Amazonコンソールで実行中のすべてのインスタンスを表示する方法が見つかりませんでした。
リージョンに関係なく、実行中のすべてのインスタンスを表示する方法はありますか?
Resource Groups > Tag Editor
、GUIオプションとして使用できます。以下の私の答えを参照してください。
回答:
非自明なGUIオプションはResource Groups > Tag Editor
です。ここでは、インスタンスにタグが付けられていなくても、すべてのリージョンのすべてのインスタンスを見つけることができます。
編集:この画面は最近再設計され、新しい外観と「すべての地域」オプションが追加されました。
現在、AWS GUIでこれを行うことはできないと思います。ただし、AWS CLIを使用してすべてのリージョンのすべてのインスタンスを一覧表示する方法を次に示します。
for region in `aws ec2 describe-regions --region us-east-1 --output text | cut -f4`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region
done
ここから撮影(完全な議論を見たい場合)
また、
地域を指定する必要があります。「aws configure」を実行して地域を設定することもできます
あなたがそうすることができaws configure set region us-east-1
、コメントに感謝@Sabuncuを。
更新
これで(2019年に)、4番目のフィールドにカットコマンドを適用する必要があります。 cut -f4
cut
、あなたが使用することができます:aws ec2 describe-regions --query Regions[*].[RegionName] --output text
FOR /F %G IN ('aws ec2 describe-regions --query Regions[*].[RegionName] --output text') DO (aws ec2 describe-instances --region %G)
You must specify a region. You can also configure your region by running "aws configure".
リージョンを指定することは、私がやりたいことの反対であるようです
aws configure set region us-east-1
。その後、を実行するとaws ec2 describe-regions
、問題は発生しません。回答:stackoverflow.com/a/46577479/360840、および関連する質問の下の他の回答を参照してください。
@imTachuソリューションはうまく機能します。AWSコンソールからこれを行うには...
最初にAWSマネジメントコンソールに移動し、リソースグループをクリックします。
次に、を見つけNetwork and Content Delivery
てクリックしますVPC
。
次に、実行中のインスタンスを見つけて展開し、すべてのリージョンを表示します。ここでは、すべてのリージョンの実行中のインスタンスをすべて見つけることができます。
コンソールで
VPCダッシュボードhttps://console.aws.amazon.com/vpc/home
に移動し、Running instances
-> をクリックしますSee all regions
。
CLIで
たとえば、これをに追加し.bashrc
ます。それをリロードしてsource ~/.bashrc
実行してください
function aws.print-all-instances() {
REGIONS=`aws ec2 describe-regions --region us-east-1 --output text --query Regions[*].[RegionName]`
for REGION in $REGIONS
do
echo -e "\nInstances in '$REGION'..";
aws ec2 describe-instances --region $REGION | \
jq '.Reservations[].Instances[] | "EC2: \(.InstanceId): \(.State.Name)"'
done
}
出力例:
$ aws.print-all-instances
Listing Instances in region: 'eu-north-1'..
"EC2: i-0548d1de00c39f923: terminated"
"EC2: i-0fadd093234a1c21d: running"
Listing Instances in region: 'ap-south-1'..
Listing Instances in region: 'eu-west-3'..
Listing Instances in region: 'eu-west-2'..
Listing Instances in region: 'eu-west-1'..
Listing Instances in region: 'ap-northeast-2'..
Listing Instances in region: 'ap-northeast-1'..
Listing Instances in region: 'sa-east-1'..
Listing Instances in region: 'ca-central-1'..
Listing Instances in region: 'ap-southeast-1'..
Listing Instances in region: 'ap-southeast-2'..
Listing Instances in region: 'eu-central-1'..
Listing Instances in region: 'us-east-1'..
Listing Instances in region: 'us-east-2'..
Listing Instances in region: 'us-west-1'..
Listing Instances in region: 'us-west-2'..
リソースを作成するたびに、名前にタグを付けると、リソースグループを使用して、すべてのリージョンで名前タグが付いたすべてのタイプのリソースを検索できます。
imTachusの回答に基づいていますが、詳細度は低く、さらに高速です。jqとaws-cliをインストールする必要があります。
set +m
for region in $(aws ec2 describe-regions --query "Regions[*].[RegionName]" --output text); do
aws ec2 describe-instances --region "$region" | jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}" &
done; wait; set -m
スクリプトは、aws ec2 describe-instances
各リージョン(現在は15!)に対して並行してを実行し、json出力から関連するビット(状態、タグ、アベイラビリティーゾーン)のみを抽出します。これset +m
は、開始/終了時にバックグラウンドプロセスがレポートしないようにするために必要です。
出力例:
{
"type": "t2.micro",
"state": "stopped",
"tags": [
{
"Key": "Name",
"Value": "MyEc2WebServer"
},
],
"zone": "eu-central-1b"
}
DescribeInstances()
すべてのリージョンにまたがることができます。
さらに、次のことができます。
NodeJSのサンプル:
var regionNames = ['us-west-1'、 'us-west-2'、 'us-east-1'、 'eu-west-1'、 'eu-central-1'、 'sa-east-1 '、' ap-southeast-1 '、' ap-southeast-2 '、' ap-northeast-1 '、' ap-northeast-2 ']; regionNames.forEach(function(region){ getInstances(region); });
getInstances
関数で呼び出すDescribeInstances()
ことができます。function getInstances(region){ EC2.describeInstances(params、function(err、data){ if(err)return console.log( "AWSへの接続エラー、そのようなインスタンスは見つかりませんでした!"); data.Reservations.forEach(function(reservation){ //意図した操作を行います }); }
そしてもちろん、ES6以降を自由に使用してください。
私はラムダ関数を作成して、すべてのインスタンスを任意の状態(実行、停止)で、任意のリージョンから取得します。また、インスタンスタイプやその他のさまざまなパラメーターの詳細も提供します。
スクリプトはすべてのAWSリージョンで実行さDescribeInstances()
れ、インスタンスを取得するためにを呼び出し ます。
あなただけのランタイムでラムダ関数を作成する必要がありますnodejs
。APIを作成して、必要に応じて使用することもできます。
さらに、AWS公式のDescribeInstances For Docsを参照して、さらに多くのオプションを探索できます。
すべてのAWSインスタンスを一覧表示するのに役立つオープンソーススクリプトを作成しました。https://github.com/Appnroll/aws-ec2-instances
これは、jq
json解析に使用してインスタンスをpostgreSQLデータベースに記録する1つのプロファイルのインスタンスをリストするスクリプトの一部です。
DATABASE="aws_instances"
TABLE_NAME="aws_ec2"
SAVED_FIELDS="state, name, type, instance_id, public_ip, launch_time, region, profile, publicdnsname"
# collects the regions to display them in the end of script
REGIONS_WITH_INSTANCES=""
for region in `aws ec2 describe-regions --output text | cut -f3`
do
# this mappping depends on describe-instances command output
INSTANCE_ATTRIBUTES="{
state: .State.Name,
name: .KeyName, type: .InstanceType,
instance_id: .InstanceId,
public_ip: .NetworkInterfaces[0].Association.PublicIp,
launch_time: .LaunchTime,
\"region\": \"$region\",
\"profile\": \"$AWS_PROFILE\",
publicdnsname: .PublicDnsName
}"
echo -e "\nListing AWS EC2 Instances in region:'$region'..."
JSON=".Reservations[] | ( .Instances[] | $INSTANCE_ATTRIBUTES)"
INSTANCE_JSON=$(aws ec2 describe-instances --region $region)
if echo $INSTANCE_JSON | jq empty; then
# "Parsed JSON successfully and got something other than false/null"
OUT="$(echo $INSTANCE_JSON | jq $JSON)"
# check if empty
if [[ ! -z "$OUT" ]] then
for row in $(echo "${OUT}" | jq -c "." ); do
psql -c "INSERT INTO $TABLE_NAME($SAVED_FIELDS) SELECT $SAVED_FIELDS from json_populate_record(NULL::$TABLE_NAME, '${row}') ON CONFLICT (instance_id)
DO UPDATE
SET state = EXCLUDED.state,
name = EXCLUDED.name,
type = EXCLUDED.type,
launch_time = EXCLUDED.launch_time,
public_ip = EXCLUDED.public_ip,
profile = EXCLUDED.profile,
region = EXCLUDED.region,
publicdnsname = EXCLUDED.publicdnsname
" -d $DATABASE
done
REGIONS_WITH_INSTANCES+="\n$region"
else
echo "No instances"
fi
else
echo "Failed to parse JSON, or got false/null"
fi
done
この投稿や他の場所からのさまざまなヒントに基づいた以下の私のスクリプト。スクリプトは、長いコマンドラインよりも(少なくとも私にとっては)従うのが簡単です。
スクリプトは、資格情報プロファイルが~/.aws/credentials
次のようなファイルに保存されていることを前提としています。
[default]
aws_access_key_id = foobar
aws_secret_access_key = foobar
[work]
aws_access_key_id = foobar
aws_secret_access_key = foobar
脚本:
#!/usr/bin/env bash
#------------------------------------#
# Script to display AWS EC2 machines #
#------------------------------------#
# NOTES:
# o Requires 'awscli' tools (for ex. on MacOS: $ brew install awscli)
# o AWS output is tabbed - we convert to spaces via 'column' command
#~~~~~~~~~~~~~~~~~~~~#
# Assemble variables #
#~~~~~~~~~~~~~~~~~~~~#
regions=$(aws ec2 describe-regions --output text | cut -f4 | sort)
query_mach='Reservations[].Instances[]'
query_flds='PrivateIpAddress,InstanceId,InstanceType'
query_tags='Tags[?Key==`Name`].Value[]'
query_full="$query_mach.[$query_flds,$query_tags]"
#~~~~~~~~~~~~~~~~~~~~~~~~#
# Output AWS information #
#~~~~~~~~~~~~~~~~~~~~~~~~#
# Iterate through credentials profiles
for profile in 'default' 'work'; do
# Print profile header
echo -e "\n"
echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo -e "Credentials profile:'$profile'..."
echo -e "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
# Iterate through all regions
for region in $regions; do
# Print region header
echo -e "\n"
echo -e "Region: $region..."
echo -e "--------------------------------------------------------------"
# Output items for the region
aws ec2 describe-instances \
--profile $profile \
--region $region \
--query $query_full \
--output text \
| sed 's/None$/None\n/' \
| sed '$!N;s/\n/ /' \
| column -t -s $'\t'
done
done
ジョブを並行して実行し、複数のプロファイルを使用するには、このスクリプトを使用します。
#!/ bin / bash プロファイル1プロファイル2のi 行う OWNER_ID = `aws iam get-user --profile $ i --output text | awk -F ':' '{print $ 5}' ` tput setaf 2; echo "Profile:$ i"; tput sgr0 tput setaf 2; echo "OwnerID:$ OWNER_ID"; tput sgr0 `aws --profile $ i ec2 describe-regions --output text | カット-f4` 行う tput setaf 1; echo "リージョン$ regionのインスタンスの一覧表示"; tput sgr0 aws ec2 describe-instances --query 'Reservations [*]。Instances [*]。[Tags [?Key == `Name`] .Value、InstanceId]' --profile $ i --region $ region --output text 完了& できた 待つ
スクリーンショット:
@hansaplastコードに基づいて、引数として複数のプロファイルをサポートするWindows対応バージョンを作成しました。そのファイルをcmdまたはbatファイルとして保存するだけです。また、jq
コマンドが必要です。
@echo off
setlocal enableDelayedExpansion
set PROFILE=%1
IF "%1"=="" (SET PROFILE=default)
echo checkin instances in all regions for %PROFILE% account
FOR /F "tokens=* USEBACKQ" %%F IN (`aws ec2 describe-regions --query Regions[*].[RegionName] --output text --profile %PROFILE%`) DO (
echo === region: %%F
aws ec2 describe-instances --region %%F --profile %PROFILE%| jq ".Reservations[].Instances[] | {type: .InstanceType, state: .State.Name, tags: .Tags, zone: .Placement.AvailabilityZone}"
)
クラウドリソースを列挙するために設計されたCLIツールを使用できます(クロスリージョンおよびクロスアカウントスキャン)-https://github.com/scopely-devops/skew
短い設定の後、次のコードを使用して、すべてのUS AWSリージョンのすべてのインスタンスをリストできます(123456789012がAWSアカウント番号であると想定)。
from skew import scan
arn = scan('arn:aws:ec2:us-*:123456789012:instance/*')
for resource in arn:
print(resource.data)