EBS Snapshotの自動バックアップとバックアップ完了通知をGmailに飛ばす設定をCloudFormationを使って一撃で終わらせる

今回はEBS snapshotの自動バックアップとバックアップ完了通知をGmailに飛ばす設定をCloudFormationを使って一撃で終わらせる手順を説明します。
今回使用するAWSサービスはDLM・SNS・CloudWatch Event・CloudFormationです。

#前提条件
- Windows10を使用。
- PCはDELLを使用。
- ファイルの拡張子は.ymlを使用。
- 東京リージョンを使用。

#料金
テンプレート自体に料金は発生しないが、作成後のリソースは料金が発生する為、ご注意ください。

#事前準備
- AWSアカウントを所持していること。
- EC2インスタンスを作成していること。
- DLM・SNS・CloudWatch Event・CloudFormationへのアクセス権限（書き込み・読み取り）を許可していること。
- バックアップ完了通知用のEメールアドレスを用意すること。

#構築内容
DLM・CloudWatch Events・SNSを使って各種設定する。
###１. DLM
- 東京リージョンにライフサイクルマネージャーを作成
- クロスリージョンのコピー先をバージニア北部に設定
- 詳細の各ポリシーの値については以下の通りです

####①スケジュール設定
|項目 |  値 | 
|:------------|:------------|
| スナップショットの取得時刻 |15:00 (UT)|
| スナップショットの取得間隔 |24時間|
| スナップショットの保持期間 |30日|
| ポリシーステータス |有効| 
####②クロスリージョンの設定
|項目 |  値 | 
|:------------|:------------|
| スナップショットの保持期間 |30日|
| 暗号化 |無効|
| ソースからタグをコピー |有効|
###2. SNS
事前に用意したEメールをSubscriptionのエンドポイントに設定する。

###3. CloudWatch Events
- EBSボリュームのスナップショット取得をCloudWatch Eventsで監視
- 作成時にCloudWatchイベントのステータスを有効化
- スナップショットを取得した場合の通知先をテンプレート内で作成したSNSトピックに指定


#テンプレート
スタックは以下の通りです。

```yml:DLM_&_EBS_Snapshot_Notification_settings.yml
AWSTemplateFormatVersion: "2010-09-09"
Description:
  DLM & EBS-Snapshot Notification settings

Parameters:
# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------# 
# ターゲットリソースタグを指定
  EBSNameTag:
    Type: String

# CloudWatchEvent名を指定
  CloudWatchEventName:
    Type: String

# SNSTopic名を指定
  TopicName:
    Type: String

# EBS Snapshotの完了通知を受信するEメールアドレスを指定
  Endpoint:
    Type: String

Resources:
# ------------------------------------------------------------# 
# LifecyclePolicy Create
# ------------------------------------------------------------# 
  LifecyclePolicy:
    Type: AWS::DLM::LifecyclePolicy
    Properties: 
      Description: "EBS-Snapshot Buckup Cross-Region"
      ExecutionRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/AWSDataLifecycleManagerDefaultRole"
      PolicyDetails: 
        ResourceTypes: 
          - "VOLUME"
        Schedules:
          -
            Name: !Sub "${EBSNameTag}-daily-snapshot"
            CreateRule: 
              Interval: 24
              IntervalUnit: HOURS
              Times: 
                - "15:00"
            RetainRule: 
              Interval: 30
              IntervalUnit: DAYS
              
            CrossRegionCopyRules: 
              -
                Encrypted: false
                RetainRule: 
                  Interval: 30
                  IntervalUnit: DAYS
                Target: us-east-1

        TargetTags: 
          -
            Key: "Name"
            Value: !Ref EBSNameTag
      State: "ENABLED"
      Tags: 
        - 
          Key: Name
          Value: !Sub "${EBSNameTag}-daily-snapshot"

# ------------------------------------------------------------# 
# CloudWatch Events Create
# ------------------------------------------------------------# 
  ConfigEventsRule:
    Type: AWS::Events::Rule
    Properties: 
      Description: CloudWatch Ebents EBS Snapshot Configuration
      EventBusName: default
      EventPattern: 
        source: 
        - aws.ec2
        detail-type: 
        - 'EBS Snapshot Notification'

      Name: !Ref CloudWatchEventName
      State: ENABLED
      Targets: 
        -
          Arn: !Sub "arn:aws:sns:ap-northeast-1:${AWS::AccountId}:${ConfigSNSTopic.TopicName}"
          Id: !Ref TopicName

# ------------------------------------------------------------# 
# SNS Topic & Subscription Create
# ------------------------------------------------------------# 
  ConfigSNSTopic:
    Type: AWS::SNS::Topic
    Properties: 
      Subscription: 
        -
          Endpoint: !Ref Endpoint
          Protocol: email
      Tags: 
        -
          Key: Name
          Value: !Ref TopicName
      TopicName: !Ref TopicName
```

#構築手順
１、cloudformationのコンソールからスタックを作成し、テンプレートファイルを読み込む。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/eec33363-8ed3-8bb8-41bb-445121d14eaa.png)
２、各種パラメータを入力する。

|パラメータ |  入力内容 | 
|:------------|:------------|
| EBSNameTag |ターゲットリソースタグを指定|
| CloudWatchEventName |CloudWatch Event名を指定|
| TopicName |SNSトピック名を指定|
| Endpoint |バックアップ完了通知を受信するEメールアドレスを指定|
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/caca479d-b8f8-7bc5-290d-fa74aedec01e.png)
３、作成したスタックが「CREATE_COMPLEATE」と表示さえていることを確認する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/2532fd6a-d662-fd11-f746-a028b6b0f0ad.png)

#設定確認

###１. DLM
１、ライフサイクルマネージャーへ移動し、ライフポリシーが作成されていることを確認する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/18ae7df7-b27d-2082-43f1-4968aef643a8.png)
２、詳細タブへ移動し、テンプレート通りに設定されていることを確認する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/5277758f-15b3-cbd9-c4bd-30478eea1e44.png)
３、スケジュールタブへ移動し、テンプレート通りに設定されていることを確認する。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/6a99538b-e7b2-23b9-ba34-bf753e2bcc24.png)
###2. SNS
１、SNSコンソールからトピックへ移動し、テンプレートで指定したSNSトピックが作成されていることを確認する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/b5ac8e91-e799-395a-c013-9b46a19893fa.png)
２、サブスクリプションへ移動し、保留中のサブスクリプションが作成されていることを確認する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/5bc313c3-c6c3-206f-4d76-50fd1fafb894.png)
３、エンドポイントで指定したEメールへアクセスし「AWS Notification - Subscription Confirmation
」の件名のメールを開いて「Confirm subscription」をクリックする。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/885b03b6-76e5-a967-e1d8-cc8596ca60bc.png)
４、「Subscription confirmed!」が表示されていることを確認する。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/cd52a1b4-3759-8e9b-fc08-4c237860beaa.png)
５、「保留中の確認」から「確認済み」に変更されていることを確認する。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/8e2d5945-17b6-3914-1f44-5795aef4506c.png)

###3. CloudWatch Events
１、作成したCloudWatchイベントをクリックする。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/c7d5bf40-ee69-0a3e-74b5-194fb283193b.png)
２、イベントパターンがスナップショット通知であること、ターゲットが作成したSNSトピック名となっていることを確認する。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1408197/f01e8eef-7a7d-5184-a4f8-e9d0a89225bc.png)

#終わりに
今回はCloudFormaitonを使って自動バックアップとバックアップ完了通知をGmailに飛ばす設定を紹介しました。
今回で一気にコード化出来る幅が広がりました！
他のAWSリソースでコード化が実現出来たら随時Qiitaに投稿します♪