[AWS][lambda]Node.jsでEBSスナップショットを作成する。

今回は、Lambdaを使ってEBSスナップショットを作成をNode.jsで書いてみました。

要件

  • EC2インスタンスにアタッチしているEBSボリュームが対象
  • バックアップは5日間保持

ソースコード

const AWS = require('aws-sdk');
const ec2 = new AWS.EC2({region: 'ap-northeast-1'});
const sts = new AWS.STS();
const date = new Date();

exports.handler = (event, context, cb) => {
    // スナップショット作成処理
    Promise.resolve().then(() => {
        var params = {
        Filters: [
            {
                Name:"status",
                Values: [
                "in-use"
                ]
            }
        ]};
        return ec2.describeVolumes(params).promise();
    }).then(response => {
        for (var i = 0; i < response['Volumes'].length; i++) {
            var params = {
                Description: 'cron backuped snapshot' + response['Volumes'][i].Attachments[0].InstanceId,
                VolumeId: response['Volumes'][i].Attachments[0].VolumeId
            };
            ec2.createSnapshot(params).promise();
        }
    }).then(response => {
        console.log('create complete');
    });
    
    // スナップショット削除処理
    Promise.resolve().then(() => {
        // アカウント情報を取得する
        var params = {};

        return sts.getCallerIdentity(params).promise();
    }).then(response => {
        // snapshot一覧を取得する
        var params = {
                OwnerIds: [
                    response.Account
                ]
            };
        return ec2.describeSnapshots(params).promise();
    }).then(response => {
        // 5日前を求める
        date.setDate(date.getDate() - 2);
        date.setHours(23,59,59,999);

        console.log(response.Snapshots.length);
        // 5日より前のスナップショットを削除する
        for (var i = 0; i < response.Snapshots.length; i++) {
            if (date > response.Snapshots[i].StartTime) {
                console.log(response.Snapshots[i].StartTime);
                var params = {
                    SnapshotId: response.Snapshots[i].StartTime
                };
                ec2.deleteSnapshot(params).promise();
            }
        }
    }).then(response=> {
        console.log('delete complete');
    });
};