【AWS】EBSボリューム自動取得/削除 を Lambda で実行 (世代管理も)

EBSボリュームを自動バックアップ


ブログ更新がご無沙汰なマルオです。「仕事が忙しくてブログを書いてる暇が…」それは言いワケなんですよ。(自責の念を込めて)

そして知らぬ間に当サイトに「インターンステラ」なる新カテゴリができてるじゃないですか!これは負けてられないということで尻に火が付いているわけです。

今回の目的は「EBSボリュームを自動バックアップしたい!(世代管理もしたい)」

バックアップの実現方法についてはネットを探すとたくさんの情報が出てきますので、それらの情報にならって構築します。

-----------------------------------

作業開始


実行する環境
 ・EC2インスタンス 1台
 ・追加 EBSボリューム 1個 (EC2インスタンスにアタッチ)

実現したい要素
 ・追加 EBSボリュームも含めてバックアップ
 ・バックアップとしてスナップショット取得
 ・スケジュール実行で自動取得
 ・Lambda で Python
 ・世代管理をして古いバックアップも自動削除

必要な事
 ・Lambda で動かすスクリプト (Lamba関数作成)
 ・Lambda に与える権限 (ロール作成)
 ・世代管理用にタグを EC2インスタンスに与える (タグ付与)
 ・Cron で登録する時間決定 (CloudWatchEvent ルール設定)

※事前にEC2インスタンスと追加 EBSボリュームの作成とアタッチは事前に済ませています。

---------------------------------------------------------

1.Lambda 関数作成

---------------------------------------------------------

1. 名前「myFunction」(任意) / ランタイム 「Python3.6」選択
2. ロールはここで新規作成したいので「カスタムロールの作成」選択

「カスタムロールの作成」選択でロール作成画面に遷移する


---------------------------------------------------------

2.ロール作成

---------------------------------------------------------

1. IAMロール「新しい IAMロールの作成」選択 / ロール名「lambda_my_role」(任意)
2. ロールは新規作成したいので「カスタムロールの作成」選択

テキストボックスは「編集」から開く


3. 次のドキュメントを適用

権限はCloudWatchとEC2インスタンス操作 (インスタンスとスナップショット一覧・スナップショット作成削除)



{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:*:*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeSnapshots",
                "ec2:CreateSnapshot",
                "ec2:DeleteSnapshot"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}




---------------------------------------------------------

3.コード貼り付けと保存

---------------------------------------------------------

次のスクリプトを適用 (すべての条件を叶えてくれる素晴らしいスクリプトに出会えましたので使用させて頂きます!)


参考:EC2のスナップショットを自動的に Lambdaで作成する


赤枠の箇所にコードを貼りつける





















[補足:タイムアウトついて]
タイムアウトは 10秒で設定しています。環境によって変更が必要です。(わたしの環境では 10秒 を超えてタイムアウトエラーになる場合もあったのでもう少し長めでもいいかもしれません)


---------------------------------------------------------

4.タグ付与

---------------------------------------------------------

このスクリプトでは、EC2インスタンスに付与するタグの「key」でバックアップ対象を判別し「val」の数値で世代管理をするそうです。(こうやって管理するのか。。)

「EC2」> 対象インスタンス選択 >「タグ」>「タグの追加/編集」



---------------------------------------------------------

5.動作確認

---------------------------------------------------------

これで準備が整ったので、Lambda から「テストイベントの設定」>「新しいイベントの作成」>「Hello World」を選択して任意の名前を付けてテスト実行してみます。

スナップショットが取得できている


スナップショット取得が成功は「ELASTIC VOLUME STRAGE」>「スナップショット」から確認することが出来ます。

ログを見てみる

---------------------------------------------------------

おわりに

---------------------------------------------------------

このとても素晴らしいスクリプトのおかげで「バックアップ」を安心して取得できる環境
が整いました。ありがたや!

このバックアップスクリプトを運用していて気になったことが一点あります。それは Lambda の重複実行です。

リファレンスには次のような記載があります。(要約)

「少なくとも 1 回は実行される」ことを保証しておりますが、「2 回以上重複実行されない」ことは保証しておりません。

実際に起こったパターンは2つ。

ケース1. ほぼ同時刻に重複実行
ケース2. 約1分後に重複実行

ケース2.はエラーはなく、単純に2回スナップショットが取得されました。手動で消せば良いのですが無駄なS3費用が掛かります。(わずかですが)

ケース1.の場合はほぼ同時刻だったので次のようなエラーが返ってきます。

(SnapshotCreationPerVolumeRateExceeded) when calling the CreateSnapshot operation: The maximum per volume CreateSnapshot request rate has been exceeded. Use an increasing or variable sleep interval between requests.

重複実行の方法はいくつかあるようなので対策を考えたいところです。

「バックアップ取得」の目的は達成できましたので「重複実行対策」を次回テーマに掲げます。うまくいったら (?) ブログに掲載する予定です。

トライ・アンド・エラーの「エラー」はわたしのスキルを蓄積させてくれます。。

おわり

このブログの人気の投稿

【GCP】Compute EngineでVPNサーバーを立てるときの注意点

【GCP】Compute Engineからメール送信する方法 (SendGrid編)

【AWS】IAMFullAccessを付与せずIAM Roleの作成とアタッチを行う方法