AWS SDK for Python boto3でAMI&スナップショットを削除する。

boto3を使ってAMIを削除、AMIを削除しただけだと、ディスクのスナップショットは残ってしまうのでそちらも削除する。

持っている情報はアクセスキー、シークレットアクセスキーなど基本的なもの+AMIのid(ImageId)を想定する(AMIに関連づいたスナップショットのidはImageIdから探す)

まずはリソースの取得。

ec2 = boto3.resource('ec2',  
    aws_access_key_id=awsconf['access_key'],
    aws_secret_access_key=awsconf['secret_key'],
    region_name=awsconf['region']
)

とか。(awsconfにはデータ入れといてね。)

AMIの削除。こちらは一言で終わる。

ec2.Image(ImageId).deregister()

これでImageIdに存在するAMIのidが入っていれば削除される。

問題はスナップショット。

ブラウザ経由からぽちぽち操作したことがあればわかると思うが、AMIの削除を先にしなければ、紐付けられたスナップショットは削除出来ない。

しかし、AMIを削除してもスナップショットは残る。AMIを消したときにスナップショットも消したい人は多いはずなのにそのボタンすら無い。

まぁ、というわけでスナップショットを消してあげなければならないのだが、スナップショットの持つデータの中に関連づいたImageIdのようなものがないのだ。

スナップショットIDと容量くらいしか情報を持っていない。これをどう探し出すかと見てみたら皆さん説明書きから探しているらしい。

スナップショットの説明の項目を見てみると、たしかに

「Created by CreateImage(i-xxxxxxxxxxxxx) for ami-xxxxxxxx from vol-xxxxxxxxxxxxx」

とある。怖いけどこれからImageIdが一致しているものを探す。

snapshots_response = client.describe_snapshots(
     Filters=[{'Name': 'description',
               'Values': ['Created by CreateImage(*) for ' + image_response["ImageId"] + ' from *',]
               }]
             )
for i in snapshots_response['Snapshots']:
  client.delete_snapshot(SnapshotId=i['SnapshotId'])

複数のドライブがAMIに紐付いていたらそれも削除するためこのように。

ちなみに説明書きの書き方が変わったら使えない。ImageIdくらい情報持っててもいいと思うのに。

ひとまずこれを使えばImageIdからAMIとスナップショットの削除ができる。