LambdaでEBSスナップショットを作成する。


構成

構成はこんな感じ。
client側はAWSCLIでLambdaを呼び出す。
Lambdaはboto3でsnapshot操作を行い、バックアップ対象ボリュームのスナップショットの作成、定期削除などを行う。

ソースコード


import boto3

def lambda_handler(event, context):
 
client=boto3.client('ec2')
instance=client.describe_instances(
    Filters=[
        {
            'Name':'tag:backup',
            'Values':['enable']
        }
        ]
    )['Reservations']

for instance_reservations in instance:
    for instance_instances in instance_reservations['Instances']:
        instance_id=instance_instances['InstanceId']
        client.create_snapshots(
            InstanceSpecification={
                'InstanceId':instance_id
            },
            TagSpecifications=[
                {
                    'ResourceType':'snapshot',
                    'Tags':[
                        {
                            'Key':'system',
                            'Value':'test'
                        }
                        ]
                }
                ]
            )

まず、対象のインスタンスタグ(backup=enable)でフィルターをかけて、バックアップ対象のインスタンスIDを取得する。
辞書型のjson形式ででてくるので、インスタンスIDを取り出すのは少々面倒ですが、forとか使って取り出してcreate_snapshots()に指定している。
この時タグコピーしてくれないので、一緒にタグもちゃんとつけるように。


引っかかったこと

Lambda移植前にローカル環境で直接boto3のスクリプトを組んで検証していたのだが、スナップショットの作成が重複が発生した。バックアップ対象ボリュームは3つくらいなのに、スナップショットが6個~15個など複数個作成されて非常に困ってしまった。
恐らく検証過程で何度もスクリプトを実行していたことでboto3.clientセッションが複数接続状態のままになっていたようで、Lambdaへ移植することで解決した。同志諸君も注意してくれたまい。

今回はcreate_snapshots()で実行しているがcreate_snapshot()でも可能。
その場合はdescribe_volume()などで対象のVolumeIdを取得し、指定すれば同様のことが再現できる。
私が見かけた記事ではcreate_snapshot()のパターンが多かったので、create_snapshots()バージョンのコードを提示した。

次回、Snapshot削除編へつづく。
https://note.com/oshiri_prinprin/n/n5769c4e2b642

この記事が気に入ったらサポートをしてみませんか?