[小ネタ]AMIの共有をLambda関数から実行する

Lambda関数にてAMIの共有、共有停止を実施したく簡単にコードを書いてみました。(Python 3.7) Lambda関数を実行して動作確認まで実施しました。
2019.05.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Lambda関数にてAMIの共有、共有停止を実施したく簡単ですがコードを書きました。

動作確認も実施しましたので、残しておきたいと思います。本エントリではランタイムに「Python 3.7」を利用しています。

やってみた

Lambda関数作成

AMI共有元のアカウントで、Lambda関数を作成します。検証のため、入力値のチェック等は行わず、シンプルなコードにしています。

import os
import boto3

ec2_client = boto3.client('ec2')
 
def lambda_handler(event, context):
    ami_id = os.environ['AMI_ID']
    user_id = event['userid']
    flg = event['permission']

    if flg == "add":
        ec2_client.modify_image_attribute(
            ImageId = ami_id,   
            LaunchPermission = {
                'Add': [
                    {
                        'UserId': user_id
                    }
                ]
            }
        )
    else:
        ec2_client.modify_image_attribute(
            ImageId = ami_id,
            LaunchPermission={
                'Remove': [
                    {
                        'UserId': user_id
                    }
                ]
            }
        )

ここでは、共有の元になるAMIは環境変数で指定しています。

01

AMI共有

共有元となるアカウントで、Lambda関数を起動します。以下の入力値をLambda関数に渡し実行します。(useridはAWSアカウントを指定)

{
  "userid": "XXXXXXXXXXXX",
  "permission": "add"
}

02

共有元で該当AMIのパーミッションを確認すると、Lambda関数実行時に指定したアカウントに、共有されていることが確認できました。

03

共有先のアカウントにてプライベートイメージを確認すると、指定したAMIが参照できました。

04

AMI共有停止

共有元となるアカウントで、Lambda関数を起動します。以下の入力値をLambda関数に渡し実行します。permissionに「stop」を指定していますが「add」以外を渡せば共有が停止されます。

{
  "userid": "XXXXXXXXXXXX",
  "permission": "stop"
}

05

共有元で該当AMIのパーミッションを確認すると、アクセス許可がなくなっている事を確認できました。

06

共有先のアカウントでは、先程確認できたAMIは参照できなくなっています。

07

さいごに

Lambda関数でAMIの共有、共有停止を確認することができました。実際に利用する際は、入力値のチェックや汎用性を考慮した作り込みを実施いただければと思います。

参考