AWS BackupでEBS/RDS/S3のバックアップを取得してみた

# はじめに
お疲れ様です。yuki_inkです。
AWS Backupについて調べる機会があったので、トライ&エラーを含めて記事としてまとめておきます。

今回の設定にあたり参考にした手順は以下です。
クラメソ様、いつもありがとうございます！！

https://dev.classmethod.jp/articles/aws-backup-for-ec2/


# 下準備

今回はAWS Backupによるバックアップの取得対象として、EBS、RDS、S3を対象にしてみます。

- EBS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/cf94633a-117c-36b1-d43f-b9c10263a0da.png)
- RDS
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/6ec8c920-9f1b-1db3-ad36-ee8664d220cd.png)
- S3
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f4ade835-c0ff-1adb-12b5-f90e37b2efb1.png)

:::note warn
AWS BackupでS3のバックアップを作成するには、対象のS3バケットでバージョニングを有効にする必要があります。
:::

> AWS Backup for Amazon S3 を使用するには、S3 バケットで S3 バージョニングを有効にする必要があります。 AWS ではデータ保護のベストプラクティスとして S3 バージョニングを推奨しているため、この前提条件を維持しています。
>
> S3 バージョンのライフサイクル有効期限を設定することをお勧めします。 ライフサイクルの有効期限を設定しないと、AWS Backup が S3 データの期限切れになっていないバージョンをすべてバックアップして保存するため、S3 のコストが増加する可能性があります。 S3 ライフサイクル ポリシーの設定の詳細については、[このページ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-expire-general-considerations.html)の手順に従ってください。

https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/s3-backups.html


# バックアップの作成
### バックアップボールトの作成

> まず、バックアップボールトを作成します。バックアップボールト（Backup Vault）は、バックアップを格納する倉庫のようなものです。作成されたバックアップは、こちらのバックアップボールトに保存されます。
>
>（出展）[AWS Backupを使ってEC2のバックアップの設定を行い、ついでに復元までやってみた](https://dev.classmethod.jp/articles/aws-backup-for-ec2/)

以下のように作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f4f8b0f0-0b1c-a395-34c7-0fb56bd935e0.png)

### バックアッププランの作成

バックアッププランは、いつ、どのように、どのリソースのバックアップを取得し、どこに格納するか、を定義するポリシーです。
次のようなことを定義できます。
- 利用するバックアップボールト
-  バックアップの頻度
-  バックアップの時間帯
-  ポイントインタイムリカバリの設定
-  ライフサイクルの設定（一定期間後にバックアップをウォームストレージからコールドストレージに移動）
-  対象リソースの選択


今回は以下のように作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/13f861c6-707f-58d6-11b7-4271d0541a1d.png)

:::note info
AWS Backupでは、直接的に保管世代数を設定することはできません。
「バックアップ頻度」と「合計保持期間」を調整することで、保管世代数を設定します。
:::

「次の時間以内に開始」と「次の時間以内に完了」の設定項目については、以下記事のご説明が分かりやすかったです。
今回は検証なので、それぞれ短めの値にしました。

> 例えば、「次の時間以内に開始」を最低値の 1 時間に設定した場合、何らかの問題でバックアップを開始できない場合、1時間で「Expired」となります。
> そのため、許容できる時間範囲内を広めに設定し、その時間範囲内にて定期的にバックアップを実行するといった形が想定されます。
> また、大規模なデータをバックアップする場合は、「次の時間以内に終了」を十分長い期間に設定する必要がありそうです。
>要件に合わせて適切な値を設定することが望ましいと考えられます。

https://dev.classmethod.jp/articles/aws-backup-backupwindow-customize/

次の画面でリソースの割り当てを行います。
ますはEBSのみ設定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/3eb9cf9a-53a6-75b8-e453-c46ae9933928.png)

リソースの割り当てはかなり柔軟に行える印象です。
雑に「すべてのボリューム」とすることもできますし、個別にボリュームを指定することもできます。
タグの値で対象を指定することもできるようです。

https://dev.classmethod.jp/articles/aws-backup-resource-name/

バックアッププランができました。
以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f1dcfa66-eec8-c88b-69ea-80b8cdcc09ed.png)


「リソースの割り当て」にRDSとS3も追加していきます。
- RDS
ついでにAuroraも対象にしておきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/7ef86bcb-abbd-fa1d-5469-d72a8878fbb3.png)

- S3
S3はバケット指定で設定してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/8a19b32b-9275-b54f-54a9-2fe41fdd5cfe.png)

設定完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/98b82bf3-0029-1612-90e5-05bc8dcf737a.png)

:::note warn
繰り返しになりますが、AWS BackupでS3のバックアップを作成するには、対象のS3バケットでバージョニングを有効にする必要があります。
バージョニングが有効化されていないバケットを割り当てに追加しようとすると、以下の通りエラーが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/afd73210-6c92-27e2-5d17-bcf7a6fac864.png)
:::

# 取得されたバックアップの確認（失敗例）
「ジョブ」画面から、各バックアップの取得のステータスを確認します。
…おや（　＾ω＾）？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/71bf572a-7c42-0100-49aa-d489d916bb88.png)


:::note info
以下、失敗例としてありのままお届けします。
あるあるなミスだと思うので、他山の石としていただければと思います・・・
:::


### 失敗① RDS停止時はバックアップの取得ができない
まず、RDSのバックアップが失敗していました。
費用削減のためにRDSを停止してしまっていたんですが、それが原因でバックアップの取得に失敗しました。
この挙動はRDSのバックアップウィンドウと一緒ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/ab6a3e33-88f9-0bb8-6f79-f2497ef62f3a.png)

おとなしくRDSを起動させました。


### 失敗② IAMロールの権限不足
S3のバックアップも失敗していました。
詳細を確認すると、 `Your backup job failed as AWS Backup does not have permission to describe resource arn:aws:s3:::awsbackup-test-1. Please review your IAM policies to ensure AWS Backup can protect your resources.` とのこと。 
~~いや、「デフォルトのロール」にその権限付いてないんかい！~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f836e63a-5e08-7b12-5a2f-66066cbcfb01.png)

以下の記事に助けられました。
> AWS Backupにはデフォルトロールの用意がありますが、S3のポリシーは含まれていません。
AWS管理ポリシーにS3Backupのポリシーは用意されています。
（出展）[AWS Backup for Amazon S3を使ってみた](https://qiita.com/ma_igarashi/items/7e2f0a28405d8b65a95e)

というわけで、デフォルトのIAMロール `AWSBackupDefaultServiceRole` に以下のAWS管理ポリシーを追加。
- AWSBackupServiceRolePolicyForS3Backup
- AWSBackupServiceRolePolicyForS3Restore

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f6f7568f-2d0b-f5ab-eb84-7466981d063d.png)


# 取得されたバックアップの確認（成功例）
いろいろありましたが、結果的にバックアップが取得されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/51de0ddb-ac7d-8749-7296-02058ae30f94.png)

「バックアップボールト」画面からも、復旧ポイントという形で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/dec76bb2-c752-8ab3-a7e8-01d2e4d962c4.png)

## 各サービスの画面上での確認
AWS Backupにより取得されたバックアップが、各サービスの画面上でどのように表示されるのか、確認してみました。

### EBSのバックアップ
普通のスナップショットと同様に、スナップショットとして表示されました。
説明欄で `This snapshot is created by the AWS Backup service.` と記載されているのがポイントですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b928e3ed-373f-a618-3311-018194e4de37.png)

### RDSのバックアップ
RDSの「スナップショット」画面の「バックアップサービス」のタブから確認できました。
スナップショット名にジョブIDが付与されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/ee1f6c6b-2ab5-4109-3497-6cd3c3cc567a.png)


### S3のバックアップ
見つけられませんでした。。

そもそもS3ってそもそもが高可用性で、バックアップ取る必要ないよね！！
いやいや、**ランサムウェア対策**としては、定期的にS3の断面をバックアップとして取得しておくのは大事なんですよ、
という話は後日続編で書こうと思いますw

https://aws.amazon.com/jp/blogs/news/safeguard-healthcare-data-from-ransomware/

# (追記) AWS Backupの設定後に追加したリソースのバックアップ取得について
EBSとRDSについては、リソースの割り当ての際にすべてのリソースを指定しました。
とはいえ、その設定時点では作成されていなかったリソースについては、ちゃんとバックアップを取ってくれるのだろうか？
心配になって確認してみました。

**結果、設定後に追加したリソースのバックアップについても問題なく取得してくれました。**

### EBSのバックアップ

EBS「test3」を新規作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/aa072ce4-80e3-92e9-2dae-50bcb67f7f87.png)

次回のバックアップのタイミングで、「test3」のスナップショットが作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b89d4171-0b76-73d5-6c46-eabf289adeab.png)

### RDSのバックアップ
RDS「database-2」を新規作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/2bf33e6d-9b0e-7c8c-9beb-f0795499e3ea.png)

次回のバックアップのタイミングで、「database-2」のスナップショットが作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/53a579af-ff40-420f-0b15-0419e2a0d6ec.png)

# 終わりに
思ったより長い（冗長な…）記事になってしまったので、ここで区切りたいと思います。
次はバックアップからの復元と、ランサムウェア対策たりえる「ボールトロック」機能の検証をやってみます。

最後までお目通しいただき、ありがとうございました。