lambda で古い世代数の AMI を開放する

環境構築
pip install awscli

boto3 は python を扱うための専用のモジュール
pip install boto3

aws configure でアクセスキーとシークレットキーを指定

以下スクリプト


# coding:utf-8 #日本語を使うために #モジュールをインポート command はコマンドを使うために boto3 は python を使うために re は正規表現を使うために glob はワイルドカードを使うために import commands, boto3, re, glob #インスタンスID と 保持する世代数を指定する TARGET_INSTANCE_ID_1 = "i-hogehoge" # Enter your target Instance Name TARGET_INSTANCE_ID_2 = "i-hogeeeee" TARGET_INSTANCE_ID_3 = "i-hoooooge" #世代数を指定する。そのまま 3 を入れると文字列型であとでエラーを吐くので int 型に変換しておく GENERATION_NUM = int("3") #コマンドを使うための簡略的な関数 def _(cmd): return commands.getoutput(cmd) #指定した3つのIDを配列に入れる TARGET_LIST = [TARGET_INSTANCE_ID_1,TARGET_INSTANCE_ID_2,TARGET_INSTANCE_ID_3] #for 文で回す for LIST in TARGET_LIST: #インスタンスID からインスタンスを絞る target_instance_action = boto3.resource('ec2').Instance(LIST) #json 形式なので [hogehoge][0] という形で絞っていって最終的に Tags(インスタンスの名前) を取得する target_instance_name = boto3.client('ec2').describe_instances(Filters=[{'Name':'instance-id','Values':[LIST]}])["Reservations"][0]["Instances"][0]["Tags"][0]["Value"] #作成する AMI名 を インスタンス名+タイムスタンプ に指定する AMI_name = target_instance_name + "-" + _('TZ=JST-9 date +"%Y%m%d%H%M%S"') print(AMI_name) #AMI を実際に作成する target_instance_action_1.create_image(Name=AMI_name) #作成したAMI名は インスタンス名+タイムスタンプ となっているのでインスタンス名とワイルドカードでインスタンス名を含んだ AMI を全部取得する target_ami_inf = boto3.client('ec2').describe_images(Filters=[{'Name':'name','Values':[target_instance_name + '*']}])["Images"] #今回AMI名を インスタンス名+タイムスタンプ にしてるので Description でソートを掛けても良いかもですが CreationDate という作成日時が json データの中にあるのでそれを利用します。 sort_data = sorted(target_ami_inf,key=lambda x: x['Description'],reverse=True) sort_data_2 = sorted(target_ami_inf,key=lambda x: x['CreationDate'],reverse=True) #for 文 で回して各AMI データの数が 世代数を超えるようなら古いのから消す。 COUNT = 0 for img in sort_data_2: COUNT += 1 print(COUNT) if GENERATION_NUM >= COUNT: continue else: #登録解除する AMI の情報と実際に AMI の解放 print("delete this AMI_image \n" + str(img)) DELETE_AMI_ID = img["Reservations"][0]["Instances"][0]["ImageId"] boto3.client('ec2').deregister_image(ImageId=DELETE_AMI_ID)