我经常在不同区域之间切换实例,有时我忘记关闭来自不同区域的运行实例。我找不到任何方法来查看亚马逊控制台上的所有正在运行的实例。 有没有办法显示所有正在运行的实例而不管区域?
我认为您目前无法在AWS GUI中执行此操作。但是这里有一种方法可以使用AWS CLI列出所有区域中的所有实例:
for region in `aws ec2 describe-regions --region us-east-1 --output text | cut -f3`
do
echo -e "\nListing Instances in region:'$region'..."
aws ec2 describe-instances --region $region
done
来自here(如果你想看到完整的讨论)
此外,如果你得到一个
您必须指定一个区域。您还可以通过运行“aws configure”来配置您的区域
您可以使用aws configure set region us-east-1
这样做,感谢@Sabuncu的评论。
基于@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
在简短配置之后,您可以使用以下代码列出所有美国AWS区域中的所有实例(假设您的AWS账号为123456789012)。
from skew import scan
arn = scan('arn:aws:ec2:us-*:123456789012:instance/*')
for resource in arn:
print(resource.data)
CRUD AWS resources的好工具。在所有地区找到[EC2 | RDS | IAM ..]。可以对过滤器结果进行操作(停止|运行|终止)。
python3 awsconsole.py ec2 all // return list of all instances
python3 awsconsole.py ec2 all -r eu-west-1
python3 awsconsole.py ec2 find -i i-0552e09b7a54fa2cf --[terminate|start|stop]
编辑:确保你使用Classic Tag Editor。新的重新设计的标签编辑器不再搜索跨区域。
一个非显而易见的GUI选项是Resource Groups > Tag Editor
,然后点击classic Tag Editor链接。在这里,您可以查找所有区域中的所有实例,即使实例未标记。
@imTachu解决方案效果很好。要通过AWS控制台执行此操作...
基于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("Error connecting to AWS, No Such Instance Found!"); data.Reservations.forEach(function(reservation) { //do any operation intended }); }
在Off Course中,随意使用ES6及以上版本。
我编写了一个lambda函数来获取任何状态[运行,停止]并且来自任何区域的所有实例,还将提供有关实例类型和各种其他参数的详细信息。
The Script遍布所有AWS区域并调用DescribeInstances()
来获取实例。
您只需要使用运行时nodejs
创建一个lambda函数。您甚至可以从中创建API并在需要时使用它。
此外,您可以查看AWS官方Docs for DescribeInstances以探索更多选项。
Network and Content Delivery
并点击VPC
:
我创建了一个开源脚本,可以帮助您列出所有AWS实例。 https://github.com/Appnroll/aws-ec2-instances
这是脚本的一部分,列出了一个配置文件的实例,将它们记录到postgreSQL数据库中,使用jq
进行json解析:
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 -f3 | 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