AWS Backup のモニタリングを設定する

## はじめに
2021/2/3 に AWS Backup のイベントとメトリクスが Amazon EventBridge と Amazon CloudWatch で利用可能になりました。

https://aws.amazon.com/jp/about-aws/whats-new/2021/02/aws-backup-events-metrics-available-amazon-cloudwatch/

これまでも [AWS Backup Notification API](https://docs.aws.amazon.com/aws-backup/latest/devguide/sns-notifications.html#sns-cli-commands) により Amazon SNS を使用したイベント通知を行うことも可能でしたが、このアップデートによって、より多くのバックアッププロセスをモニタリングできるようになりました。

上記を使用して AWS Backup のモニタリングを設定する流れについて記載します。
以下には触れません。

* AWS Backup 自体の詳細や設定手順
* AWS Backup Notification API による通知の設定手順
* AWS CloudTrail による API Call のモニタリング

## Amazon CloudWatch
### 概要
CloudWatch のメトリクスでは大きく分けるとバックアップジョブおよび復旧ポイントに関するメトリクスを取得することができます。
2021年3月時点で取得可能なメトリクスは以下のとおりです。 (AWS ドキュメントより引用)

**バックアップジョブに関するメトリクス**

|メトリクス|概要|
|---|---|
|NumberOfBackupJobsCreated|作成されたバックアップジョブの数|
|NumberOfBackupJobsPending|実行しようとしているバックアップジョブの数|
|NumberOfBackupJobsRunning|現在実行されているバックアップジョブの数|
|NumberOfBackupJobsAborted|スケジュールされたが、開始されなかったバックアップジョブの数|
|NumberOfBackupJobsCompleted|完了したバックアップジョブの数|
|NumberOfBackupJobsFailed|失敗したバックアップジョブの数|
|NumberOfBackupJobsExpired|ライフサイクル設定に基づいて削除を試行したが削除できなかったバックアップジョブの数|
|NumberOfCopyJobsCreated	|クロスアカウントおよびクロスリージョンコピージョブの数|
|NumberOfCopyJobsRunning	|現在実行されているクロスアカウントおよびクロスリージョンコピージョブの数|
|NumberOfCopyJobsCompleted	|完了したクロスアカウントおよびクロスリージョンコピージョブの数|
|NumberOfCopyJobsFailed	|失敗したクロスアカウントおよびクロスリージョンコピージョブの数|
|NumberOfRestoreJobsPending|実行しようとしている復元ジョブの数|
|NumberOfRestoreJobsRunning|現在実行されている復元ジョブの数|
|NumberOfRestoreJobsCompleted|完了した復元ジョブの数|
|NumberOfRestoreJobsFailed|失敗した復元ジョブの数|

**復旧ポイントに関するメトリクス**

|メトリクス|概要|
|---|---|
|NumberOfRecoveryPointsCompleted|作成された復旧ポイントの数|
|NumberOfRecoveryPointsPartial|作成を完了できなかったリカバリポイントの数
|NumberOfRecoveryPointsExpired|ライフサイクル設定に基づいて削除を試行したが削除できなかった復旧ポイントの数|
|NumberOfRecoveryPointsDeleting|削除を実行している復旧ポイントの数|
|NumberOfRecoveryPointsCold|ライフサイクル設定に基づいてコールドストレージに移行された復旧ポイントの数|

またディメンションには AWS Backup で取得するリソースタイプとバックアップボールト名を利用できますので、EC2 などの特定のリソースタイプや任意のバックアップボールトの単位、またはその組み合わせでアラームを設定することができます。

### アラームの設定
どのメトリクスを監視すべきかについてはシステム要件によって異なるかと思いますが、`NumberOfBackupJobsFailed` のアラームをコンソール上から定義してみます。

CloudWatch コンソールのアラームからアラームの作成を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/c607c18e-2392-b8b4-bb08-6383523f438f.png)

メトリクスの選択では AWS の名前空間 から AWS Backup を選択します。
ここでは Default のバックアップボールトかつ、EC2 のバックアップに対するアラートを設定したいと思いますので、`Resource Type Metrics by Backup Vault` からメトリクスを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/f8366326-1b2b-4102-8505-c1f5ca059ae3.png)

以下のように、`ResourceType: EC2`, `BackupVault: Default`, `メトリクス名: NumberOfBackupJobsFailed` にチェックし、メトリクスの選択を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/465aa68a-643e-a2e2-966c-d5db45a57d9e.png)

選択時に出力されるメトリクスの数は実際の AWS アカウント内の設定、運用状況により異なります。これまでバックアップに失敗していない場合は `NumberOfBackupJobsFailed` 自体が表示されない可能性があります。その場合、異なるメトリクスを選択後に手動でメトリクスを書き換えることもできます。

メトリクス選択後に条件を指定します。
ここでは統計を合計に、静的なしきい値の条件を 1 以上として次に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/0eb42ee9-3db2-3977-656c-bca392bad676.png)

アクションの設定で通知先の SNS Topic を選択するか新規作成します。ここでは AWS Chatbot 用に定義済みの SNS Topic を選択し、Slack に通知してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/2e8ec21a-9ea0-07d3-b12d-1b11ab272cc0.png)

AWS Chatbot の設定例については以前書いた記事で紹介しておりますので、詳細を確認したい方は参照いただければと思います。

https://qiita.com/hayao_k/items/529539bbb07736ea0f41

最後にアラーム名と説明 (オプション) を指定してアラームの作成を完了します。
今回は BackupJobFailed というアラーム名を設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/14ae811f-b7b8-4da3-3656-c8aa55d40ed8.png)

以下は実際にバックアップを失敗させたときの Slack へのアラーム通知例です。CloudWatch メトリクスの通知では対象のリソース ID までは確認できないことに注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/a886a6a7-3610-16a2-7725-6908a7d7608e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/cc3d70ca-7601-9b70-da34-c71f4432fd55.png)

参考まですが、意図的にバックアップジョブを失敗させる方法としては、テスト用の EC2 インスタンスを起動&終了させ、終了したインスタンスを指定してオンデマンドバックアップを実行する手順が簡単かと思います。

## Amazon EventBridge
### 概要
EventBridge ではバックアッププロセスに関するより多くのステータス変化をイベントとして検知することができます。
2021年3月現在で検知可能なイベントは以下のとおりです。 (AWS ドキュメントより引用)

|Event type|	States|
|---|---|
|Backup Vault State Change|	CREATED, DELETED, MODIFIED|
|Backup Plan State Change|	CREATED, DELETED, MODIFIED|
|Backup Job State Change|	CREATED, ABORTED, COMPLETED, FAILED, EXPIRED, PENDING, RUNNING|
|Copy Job State Change|	CREATED, COMPLETED, FAILED, RUNNING|
|Restore Job State Change|	CREATED, COMPLETED, FAILED, PENDING, RUNNING|
|Recovery Point State Change|	MODIFIED, COMPLETED, PARTIAL, EXPIRED, DELETED|
|Region Setting State Change|	MODIFIED|

バックアップジョブや復旧ポイントに関する情報だけでなく、バックアップボールトやバックアッププランなどの設定に対する状態変化を追うことができます。
AWS Backupは、5分ごとにベストエフォートでイベントを EventBridge に送信するため、リアルタイムの検知ではないことにご注意ください。
また残念ながら 2021/3/15 時点で EventBridge のスキーマレジストリにスキーマ情報の登録がありません。参考までに Backup Job State Change では以下のようなイベントが発行されます。

```json
{
    "version": "0", 
    "id": "12345abc-defg-6789-hijk-012345lmnopq", 
    "detail-type": "Backup Job State Change", 
    "source": "aws.backup",
    "account": "123456789012", 
    "time": "2021-03-15T07:11:40Z",
    "region": "ap-northeast-1",
    "resources": [], 
    "detail": {
        "backupJobId": "abcde012-3456-efgh-7890-ijklmn123456",
        "backupVaultArn": "arn:aws:backup:ap-northeast-1:123456789012:backup-vault:Default", 
        "backupVaultName": "Default",
        "bytesTransferred": "0", 
        "creationDate": "2021-03-15T07:11:37.928Z", 
        "iamRoleArn": "arn:aws:iam::123456789012:role/service-role/AWSBackupDefaultServiceRole", 
        "resourceArn": "arn:aws:ec2:ap-northeast-1:123456789012:instance/i-xxxxxxxxxxxxxxxxx", 
        "resourceType": "EC2", 
        "state": "FAILED",
        "statusMessage": "Invalid value 'i-xxxxxxxxxxxxxxxxx' for instanceId. Instance is not in state 'running' or 'stopping' or 'stopped'", 
        "startBy": "2021-03-15T08:11:37.928Z",
        "percentDone": 0.0
    }
}
```

バックアップ対象のリソース ID やバックアップ失敗時のステータスメッセージなど CloudWatch メトリクスよりも詳細な情報を確認できます。


### 設定例
イベントルール作成時のイベントパターン定義でサービス毎の事前定義パターンとして`サービス名: Backup` と前述のイベントタイプを選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/dff70ff2-98d2-c6f0-ca39-30e3914ad7fe.png)

上記で設定されるデフォルトのイベントパターンではバックアップジョブに対するすべての状態変化を検知してしまいます。FAILED と ABORTED だけなど特定のステータスのみを検知したい場合は、前述のイベント例を参考に以下のようにイベントパターンを編集します。

```json
{
  "source": ["aws.backup"],
  "detail-type": ["Backup Job State Change"],
  "detail": {
    "state": [
      "ABORTED",
      "FAILED"
    ]
  }
}
```

イベントパターンの定義後、任意のターゲットアクションを設定してイベントルールの作成を完了します。
動作確認例は割愛しますが、バックアップジョブ失敗時ターゲットに指定した Lambda 関数が起動されることを確認しています。

## 結局どれを使えばいいのか
CloudWatch メトリクスと EventBridge の AWS サービスイベントに加えて AWS Backup Notification API を含めると 3 通りの設定方法があることになります。
CloudWatch メトリクスのメリットはダッシュボードによる可視化、既存アラーム運用への統合がしやすいという点があります。
一方で EventBridge ではリソース ID やステータスメッセージなどの詳細情報を取得しつつ、Lambda 関数などの任意のアクションを設定することが可能であるため、より柔軟な対応が可能です。また意図しない構成変更等も検知できるため、基本的には CloudWatch メトリクスと併用できるものです。

AWS Backup Notification API を使用する場合でも以下のような設定を行うことでバックアップジョブ失敗のモニタリングを行うこともできますが、若干手順がわかりにくいです。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-backup-failed-job-notification/

また EventBridge や CloudWatch メトリクスはバックアップボールトや、コピージョブ、リージョン設定など Notification API よりも多くの状態変化を検知できますので、新規で設定するのであれば基本的には AWS Backup Notification API は対象外として問題ないのではと考えます。


## 参考
公式ドキュメント

https://docs.aws.amazon.com/aws-backup/latest/devguide/monitoring.html

以前書いた記事

https://qiita.com/hayao_k/items/a4f18d030e0e58063f64

以上です。
参考になれば幸いです。