我正在尝试将我的工作流程从 aws 控制面板切换到 cli,但我遇到了一个非常奇怪的问题。 我知道如何描述一个区域内的实例,但是如何描述我的所有实例而不考虑区域? 或者至少获得所有 ec2 区域的输出,这样我就可以以编程方式一个一个地执行此操作(例如aws ec2 list-regions
)。
这很奇怪,因为 cli 似乎使用与控制面板不同的区域名称。 一方面,显然我的所有实例都在“us-west-2”区域启动(至少到目前为止),但我在控制面板的任何地方都找不到该字符串。 事实上,我似乎根本找不到任何列出我的默认区域的地方。
aws 内部是否有执行此操作的命令?
控制台不允许您列出所有实例而不考虑区域,但它确实使用更具描述性的文本隐藏了区域标识符。 us-west-2
是位于俄勒冈州的数据中心。 控制台页面右上角有一个下拉菜单,可让您选择一个区域(如下图所示)。
对于大多数服务,目前还没有发现哪些区域可用的编程方式,因此您需要参考此列表。 然而,EC2 是例外之一,因为它提供了describe-regions
函数。 由于 CLI 是服务 API 的包装器,因此我们无法进行多区域搜索,除非服务支持它(例如,S3 主要与区域无关)。 您必须为该地区提供--region
参数才能在不同的地区进行查询。
您的默认区域位于您的配置文件中(在 UNIX 系统上~/.aws/config
),并且可以使用aws configure
命令显示和设置。
对于从 Google 来到这里的人,这是使用 AWS CLI 列出所有区域中所有实例的一种方法(基于上面的讨论):
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不错! 如果您经常使用它,您应该考虑将其设为 alias 。
另一种选择是使用 AWS PowerShell .NET Core 模块,该模块在 Linux、Mac 和 Windows 上本机运行。
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
,或者只使用 AWS CLI 中内置的--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 ; 做 echo instance-id: $i 2>&1 ; done < <(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 描述实例
sudo ./aws-x.sh ec2 描述实例 | grep PrivateDnsName
echo "获取 AWS 可用区域:"
sudo aws ec2 describe-regions --region eu-west-2 |grep RegionName |cut -d '"' -f 4 > /tmp/regions.txt
猫 /tmp/regions.txt
同时读取区域; 做
echo "在 "$region" 上执行 "$@":"
aws --region $region $@
完毕
rm /tmp/regions.txt
echo 全区抢实例,请稍候..
aws ec2 describe-regions --output text | cut -f3
做
aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --输出文本
完毕
对于那些也不想用你的眼球来解析 JSON 的人,这里有一个使用jq的附加版本来给你一个更
谢谢欧比扬! 几个月前我开始使用 jq,它改变了我的生活 :)
请注意, AWS Cli Docs仍然推荐 JQ 进行更高级的使用:
如果您需要使用 --query 可能无法实现的更高级功能,您可以查看 jq,一个命令行 JSON 处理器。 你可以下载它并在http://stedolan.github.io/jq/找到官方教程
恕我直言, --query
是否适用于您的查询用例仍然值得一看,因为 AWS CLI 本身就支持它。 此选项是在2013/10/18发布的aws cli v. 1.2.0 中添加的,因此除非您拥有 CLI 的旧版本,否则您绝对应该拥有此选项。
如果您更喜欢使用--query
参数,请注意它使用JMESPath作为其查询语言(主页有一个实时 JMESPath 测试器)。 该教程也值得一看。
以下查询使用 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
是运行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 描述实例 --region $region | grep 运行 > file.txt
猫文件.txt | wc -l
完毕
最有用的评论
对于从 Google 来到这里的人,这是使用 AWS CLI 列出所有区域中所有实例的一种方法(基于上面的讨论):