Есть ли теперь способ получить «имена регионов AWS» в boto3? - PullRequest
4 голосов
/ 29 апреля 2019

Есть ли способ в boto3 преобразовать коды регионов AWS в имена регионов AWS, например, преобразовать ('us-west-1', 'us-east-1', 'us-west-2') в ('N. California', 'N. Virginia', 'Oregon')?

Я могу получить список кодов регионов AWS со следующим фрагментом:

 from boto3.session import Session
 s = Session()
 regions = s.get_available_regions('rds')
 print("regions:", regions)

$ python3 regions.py
regions: ['ap-northeast-1', 'ap-northeast-2', 'ap-south-1', 'ap-southeast-1', 'ap-southeast-2', 'ca-central-1', 'eu-central-1', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'sa-east-1', 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2']

Есть ли эквивалентный фрагмент, который дал бы мне имена регионов AWS?

Ответы [ 3 ]

5 голосов
/ 29 апреля 2019

AWS только что выпустила функцию, которая позволяет запрашивать регионы AWS, конечные точки и многое другое с помощью хранилища параметров AWS Systems Manager .

Используя эту функцию и boto3, вы можете сделать что-то вроде этого:

import boto3

client = boto3.client('ssm')

response = client.get_parameter(
    Name='/aws/service/global-infrastructure/regions/us-west-1/longName'
)

region_name = response['Parameter']['Value'] # US West (N. California)

Чтобы получить все доступные регионы, вы можете сначала использовать get_parameters_by_path(), используя следующий путь /aws/service/global-infrastructure/regions.

Примечание. Несмотря на то, что это общедоступные данные, для них требуются соответствующие разрешения IAM.

1 голос
/ 03 мая 2019

Это решение, к которому я пришел, которое показывает все идентификаторы региона AWS / EC2 и имена:

$ cat so_regions2.py
import boto3

region = "us-east-1"
print("Using region:", region)

ec2 = boto3.client("ec2", region_name=region)
ec2_responses = ec2.describe_regions()
ssm_client = boto3.client('ssm', region_name=region)
for resp in ec2_responses['Regions']:
    region_id = resp['RegionName']
    tmp = '/aws/service/global-infrastructure/regions/%s/longName' % region_id
    ssm_response = ssm_client.get_parameter(Name = tmp)
    region_name = ssm_response['Parameter']['Value'] 
    print ("region_id:",region_id,"region_name:",region_name)

$ python3 so_regions2.py
Using region: us-east-1
region_id: eu-north-1 region_name: EU (Stockholm)
region_id: ap-south-1 region_name: Asia Pacific (Mumbai)
region_id: eu-west-3 region_name: EU (Paris)
region_id: eu-west-2 region_name: EU (London)
region_id: eu-west-1 region_name: EU (Ireland)
region_id: ap-northeast-2 region_name: Asia Pacific (Seoul)
region_id: ap-northeast-1 region_name: Asia Pacific (Tokyo)
region_id: sa-east-1 region_name: South America (Sao Paulo)
region_id: ca-central-1 region_name: Canada (Central)
region_id: ap-southeast-1 region_name: Asia Pacific (Singapore)
region_id: ap-southeast-2 region_name: Asia Pacific (Sydney)
region_id: eu-central-1 region_name: EU (Frankfurt)
region_id: us-east-1 region_name: US East (N. Virginia)
region_id: us-east-2 region_name: US East (Ohio)
region_id: us-west-1 region_name: US West (N. California)
region_id: us-west-2 region_name: US West (Oregon)
$ 
0 голосов
/ 29 апреля 2019

Редактировать: Как уже упоминалось @jogold, с недавним запуском Query for AWS Systems Manager Store Parameter я бы посоветовал использовать его для прямого запроса из AWS вместо пользовательского сценария в моем ответе.


В соответствии с boto3 документами , нет родной функциональности для описания разговорных названий регионов.

Вот небольшой скрипт с функцией convertRegionCodesToNames(), который берет список допустимых идентификаторов регионов и преобразует их в их общие имена. При необходимости добавьте обработку ошибок для неверных входных данных, массивов нулевой длины или других возможных ответов, возвращаемых boto3.

# replace `regions` variable with the output from the get_available_instances() response

regions = ['ap-northeast-1', 'ap-northeast-2', 'ap-south-1', 'ap-southeast-1', 'ap-southeast-2', 'ca-central-1', 'eu-central-1', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'sa-east-1', 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2']

def convertRegionCodesToNames(regions):
    # static dict of all region key-value pairs
    region_dict = {
      "us-east-1": "N. Virginia",
      "us-east-2": "Ohio",
      "us-west-1": "N. California",
      "us-west-2": "Oregon",
      "ca-central-1": "Central",
      "eu-west-1": "Ireland",
      "eu-central-1": "Frankfurt",
      "eu-west-2": "London",
      "eu-west-3": "Paris",
      "eu-north-1": "Stockholm",
      "ap-northeast-1": "Tokyo",
      "ap-northeast-2": "Seoul",
      "ap-southeast-1": "Singapore",
      "ap-southeast-2": "Sydney",
      "ap-south-1": "Mumbai",
      "sa-east-1": "São Paulo",
      "us-gov-west-1": "US Gov West 1",
      "us-gov-east-1": "US Gov East 1"
    } 

    for i in range(len(regions)):
        regions[i] = region_dict[regions[i]]

    return regions

converted_regions = convertRegionCodesToNames(regions)
print("regions:", converted_regions) 

После добавления команда $ python3 regions.py выдаст:

regions: ['Tokyo', 'Seoul', 'Mumbai', 'Singapore', 'Sydney', 'Central', 'Frankfurt', 'Ireland', 'London', 'Paris', 'São Paulo', 'N. Virginia', 'Ohio', 'N. California', 'Oregon']
...