AWSのバックアップサービスと言えば、これ！！！AWS Backupについて～AWS100本ノック～30/100

# はじめに
[前回の記事](https://qiita.com/namasa/items/00f7266e1c340fdf1b30)では、DRに紹介しました。
今回はDRアプローチの1つ`バックアップ＆リストア`を行う際に有効なAWS Backupについて紹介します。

最初にざっくりの全体像です！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7bc29e33-751e-42a9-ad28-dc3e1cad8964.png)


# AWS Backupとは？
AWSサービス全体のデータのバックアップ取得から復旧プロセスまで**一元的に管理・自動化**をすることが出来るサービスです

AWS Backupを利用することで以下のようなメリットがあります。
- **AWSとアプリケーションリソースデータ保護を簡素化**
- **DRと事業継続の基盤を構築**
- **ランサムウェアやアカウント侵害から保護およびリカバリ**
- **データ保護コンプライアンスを管理**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/e0b33f00-e764-4d36-a44c-2d1230dccb32.png)


## (おさらい)バックアップ＆リストアとは
**データの損失や破損を軽減**するアプローチです。
データをDR先にレプリケートすることでリージョンの災害を軽減したり、単一のアベイラビリティーゾーンにデプロイされたワークロードの冗長性の欠如を軽減したりするために使用できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0baa9606-6779-4a05-ace3-a134bec5fbbf.png)

具体的にバックアップ＆リストアを行うためには、どんなプロセスがあるかというと以下の4つになります。
- **バックアップの設計**
- **バックアップの保護**
- **バックアップの自動化**
- **バックアップの復旧**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/676d8bb3-ae01-4e14-b907-bd1b0a5561b6.png)

では、AWS Backupの各機能がこれらの4つのプロセスにどう関係していくか説明していきます。

## AWS Backupの全体
まず、AWS Backupの全体としては以下のようになります。
ざっくり言うと、
- バックアップしたいAWSサービスを決めて
- どのくらいの頻度でバックアップするか決めて
- どのくらいバックアップを保存するか決める
という感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/c99f3a3c-ea9b-41ce-a425-1de67995a384.png)

図に出てくる各用語については、以下のようになります。
※詳細はこの後説明します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/90364a85-404f-4033-a462-b06846160ddc.png)


## AWS Backupの各機能とプロセスの関係
AWS Backupの各機能がどのプロセスに対応しているかですが、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0b56ba2a-b356-4237-b4d1-5eb9ff017d2b.png)

# 各機能の説明
では、各機能について実際に触りながら説明していきます。
今回は、同一アカウントに作成した東京リージョンのS3バケットから大阪リージョンのS3バケットに、バックアップを行って、大阪リージョンで復元するところまで試してみます。

## 0. S3バケットの作成
まず、東京リージョンと大阪リージョンにバケットを作ります。

- 東京リージョンに`aws-backup-source`
- 大阪リージョンに`aws-backup-target`

というバケットを作って、東京リージョンのバケットに適当なファイルをアップロードしておきます。
注意点として、AWS BackupでS3のバックアップを作成する際は、**バージョニングを有効**にする必要があります。

また、ライフサイクルで有効期限を設定して不要なオブジェクトの削除を行わないと、過去バージョンのオブジェクトのバックアップもしてしまうので、コストがかさんでしまいます。

S3のバージョニングとライフサイクルって何だろう？って思った方は、以前書いた[こちらの記事](https://qiita.com/namasa/items/8af66d7ce60ec0c8c43d)を見てください:smile:

## 1. バックアップボールトの作成
ここからAWS Backupの設定をしていきます。
バックアップボールトの**ボールト(Vault)は日本語だと保管庫**を表し、AWSの定義としては**復旧ポイント(バックアップ)を保存・整理するコンテナ**になります。
お金を保護する金庫みたいな感じですかね？ :thinking: 

プロセスとしては`バックアップの保護`にあたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/3f0cacfb-1768-4655-90e7-3fb49e62336e.png)

バックアップボールトで、特定の復旧ポイントを選択して復元操作を行うことで、任意の状態にデータを復元することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/5ff8085b-d8c2-4c2f-9ca1-bafcf6939da5.png)

次に、バックアップボールドに付随する機能について説明します。

### ボールトロック
その名の通り、指定したバックアップボールトを**指定した期間ロック(変更/削除出来ないようにする)機能**です。
ボールトロックには`ガバナンスモード`と`コンプライアンスモード`の2つがあり、コンプライアンスモードでロックしたバックアップボールトは、**rootユーザであろうと**指定した期間は削除できなくなるので、注意が必要です。

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/83870caf-49de-4f22-9fd6-884aa1cc3bd9.png)

![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/ac92badd-0750-4382-ad5e-e60c1bfea36e.png)

### リーガルホールド
次にリーガルホールです。日本語だと`法律上の保持`ですかね？ :thinking: 
これはボールトロックと似ているのですが、**AWS Backupで取得したバックアップの保持期間を延長する機能**です。

例えば、バックアップの保持期間が30日に設定されてバックアップされているとします。
しかし、監査や不具合調査の難航など、何かしらの理由で延長したいとなった場合に、後述のバックアッププランでの保持期間延長だと**既存のバックアップに対しては適用されません。**

そういったケースの場合に、リーガルホールドを適用することで、その間は**保持期間のカウントを停止**することが出来ます。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/29e7c726-b18f-44d3-9869-19f53b6d7e8f.png)


:::note info
ボールトロックとリーガルホールドの違いは以下になります。

１．ボールトロックの適用範囲は**バックアップボールトだけ**だが、リーガルホールドは**リソースタイプとバックアップの作成日の範囲選択**(過去日のみ)が可能
２．ボールトロックのコンプライアンスモードは**rootユーザーであっても**解除できないが、リーガルホールドは**IAMで権限があれば**解除できる
３．ボールトロックしていても**バックアップの保持期間が経過したものは**削除される

なので、使い分けけとしては
- バックアップの手動削除を防ぎたい👉ボールトロック
- バックアップの自動削除を防ぎたい👉リーガルホールド

かなと思います。
:::

### アクセスポリシー
最後にアクセスポリシーです、
これは他のAWSサービスと同様、**リソースへのアクセスを制限**するポリシーです。

プロセスとしては`バックアップの保護`にあたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/fcab32ad-d466-40c4-8ff4-fcee35cad754.png)

### 大阪リージョンにもバックアップボールトを作成
クロスリージョンでS3のバックアップを取る場合は、コピー先の大阪リージョンにもバックアップボールトを作る必要があるため、先ほどと同様に作っておきましょう:smile: 

## 2. バックアッププラン
バックアップボールドを作ったので、そこに割り当てるバックアッププランを作成していきます。

プロセスとしては`バックアップの設計、バックアップの自動化`にあたります。

以下の項目を入力していき、**バックアッププラン**を作成し、プランに対して**バックアップルール**の作成と、**リソースの割り当て**を行います。
バックアッププランはただの箱みたいなものなので、特に設定値はありません。

また、バックアップルールは複数作成でき、リソースの割り当ても複数行えます。

バックアップルールとして、以下を入力します。
- バックアップボールトに、先ほど作成したボールトを選択
- バックアップ頻度を`毎時、12時間毎、毎日、毎週、毎月、カスタムcron式`から選択
- バックアップの開始時間を選択
- 保持期間を1日～永続から選択
  - 1秒単位で復元したい場合は、`PITR`(ポイントインタイムリカバリ)を設定 ※最大35日前まで
- (S3とEBSの場合)`バックアップインデックス`を必要に応じて指定
  - バックアップからファイルパスやファイルサイズなどで検索できる機能(有料)
- コピー先の大阪リージョンを指定し、先ほど作成した大阪リージョンのバックアップボールトを選択
  - プロセスとしては`バックアップの保護、バックアップの自動化`にあたります


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/becfdb61-d222-429f-8825-3cbb925f7837.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/369202a2-2e83-4e55-bf15-39ef3abd7f61.png)

バックアップルールを作成したら、バックアップを行うリソースの割り当てを行います。
- `全てのAWSサービスまたは特定のAWSサービス`を選択
- 特定のAWSサービスを選択したら、`全てのリソース or 対象のリソース`(S3ならリソース=バケット)を選択
  - 全てのリソースを選択し、一部のバケットだけ除外なども出来ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/fc1ce3a9-56af-4749-b4e4-ab414e366c1f.png)

## 3. バックアップが出来ていることの確認
では、ここでバックアップが東京リージョンと大阪リージョンで出来ているか確認してみます！
実行されたバックアップはジョブとして実行されるのですが、全てのジョブは一覧で確認することが出来ます。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/071deda1-fbd9-4bf2-a9f8-97f9f74a14b4.png)

:::note info
リソースの割り当てで、デフォルトロールを利用するとバックアップの権限が不足している可能性が高いです。
`失敗`になっているのはそれが原因でした...:cry:
どのリソースをバックアップするかによって、付与すべきポリシーは変わるので適切なポリシーをアタッチするようにしましょう。
※S3なら`AWSBackupServiceRolePolicyForS3Backup`というマネージドポリシーが用意されています
:::

復旧ポイント(バックアップ)は、`保護されたリソース`から確認できます。
問題なく、東京リージョンと大阪リージョンでバックアップ出来ていますね:smile:


![7-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/af08c9b5-a72b-44b9-8b28-50e5a997b2a1.png)

![7-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/1da71d14-c88e-4029-adbc-1bdcccaf7f21.png)



## 4. モニタリング
ジョブ一覧でバックアップの結果を確認することは出来ますが、毎回結果を人が見るのは運用効率的によくないので、*自動化*をしたいと思うかもれません。

その場合はモニタリングを行い、バックアップの結果をメールやSlackなどに通知したり、失敗した場合に再度実行させたい場合など行う必要があります。
モニタリングに適した以下の4サービスと、LambdaやSNSなどを使って運用を自動化できます。

プロセスとしては`バックアップの自動化`にあたります


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/b8c4667e-49e1-4511-a40b-d16300f2b27d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/cb657010-c53b-41ba-b518-7d0b48388347.png)


## 5. 復元
バックアップを取得したので、実際に復元してみましょう。
プロセスとしては`バックアップの復旧`にあたります

今回は大阪リージョンで試してみます。
保護されたリソースから**任意の復旧ポイント**を選択します

![8-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/dd499cbb-0e11-4c3e-9bc8-bde0e6f115af.png)
![8-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/12791371-d6a4-4ba2-89e0-977a4276ddf8.png)
![8-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/6eb97a8b-c2fb-488f-af99-0a0e4c0524bc.png)

エラーになりました。どうやらバックアップ先のバケットで復元を行う場合は、ACLを有効にする必要があるようです。　[参考](https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/restoring-s3.html)
![8-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/46ae3e6b-ced1-4d25-8c1a-4b4c4bd8e24b.png)

ACL無効化のバケットを作ってしまうと、マネジメントコンソールからは有効にすることが出来ないため、以下のCLIコマンドで有効化します。
```bash
aws s3api put-bucket-ownership-controls \
    --bucket aws-backup-target \
    --ownership-controls Rules=[{ObjectOwnership=ObjectWriter}]
```

再度、実行すると問題なく復元が完了し、対象のS3バケットにオブジェクトが保存されていました:smile:
![8-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/99c3cb04-8f74-4993-8398-eb71bdad5062.png)

![8-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/9d3734ee-2cb6-40bd-80dd-d463f36fe746.png)


:::note warn
ACLは無効化が推奨なので、復元する時だけ有効化して完了次第、無効に戻すのが良いかもしれません :thinking: 
```bash
aws s3api put-bucket-ownership-controls \
    --bucket aws-backup-target \
    --ownership-controls Rules=[{ObjectOwnership=BucketOwnerEnforced}]
```
:::


## 6. 復元テスト
最後に復元テストです。
これは全てor特定のバックアップボールトの復元が行えるか定期的にテストをするための機能になります。
復旧にかかった時間の計測も行えるので、**RTO**を満たせるかどうかの確認も行え、`DRの予行演習`をサポートできます。

プロセスとしては`バックアップの自動化、バックアップの復旧`にあたります

テスト言いつつ実際に復元をしますが、復元したデータは`すぐに削除`することも出来ますし、何かしらの検証プロセスが必要であれば`一定時間保持`することも出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0f898c23-9d2a-4ad1-afe0-659941cf6ad5.png)

試しに先ほど作成したS3のバックアップボールトのバケットに対して、毎日テストを実行するように設定してみます。
復旧ポイントは`最新`または`ランダム`を選択することが出来るので、過去分の復旧テストも簡単に行えます！


![9-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/0e9db219-d458-4254-8826-c31a0f67c3fa.png)

![9-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/72ca4d3d-89b2-43c6-b21b-ad066fa30583.png)

![9-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/b62ac3ed-4422-4202-802b-7e6e7efbb320.png)

![9-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/cc1fd111-59c5-400f-85ed-f837f70aab8f.png)

テストが問題なく実行できていることが確認出来ました！必要に応じてアプリケーションの復旧などを組み込んで、DRが正常に行えるか試すために使うといいかと思います。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/1cb2a932-41a0-4ac4-ad18-6973028899a1.png)


# 各AWSサービスのバックアップ機能と何が違うのか？
一部のAWSサービスには、バックアップ機能が搭載されています。
S3であれば、**バージョニング機能**によって過去世代のオブジェクトは復元することが出来ますし、**S3レプリケーション機能**を使えば他のリージョンにバックアップを取ることも出来ます。

AWS Backupとバージョニングの違いとしては、
- バケット自体を復元できるか
  - AWS Backupは**復元できる**
  - バージョニングは**復元できない**
- 特定の地点にバケットを復元できるか
  - AWS Backupは特定の地点に**復元できる**
  - バージョニングは特定の地点に**復元できない**

AWS BackupとS3レプリケーションの違いとしては、以下があります(スカイアーチさんがまとめてくれたものです)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/54f82fac-6394-4a1a-9a34-8e334b2d9f51.png)

それぞれメリット/デメリットがありますので、用途に応じて使い分ける必要がありそうです。

# 料金
最後に料金ですが、AWS Backupは主に以下で課金されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/6802f375-ea37-4521-9f10-1e555c7560e3.png)

# おわりに

今回は、AWS Backupについて紹介しました。
バックアップ周りって勉強が後回しだったりするので、とてもいい勉強になりました:smile: