AWS Backupの設定およびBackupジョブ失敗時の通知設定方法

# この記事は
今年の1月に[AWS Backupの機能がアップデートされ](https://aws.amazon.com/jp/about-aws/whats-new/2020/01/aws-backup-adds-support-amazon-elastic-cloud-compute-instance-backup/)、AMIも自動で取得できるようになりました。

この記事ではタイトルにも記載されている通り、AWS Backupの設定およびBackupジョブ失敗時の通知設定方法を紹介します。

また、手順にも記載されておりますがBackupジョブの通知先としてSNSを設定する際、現状CLIを使った操作が必ず必要になるので注意してください。

# ①. Backupジョブ失敗時の通知先となるSNSトピックを作成
## ①-1. SNSトピックを作成
<img width="779" alt="fig1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/5c7317af-ec81-3d78-3bf5-4732581c42d3.png">

## ①-2. JSONエディタを編集
**SNSのARN(2箇所あるので注意)** と **AWSアカウントID** の箇所は適宜置き換えること。
SNSのARNは `arn:aws:sns:リージョン名:AWSアカウントID:SNSトピック名`

```json
{
	"Version": "2008-10-17",
	"Id": "__default_policy_ID",
	"Statement": [
		{
			"Sid": "__default_statement_ID",
			"Effect": "Allow",
			"Principal": {
				"AWS": "*"
			},
			"Action": [
				"SNS:Publish",
				"SNS:RemovePermission",
				"SNS:SetTopicAttributes",
				"SNS:DeleteTopic",
				"SNS:ListSubscriptionsByTopic",
				"SNS:GetTopicAttributes",
				"SNS:Receive",
				"SNS:AddPermission",
				"SNS:Subscribe"
			],
			"Resource": "SNSのARN",
			"Condition": {
				"StringEquals": {
					"AWS:SourceOwner": "AWSアカウントID"
				}
			}
		},
		{
			"Sid": "__console_pub_0",
			"Effect": "Allow",
			"Principal": {
				"Service": "backup.amazonaws.com"
			},
			"Action": "SNS:Publish",
			"Resource": "SNSのARN"
		}
	]
}
```

# ②. バックアップボールトの作成
## ②-1. AWS Backupのコンソールへ移動

## ②-2. バックアップボールトを作成

<img width="1367" alt="fig2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/19b543f5-2f78-95cc-d1e1-a1f0cd78ec79.png">

---

<img width="588" alt="fig3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/fd734e0c-f87b-6b8d-1f2b-6f199959c547.png">

## ②-3. AWS CLI を使用して、-backup-vault-events を BACKUP_JOB_COMPLETED に設定して put-backup-vault-notifications コマンドを実行

**<span style="color: #d61b09">現状、コンソール画面から設定する手段が無いため、CLIを使って操作する必要があります。</span>**

- endpoint-url: バックアップボールトがある AWS リージョンのエンドポイントを入力 ※東京リージョンなら `https://backup.ap-northeast-1.amazonaws.com`
- backup-vault-name: バックアップボールトの名前を入力
- sns-topic-arn: 作成した SNS トピックの ARN を入力

```
aws backup put-backup-vault-notifications --endpoint-url https://backup.eu-west-1.amazonaws.com --backup-vault-name examplevault --sns-topic-arn arn:aws:sns:eu-west-1:111111111111:exampletopic --backup-vault-events BACKUP_JOB_COMPLETED
```

[※公式ドキュメントから引用](https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-backup-failed-job-notification/)

##  ②-4. get-backup-vault-notifications コマンドを実行し、SNSの設定が反映されていることを確認
- backup-vault-name: バックアップボールトの名前を入力

```
aws backup get-backup-vault-notifications --backup-vault-name examplevault
```

以下のように出力されればOKです。

```json
{
    "BackupVaultName": "examplevault",
    "BackupVaultArn": "arn:aws:backup:eu-west-1:111111111111:backup-vault:examplevault",
    "SNSTopicArn": "arn:aws:sns:eu-west-1:111111111111:exampletopic",
    "BackupVaultEvents": [
        "BACKUP_JOB_COMPLETED"
    ]
}
```

[※公式ドキュメントから引用](https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-backup-failed-job-notification/)

# ③. サブスクリプションの作成

## ③-1. SNSのコンソールへ移動後、①で作成したSNSトピックをクリック

## ③-2. サブスクリプションの作成を押す

<img width="1130" alt="fig4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/6319ee21-a196-f478-8bd9-34c92698d90f.png">

## ③-3. 詳細箇所を入力する
- トピック ARN：①で作成したSNSトピックを選択

プロトコル、エンドポイントは通知先に応じて適宜変更してください。
エンドポントにDatadogのWebhook URLを指定すると、Backupジョブの失敗通知をDatadogで受け取ることができます。

**■参考記事：[Datadog で AWS SNS を受け取る (RDS/ElastiCacheイベント)](https://cloudpack.media/40461)**

今回はメールで失敗通知の受信を行います。

## ③-4. サブスクリプションフィルターポリシーに下記を貼り付ける

```json
{
  "State": [
    {
      "anything-but": "COMPLETED"
    }
  ]
}
```

---

<img width="799" alt="fig5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/bdadc8a0-80aa-d34e-d017-d3809cdd9cd8.png">

# ④. AWS Backupの構築
## ④-1. AWS Backupのコンソールへ移動

## ④-2. 「バックアッププランを作成」を押す
<img width="810" alt="fig6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/c5c77f31-9b56-f468-2eaf-a8a95862625a.png">

## ④-3. 「新しいプランを立てる」を押し、バックアッププラン名を入力

<img width="588" alt="fig7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/ab6d295e-ac74-75e6-3d00-75abc0043341.png">

## ④-4. スケジュールを設定
下記設定で毎日、06:00 AM 〜 07:00 AM (JST) の間にAMI取得が開始される。

<img width="548" alt="fig8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/1f312283-3c5a-ff1d-edc7-bf51051f853b.png">

## ④-5. ライフサイクル設定
以下の設定でBackup世帯数が2になる。バックアップボールトには②で作成したものを選択すること。

<img width="555" alt="fig9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/da05e55b-0fdd-8f4e-f0a4-cd60db1dd022.png">

## ④-6. 「リソースを割り当てる」を押す

<img width="1155" alt="fig10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/f73d2aa6-c7be-9d93-5e09-d409a584b29d.png">

## ④-7. リソースを割り当てる
今回はタグで管理してます。インスタンスIDを直接指定することも可能です。

<img width="626" alt="fig11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/37fa4088-ab14-a74e-bd94-78208c612e14.png">

## ④-8.Backupを取得したい対象リソースに対してタグを付ける

<img width="1235" alt="fig12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/7715a1e0-45f5-d909-1db0-c9b3c2b85ef4.png">

**これで設定は完了です。**

# ⑤. Backupジョブ失敗の通知テスト
[※公式ドキュメントから引用](https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-backup-failed-job-notification/)

## ⑤-1. 保護されたリソースからオンデマンドバックアップの作成を押す

<img width="1158" alt="fig13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/4792f32c-f926-e111-2930-b480b0ce156c.png">

## ⑤-2. 設定を行いオンデマンドバックアップを作成を押す
ここの設定画面で大事な箇所は以下の2点

- 今すぐバックアップを作成
- バックアップボールトを②で作成したものにする
<img width="579" alt="fig14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/d24377f3-b983-2494-9d76-f97a2511ba14.png">


## ⑤-3. バックアップジョブが実行されるのを確認

## ⑤-4. もう一度オンデマンドバックアップを作成を押す(設定もさっきと同じでOK)

<img width="1158" alt="fig15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/33d9259d-0c75-dadf-838b-aabe7ba1e156.png">

## ⑤-5. 今度はバックアップジョブ IDをクリック

<img width="773" alt="fig16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/33a68416-7920-50c5-c229-7e5a44bc5ce6.png">

## ⑤-6. 停止を押す
<img width="1330" alt="fig17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/0183109e-4d8c-552c-d8dc-31f36f335b92.png">

## ⑤-7. ステータスが「中止しました」になることを確認

## ⑤-8. 停止したジョブの方のみ通知がきていることを確認
**ジョブを停止してから約8分後に通知が届きました。**
<img width="1097" alt="fig18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/43ccb20d-4acb-4067-ab90-81bf8382518b.png">

# おまけ

## AWS Backupで作成したAMIを削除するには

### バックアップボールトから②で作成したものを選択
<img width="1079" alt="fig19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/9aeb5cf7-2d77-7a6c-25a4-301fd51a7ee1.png">

### 作成したAMIを選択し削除を押す

<img width="880" alt="fig20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/313a415e-478a-c25e-8d7c-8ff438eb60a4.png">

## 実際にAMI Backupの取得に失敗した際に通知される内容

AMI Backupの取得が実際に失敗すると下記のように、 `An AWS Backup job failed.` というメッセージが通知されるようです。

```
An AWS Backup job failed. Resource ARN : arn:aws:ec2:*****:*****:instance/*****. BackupJob ID : *****
```