[Python] AMIのパブリック共有ブロックをBoto3で設定してみた
こんにちは。サービス開発室の武田です。
先日、AMIのパブリック共有をブロックする機能がリリースされました。またそれをAWS CLIで設定するエントリも書かれています。
ちょうどPythonのスクリプトで実装する機会がありましたので、このエントリでまとめておきます。
PythonのAWSライブラリであるBoto3で追加されたのは1.28.46
となります。そのためそれ以上のバージョンをインストールしている必要がありますので、気をつけましょう。
やってみた
まず自分の環境のバージョンを確認してみました。
$ pip list | grep boto3 boto3 1.26.161
全然ダメですね!一気に最新バージョンまでアップグレードしましょう。
$ pip install --upgrade boto3 $ pip list | grep boto3 boto3 1.28.53
これで準備OKです。
まずは現在の設定を確認します。
>>> import boto3 >>> ec2 = boto3.client("ec2") >>> ec2.get_image_block_public_access_state() {'ImageBlockPublicAccessState': 'unblocked', 'ResponseMetadata': {'RequestId': '740ed6f2-1b1d-42fb-b5fd-47584119f68a', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '740ed6f2-1b1d-42fb-b5fd-47584119f68a', 'cache-control': 'no-cache, no-store', 'strict-transport-security': 'max-age=31536000; includeSubDomains', 'vary': 'accept-encoding', 'content-type': 'text/xml;charset=UTF-8', 'transfer-encoding': 'chunked', 'date': 'Mon, 25 Sep 2023 06:32:41 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}
unblocked
ですね。未設定状態です。では続いてブロック設定をしてみましょう。
>>> ec2.enable_image_block_public_access(ImageBlockPublicAccessState='block-new-sharing') {'ImageBlockPublicAccessState': 'block-new-sharing', 'ResponseMetadata': {'RequestId': '2fc54ed7-5559-4a22-9e40-cc9e9eac6241', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '2fc54ed7-5559-4a22-9e40-cc9e9eac6241', 'cache-control': 'no-cache, no-store', 'strict-transport-security': 'max-age=31536000; includeSubDomains', 'vary': 'accept-encoding', 'content-type': 'text/xml;charset=UTF-8', 'transfer-encoding': 'chunked', 'date': 'Mon, 25 Sep 2023 06:48:04 GMT', 'server': 'AmazonEC2'}, 'RetryAttempts': 0}}
問題なく設定できていますね。パブリック共有のブロックはリージョナル設定です。全リージョンで有効化するためには、次のようなスニペットを実行すればOKです。
for r in [r["RegionName"] for r in ec2.describe_regions()["Regions"]]: ec2 = boto3.client("ec2", region_name=r) ec2.enable_image_block_public_access(ImageBlockPublicAccessState='block-new-sharing')
まとめ
ブロック設定をすることで、意図せずAMIを共有してしまう事故を防げます。共有が必要になるまではデフォルトで有効化してしまいましょう。