中国リージョンでboto3のget_available_regionsを使用する際には引数でパーティションを指定する

中国リージョンでget_available_regionsを使用して一覧を取得する場合は引数を指定する必要があります。
2023.08.29

こんにちは。サービス開発室の武田です。

boto3では指定したサービスがサポートされているリージョンの一覧を取得したいと思った時、get_available_regionsという関数が使用できます。

実際に実行してみると、次のような結果が表示されました。

>>> session.get_available_regions(service_name="ec2")
['af-south-1', 'ap-east-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-northeast-3', 'ap-south-1', 'ap-south-2', 'ap-southeast-1', 'ap-southeast-2', 'ap-southeast-3', 'ap-southeast-4', 'ca-central-1', 'eu-central-1', 'eu-central-2', 'eu-north-1', 'eu-south-1', 'eu-south-2', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'me-central-1', 'me-south-1', 'sa-east-1', 'us-east-1', 'us-east-2', 'us-west-1', 'us-west-2']

普段はこれで困っていなかったのですが、よく見ると中国のリージョンが入っていません。ちなみにsessionオブジェクトは中国リージョンにアクセスしているプロファイルで実行しています。

どういうことなんだ、ということでドキュメントを確認してみました。

な、なんと、get_available_regions関数は引数でpartition_nameを取っているではありませんか。

get_available_regions(service_name, partition_name='aws', allow_non_regional=False)

指定しなかった場合のデフォルトはawsですので、一般的な商用リージョンということになります。

そんなわけで、商用リージョン以外で有効なリージョン一覧を取得するためには、適切に引数を指定してやる必要があります。

>>> session.get_available_regions(service_name="ec2", partition_name="aws-cn")
['cn-north-1', 'cn-northwest-1']

無事に中国リージョンの一覧が取得できました!

describe_regionsはそのままでも動く

ちなみにリージョン一覧の取得によく使用される別の方法として、describe_regionsがあります。こちらも実行してみましたが、次のように問題なく取得できました(前述の通り中国リージョンにアクセスしているオブジェクトです)。こちらの方法で一覧を作成している場合はそのままでも大丈夫そうです。

>>> ec2 = session.client("ec2")
>>> [r["RegionName"] for r in ec2.describe_regions()["Regions"]]
['cn-north-1', 'cn-northwest-1']

まとめ

普段から使い慣れた関数でしたが、実は引数があったんだねというお話でした。既存のコードを中国リージョンでも使えるようにするためには、いろいろと修正が必要そうです。