[Python] AMIのパブリック共有ブロックをBoto3で設定してみた

AMIのパブリック共有をブロックする設定をPythonのライブラリBoto3を使って実行してみました。
2023.09.25

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

先日、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を共有してしまう事故を防げます。共有が必要になるまではデフォルトで有効化してしまいましょう。