Amazon EBSのスナップショットをLambdaで自動取得する方法（備忘録）

作業の備忘録としてまとめました。
# やりたいこと
- スナップショットを毎日03：00に自動取得
- スナップショットは3世代まで残し、古いものから自動的に削除
- スナップショットの取得でエラーが発生した場合はメール通知

# 参考にした記事とサイト
- [EC2のスナップショットを自動的にAWS Lambdaで作成する](https://qiita.com/HorieH/items/66bb68d12bd8fdbbd076)
- [時差計算](http://www.jisakeisan.com/)

# 用語
作業するにあたり、自分なりの用語の理解を改めて整理。

- **インスタンス** ：サーバー
- **AMI** ：スナップショット ＋ インスタンスを構成する管理情報（メタデーター）
- **EBSボリューム** ：ストレージ
- **スナップショット** ：EBSボリュームの中のデータを特定のタイミングで取得しS3に保存したもの（ユーザーデーター）


# 手順
基本的には[参考にした記事](https://qiita.com/HorieH/items/66bb68d12bd8fdbbd076)の通りに設定しました。
ここでは、記事の通り進める中で迷った点や注意事項について記載します。

### **1. EC2インスタンスに名前とタグをつける**
- インスタンス名に日本語を使用している場合、後で行うLambdaの動作確認で実行エラーとなるので注意。
- 「Backup-Generation」のValueで何世代残すか調整可能。
- 「Backup-Generation」のValueを空にするとエラーとなるので注意。バックアップ対象としない場合はキーを作成しないか、Valueに「0」を設定

### **2. Lambda 関数の作成**
関数の作成は「設計図」からではなく「一から作成」を選択。続いて、ロールの「カスタムロールの作成」を選択して新しいIAMロールを作成する。
![aws_1.png](https://qiita-image-store.s3.amazonaws.com/0/137478/4d1bd63b-d5de-2102-0a30-9b586b8808cd.png)

### **3. 実行ロール（IAM Role）の作成**
ポリシードキュメントの編集ボタンをクリックして、[参考にした記事](https://qiita.com/HorieH/items/66bb68d12bd8fdbbd076)の「iam.json」を入力。
![aws_2.png](https://qiita-image-store.s3.amazonaws.com/0/137478/3169e4a7-8cab-6817-e2d3-ab948ec06cf7.png)

[iam.json]

```
{
    "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": [
                "*"
            ]
        }
    ]
}
```

### **4. 関数コード**
関数コードをインラインで編集して、[参考にした記事](https://qiita.com/HorieH/items/66bb68d12bd8fdbbd076)のpythonコードを入力。
![aws_3.png](https://qiita-image-store.s3.amazonaws.com/0/137478/de36762c-9ffd-db2c-f527-b676f4342dd9.png)

### **5. 基本設定**
タイムアウトを「10秒」に設定。
（※後日発生したエラーを関数のモニタリングからログ確認したところ、「Duration」が10000msを超えていたため15秒に変更）
![aws_4.png](https://qiita-image-store.s3.amazonaws.com/0/137478/ddd4788f-53d7-f060-a7c1-e74069a03cae.png)


### **6. Lambdaの動作確認**
1. 右上のテストイベントを選択するコンボボックスから「テストイベントの設定」を選択。
<br>

2. テストイベント設定画面のイベントテンプレートから「Schedule Event」を選択してテストイベントを作成。
（※ コード部分は変更しないでそのまま使用）
![aws_5.png](https://qiita-image-store.s3.amazonaws.com/0/137478/4c2d1260-1d53-074a-c099-400f17216d6d.png)
<br>

3. テストボタンをクリックしてスナップショットが正しく作成されている事を確認。

### **7. Lambdaのスケジュールイベントの作成**
1. Designerで「CloudWatch Events」トリガーを左側のリストから追加。
（※ 追加するとトリガーの設定画面が表示されます）
![aws_6.png](https://qiita-image-store.s3.amazonaws.com/0/137478/00645dae-1df1-12f6-dc5f-1f848dc7ce43.png)
<br>

2. トリガーの設定画面で「新規ルールの作成」を選択して、各設定項目を入力。
「追加」ボタンをクリックして、問題なければ右上の「保存」ボタンをクリックして設定を保存。
（※ 保存するとトリガーの有効・無効が選択できるようになります）
![aws_7.png](https://qiita-image-store.s3.amazonaws.com/0/137478/9db54e6f-a1a6-84d7-3179-8593dc604f9f.png)

### **8. CloudWatchのエラー通知設定**
1. CloudWatchの「アラームの作成」ボタンをクリック。
<br>

2. **【アラームの変更：step-1】**Lambdaメトリクスの「機能の名称別」を選択。
![aws_8.png](https://qiita-image-store.s3.amazonaws.com/0/137478/3b63c193-fb88-0a02-b3dd-210c3774af56.png)
<br>

3. **【アラームの変更：step-2】**メトリクス名が「エラー（Error）」を選択して次へボタンをクリック。
![aws_9.png](https://qiita-image-store.s3.amazonaws.com/0/137478/ad67e708-0d69-80ce-cc12-13df52140581.png)
<br>

4. **【アラームの変更：step-3】**[参考記事](https://qiita.com/HorieH/items/66bb68d12bd8fdbbd076)を参考にして設定項目を入力。
![aws_10.png](https://qiita-image-store.s3.amazonaws.com/0/137478/2d692954-fe74-edcf-ed2c-a3e2dd268b90.png)
<br>

5. アラームの作成ボタンをクリックしてエラー通知アラームを作成。
承認メールを承認ボタンをクリックして設定完了。