🚀
全リージョンのAMI IDの一覧取得
やりたいこと
特定の AMI でサポートされるすべのてリージョンの AMI ID 一覧を取得する
なんで欲しかった?
CloudFormation などの Mappings ですべてのリージョンで対応するテンプレートとするために一覧でほしかったです。
全部のリージョンで調べるのはめんどくさかったのでコードにしました。
いきなり結論
調べたい AMI の ProductCode を調べて以下のコードを実行する
import boto3
product_code = < 調べたい AMI の ProductCode >
def lambda_handler(event, context):
regions = boto3.session.Session().get_available_regions('ec2')
print(regions)
for region in regions:
try:
client = boto3.client("ec2", region_name=region)
response = client.describe_images(
Filters=[
{
'Name': 'product-code',
'Values': [
product_code,
]
}
],
)
print(region)
print(response['Images'][0]['ImageId'])
except:
print(region)
print("Pass")
ProductCode の調べ方
調べたい AMI の ID を調べて以下のコードを実行する
import boto3
ami_id = < 調べたい AMI の ID >
def lambda_handler(event, context):
client = boto3.client("ec2")
response = client.describe_images(
ImageIds=[
ami_id,
],
)
print("ProductCode")
print(response['Images'][0]['ProductCodes'][0]['ProductCodeId'])
はまったポイント
try/except を使わずに"boto3.session.Session().get_available_regions('ec2')"で取得したリージョンに対してAMIを調べると以下のエラーが出力されます。
An error occurred (AuthFailure) when calling the DescribeImages operation: AWS was not able to validate the provided access credentials
このエラーを調べると原因は以下のようなものが出てきます
今回のエラー原因についてはアカウントで有効化されていないリージョンに対してAMIを取得するAPIを実行したために発生したものとなります。
API を実行したリージョン
- 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
アカウントで有効化されていないリージョン
- ap-south-2
- ap-southeast-4
- ca-west-1
- eu-south-2
- eu-central-2
- me-central-1
- il-central-1
Discussion