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
この記事が気に入ったらサポートをしてみませんか?