如何使用Boto3(Python)列出可用的区域

34

随着AWS的扩张和新增区域,我希望我的代码可以自动检测到。目前,“选择您的区域”是硬编码的,但我想仅对以下内容解析出RegionName

import boto3

ec2 = boto3.client('ec2')
regions = ec2.describe_regions()
print(regions)

我的输出是JSON格式的,如下所示:

{'Regions': [{'Endpoint': 'ec2.ap-south-1.amazonaws.com', 'RegionName': 'ap-south-1'}, {'Endpoint': 'ec2.eu-west-1.amazonaws.com', 'RegionName': 'eu-west-1'}, {'Endpoint': 'ec2.ap-southeast-1.amazonaws.com', 'RegionName': 'ap-southeast-1'}]}

出于空间原因,我已经删除了重复数据和ResponseMetadata。

如何将RegionName解析为列表?

2个回答

51
除了Frédéric的回答之外,您还可以在不进行任何服务调用的情况下获取每个服务的已知区域。然而,我要警告您,由于这是从botocore的本地模型中提取而不是命中端点,因此它不总是全面的,因为您需要更新botocore才能更新列表。
from boto3.session import Session

s = Session()
dynamodb_regions = s.get_available_regions('dynamodb')

此外,您不受限于此列表中的区域。如果您使用旧版本的botocore,仍然可以通过指定它们来使用新区域。它们只是不会出现在此列表中。


这个选项对我来说非常好 - 我需要在一个不进行服务调用的库中创建一些东西。感谢您指出了这个区别! - killthrush
只是补充一下:get_available_regions('ec2', 'aws-cn') 可以获取中国大陆地区。政府区域也是一样的。 - dz902
这将为您提供boto3知道的区域,而不是实际在AWS账户中启用的区域。 - Wayne Workman

41
以下内容将返回每个区域的RegionName和Endpoint。
# List all regions
client = boto3.client('ec2')
regions = [region['RegionName'] for region in client.describe_regions()['Regions']]

1
谢谢!我很感激 - Shawn
6
client = boto3.client('ec2') 出现错误 "botocore.exceptions.NoRegionError: You must specify a region.",意思是必须指定一个区域。 - tadasajon
1
有多种方法可以设置区域(AWS 有很好的文档),但您可以直接从 client = boto3.client('ec2', region_name='us-west-2') 获取。 - Frederic Henri
我该如何给多个区域命名?我可以这样命名吗 client = boto3.client('ec2',region_name='us-west-2' && 'us-west-1') @FrédéricHenri - vishal
我也想避免进行服务调用(并且根本不使用ec2客户端,因为我特别想知道SSM的区域),但是这最终成为了唯一可行的解决方案,因为其他方法也列出了选择加入的区域(例如ap-east-1me-south-1),这导致我在针对这些区域进行后续boto调用时出现了“UnrecognizedClientException”。 - Phil Gref
显示剩余3条评论

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