Aws-cli: 如何描述来自所有区域的实例?

创建于 2016-02-08  ·  17评论  ·  资料来源: aws/aws-cli

我正在尝试将我的工作流程从 aws 控制面板切换到 cli,但我遇到了一个非常奇怪的问题。 我知道如何描述一个区域内的实例,但是如何描述我的所有实例而不考虑区域? 或者至少获得所有 ec2 区域的输出,这样我就可以以编程方式一个一个地执行此操作(例如aws ec2 list-regions )。

这很奇怪,因为 cli 似乎使用与控制面板不同的区域名称。 一方面,显然我的所有实例都在“us-west-2”区域启动(至少到目前为止),但我在控制面板的任何地方都找不到该字符串。 事实上,我似乎根本找不到任何列出我的默认区域的地方。

aws 内部是否有执行此操作的命令?

最有用的评论

对于从 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

所有17条评论

控制台不允许您列出所有实例而不考虑区域,但它确实使用更具描述性的文本隐藏了区域标识符。 us-west-2是位于俄勒冈州的数据中心。 控制台页面右上角有一个下拉菜单,可让您选择一个区域(如下图所示)。

对于大多数服务,目前还没有发现哪些区域可用的编程方式,因此您需要参考此列表。 然而,EC2 是例外之一,因为它提供了describe-regions函数。 由于 CLI 是服务 API 的包装器,因此我们无法进行多区域搜索,除非服务支持它(例如,S3 主要与区域无关)。 您必须为该地区提供--region参数才能在不同的地区进行查询。

您的默认区域位于您的配置文件中(在 UNIX 系统上~/.aws/config ),并且可以使用aws configure命令显示和设置。

regions

对于从 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

!/bin/bash

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

!/bin/bash

echo 全区抢实例,请稍候..
aws ec2 describe-regions --output text | cut -f3

aws ec2 describe-instances --region $region --query 'Reservations[].Instances[].[State.Name,InstanceType,PublicIpAddress,Placement.AvailabilityZone]' --输出文本
完毕

- - - 输出 - - - -

./get-instances.sh

正在抓取所有区域的实例,请稍候..

运行 t2.micro 54.93.120.174 eu-central-1b

运行 t2.micro 54.86.91.202 us-east-1d

对于那些也不想用你的眼球来解析 JSON 的人,这里有一个使用jq的附加版本来给你一个更

aws cli 支持“查询”参数,该

谢谢欧比扬! 几个月前我开始使用 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
完毕

image

此页面是否有帮助?
0 / 5 - 0 等级