使用aws cli,最佳方法是确定当前区域是什么?

84

交互式地,我可以使用"aws configure"来更改或查看默认区域。是否有类似"pwd"的功能(无论是否记录),可以让我确定或确认当前脚本的区域?即使AWS_DEFAULT_REGION未定义? 我想要一个脚本在多个配置文件下运行。 我可以从aws configure list中抓取信息,但是有没有更简单的方法?


这个脚本在EC2上运行吗? - Mircea
不,Ubuntu不在AWS之外。 - mckenzm
11个回答

115

aws configure get region会在你的脚本中获取当前区域。

如果您使用配置文件,则输入aws configure get region --profile $PROFILE_NAME


22
这将返回配置文件中的区域信息,而不是您使用 aws cli 执行命令时所在的区域信息。(例如删除 ~/.aws/config 文件后,运行 aws configure get region 命令,会发现它为空(或者删除环境变量或其他 aws 配置设置的位置)。) - cgseller
1
很不幸,这并不总是有效的。例如,假设我的配置文件设置为eu-west-1,但我执行aws --region us-east-1 configure get region命令,则返回值为eu-west-1,即使使用aws --region us-east-1命令将在us-east-1区域上操作。 - Asfand Qazi
正确。我不知道有什么更好的方法。尝试接受的答案。 - user7401700
如果您需要更改当前cli会话的区域,请执行以下操作:aws configure set region us-east-1(将所需的区域替换为您想要的区域)。 - undefined

42

以下内容显示CLI实际使用的区域,而不管环境变量是否设置:

aws ec2 describe-availability-zones --output text --query 'AvailabilityZones[0].[RegionName]'
CLI将使用以下优先顺序确定要使用的区域:
  1. 命令行中的--region选项
  2. AWS_DEFAULT_REGION环境变量的值
  3. 指定在“当前配置文件”中的区域,该配置文件由以下优先顺序确定:
    • 命令行中的--profile选项
    • AWS_PROFILE环境变量的值
    • 否则配置文件为[default]
不幸的是,使用aws configure get region只会返回由您的“当前配置文件”指定的区域,并忽略AWS_DEFAULT_REGION环境变量。
与其假设任何优先顺序规则,您可以使用CLI进行实际的API调用并从结果中获取区域。我找到的唯一应该始终起作用的调用是aws ec2 describe-availability-zones。此方法的另一个优点是,您可以指定--region--profile选项,并仍然得到正确的答案。

1
如果我使用 --region 调用它,它只显示在该开关上传递的值,这是什么意思? - GaTechThomas
1
@GaTechThomas 你说得对:它只是返回区域。我同意这很琐碎,但在某种程度上有点用处,因为上述命令正确解释了你想要运行的实际命令所需的相同参数。如果你的脚本动态地组合命令,以至于你无法预测将提供哪些参数,那么这可能会很有用。 - John Rees

41

也许AWS没有提供获取当前区域的方法。但是,他们提供了通过实例元数据获取当前可用区的方法。所有可用区都包括一个当前区域,所以您可以在EC2实例上的脚本中替换当前可用区的一部分来确定当前区域。

例如:

curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/\(.*\)[a-z]/\1/'

13
使用AWS CLI,您可以使用 aws configure list | grep region 命令 - 这将考虑环境变量和 ~/.aws/config 文件。 - RichVel
顺带提一句,curl的示例在实例上很好,我正在寻找一个在CLI客户端上包含“片段”的bash示例。 - mckenzm
上述地址没有返回任何内容。获取区域应该不会这么难,因为 AWS CLI 将使用它。 - Paul S
2
如果无论如何使用元数据服务,自从NSR发布答案以来,已经添加了/latest/meta-data/placement/region - Ti Strga

19

取自 @RichVel 在这个答案中的评论,要获取从AWS_DEFAULT_REGION或AWS配置文件中的区域设置解析出的区域,请使用以下命令:

aws configure list | grep region | awk '{print $2}'

例子:

$AWS_DEFAULT_REGION未设置时:

$ echo $AWS_DEFAULT_REGION

$ cat ~/.aws/config
[foo]
region = us-east-1
$ aws configure list | grep region | awk '{print $2}'
us-east-1
$ aws configure get region
us-east-1

当设置$AWS_DEFAULT_REGION时:

$ export AWS_DEFAULT_REGION=us-west-2
$ echo $AWS_DEFAULT_REGION
us-west-2
$ cat ~/.aws/config
[foo]
region = us-east-1
$ aws configure list | grep region | awk '{print $2}'
us-west-2
$ aws configure get region
us-east-1

12

该地区位于以下位置:

curl http://169.254.169.254/latest/dynamic/instance-identity/document

所以...

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document|jq -r .region

不是在客户端机器上的CLI脚本内部工作。 这只在实例上起作用。 无论如何,谢谢。 - mckenzm
我不确定您确认当前区域设置的意图,但为什么不在脚本中设置AWS_DEFAULT_REGION并强制它成为您想要的呢?然后您可以确认它已经被设置。 - J Roysdon

12

aws configure get region很方便,但我希望能够在设置了AWS_DEFAULT_REGION后仍然知道区域信息。不幸的是,根据文档:

请注意,aws configure get仅查看AWS配置文件中的值。它不会解析任何其他地方指定的配置变量,包括环境变量、命令行参数等。

相反,假设您已经安装了Python和boto3,则可以运行:

python -c 'import boto3; print(boto3.Session().region_name)'

例如。

$ AWS_DEFAULT_REGION=us-east-1 python -c 'import boto3; print(boto3.Session().region_name)'
us-east-1

6

可以使用以下方法获取该区域:

curl -s http://169.254.169.254/latest/meta-data/placement/region

是的,这听起来很明显,但它告诉你“客户端”的区域。客户端可能是笔记本电脑。这在笔记本电脑上不起作用。最初问题的意图是测试给定脚本命令将应用于哪个区域。如今这变得更容易了。 - mckenzm

6
这篇文章是对Jeshan BabooaAlastair McCormack的回答进行完善,但他们的回答存在以下已知限制:
  • aws configure get region不能返回区域(region)如果该区域被环境变量AWS_DEFAULT_REGION定义。
  • boto3可能不总是可用,即使当它可用时,python -c 'import boto3; print(boto3.Session().region_name)'也能工作。
为了解决上述限制,请考虑在Bash中:
AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:-$(aws configure get region)}

如果可用,此处使用 AWS_DEFAULT_REGION 的值,否则使用 aws configure get region 的输出。

1
这似乎是一个足够好的答案,涵盖了大多数“善意”的设置。不确定它是否绝对万无一失,因为像.aws/config配置文件设置MFA,AWS SSO或环境变量AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY等可能会破坏逻辑。我没有测试过,但要确信我们已经覆盖了所有场景实在太令人费解了。最后,唯一万无一失的方法是使用Python boto3 测试(当然它也有自己的包袱)。 - Vincent Yin

2
如果您在.aws/config中为您的配置文件有区域信息,您可以按照以下步骤操作: .aws/config的示例(请注意,dev配置文件被称为profile dev)。profile一词是imporant
[default]
region = ap-southeast-2

[profile dev] 
region = us-east-1

然后使用命令行界面,你可以:
aws configure get profile.default.region

这里给出了 ap-southeast-2

aws configure get profile.dev.region

这给出了us-east-1


可能可以,但这有点死板。如果我小心地严格维护它,我也可以将当前区域存储在环境变量中。我的需求更多是“区域购物”,例如可用性起伏的情况。 - mckenzm

1

不确定这对你是否有用,但我来到这个页面寻求类似的建议。我经常在 AWS 配置文件之间切换,这些文件配置为使用不同的区域。在我的情况下,我正在使用的配置文件由一个环境变量 - AWS_PROFILE 控制。

为了获取当前区域,无论我使用哪个配置文件,我发现这个命令很有用:

aws configure get region --profile=$AWS_PROFILE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接