AWS Resilience HubによるRTO（目標復旧時間）とRPO（目標復旧時点）に基づく環境評価の検証

## はじめに
AWS 上で環境を構築する際には、障害発生を想定した可用性のある構成を検討する必要があります。そして、AWS では設計・構築などのノウハウが纏められた [AWS Well-Architected Framework](https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc&wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&wa-guidance-whitepapers.sort-order=desc) が提供されています。これを元にしてベストプラクティスに沿った対応が可能となっています。しかし、設計者の経験値が高くない場合は、本当に要件に合わせた構成が作成できているか不安になる場面もあるかと思います。

もし、必要な RTO（目標復旧時間）とRPO（目標復旧時点）を指定することで、環境がその条件を満たしているか回答してくれる仕組みがあれば、その不安が解消できます。そこで今回は、AWS が評価サービスとして提供している [AWS Resilience Hub](https://aws.amazon.com/jp/resilience-hub/) について取り上げ、具体的にどのような評価や提案ができるのかという点を検証します。
この記事を読んで、なるほどと感じた方は是非サービスを活用してみてください。

## RTO と RPO について
復旧戦略を検討する際に重要なキーワードが、RTO（目標復旧時間）とRPO（目標復旧時点）です。以下の通り、要求される内容によって冗長化構成やバックアップ頻度など、環境設計に大きく影響します。

|項目 |タイトル|
|:-----------|:-----------|
|RTO<br>（目標復旧時間）|障害が発生してからシステムやサービスが復旧するまでの最大許容時間。例えばRTOが2日の場合、障害発生から2日以内にシステムを復旧させる必要があります。フェールオーバー計画などが影響します。|
|RPO<br>（目標復旧時点）|障害が発生した時点からどれだけ過去のデータを復旧できるかの目標。例えばRPOが1日の場合、障害発生時点から1日前までのデータを復旧できる状態にしておく必要があります。バックアップ頻度などが影響します。|

AWSでは、AWS Well-Architected Framework の「信頼性の柱」「[ディザスタリカバリ (DR) を計画する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/plan-for-disaster-recovery-dr.html)」において、以下の5つの項目に対応が纏められています。その中で要求されるRTOやRPOに対する戦略が記載されています。

|項目 |タイトル| 
|:-----------|:-----------|
|REL13-BP01|[ダウンタイムやデータ損失に関する復旧目標を定義する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_objective_defined_recovery.html)|
|REL13-BP02|[復旧目標を満たすため、定義された復旧戦略を使用する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_disaster_recovery.html)|
|REL13-BP03|[ディザスタリカバリの実装をテストし、実装を検証する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_dr_tested.html)|
|REL13-BP04|[DR サイトまたはリージョンでの設定ドリフトを管理する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_config_drift.html)|
|REL13-BP05|[復旧を自動化する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/rel_planning_for_recovery_auto_recovery.html)|

## AWS Resilience Hub サービスについて
AWS Resilience Hub は、AWS 上のアプリケーションの回復⼒の定義・検証・追跡を⼀元化したサービスです。AWS上に構築したアプリケーションを評価して、達成すると推定される値（推定ワークロード RTO/RPO）を算出します。問題を特定して対策を提案してくれます。

|# |特徴| 
|:-----------|:-----------|
|1|障害耐性の弱点を明らかにする。|
|2| RTO (目標復旧時間) と RPO (目標復旧時点) を達成できるかどうかを見積もる。|
|3|本番環境にリリースされる前に問題を解決する。|

事前の設計段階で評価できる AWS Well-Architected Framework のレビューとは異なり、作成済みの環境の評価を実施できることがポイントになります。
具体的な流れについて解説します。

### 手順1：アプリケーションを作成する
アプリケーションが稼働するAWS 環境を作成します。対象のリソースにタグ付けをしておき、マイアプリケーションとして登録します。

<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/bcf19a6d-673d-41e0-a4cb-31ce9366569b.png">

### 手順２：AWS Resilience Hub へのアプリケーション追加
AWS Resilience Hub に作成したアプリケーションを追加します。

<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/41fb550e-2e9e-4392-8a78-36360ce346c3.png">

:::note info
この説明では myApplications のアプリケーションを追加していますが、AWS CloudFormation スタックや AWS Resource Groups、Terraform 状態ファイルなどを利用して登録することも可能です。
:::

### 手順３：アプリケーションの発行
アプリケーションのリソースの発行を行います。その時点のリソース情報をもとにバージョン情報が登録されます。このバージョン時点でのリソースが評価されるので、その後リソースが追加されても評価対象にはなりません。
<img width="200" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c7670e91-2c26-44cf-945d-6766d765299a.png">

### 手順４：アプリケーションの評価
設定されている耐障害性ポリシーに基づいて、先ほど作成したバージョンに対してアプリケーションを評価します。耐障害性ポリシーは要求するRTOとRPOを定義した内容になります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/111cbc03-04a7-4ace-bd9c-0225cc3d4230.png">

結果画面では耐障害性ポリシーに沿った評価結果がレポートされます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/96b778b4-468d-4f16-9735-7100d425a042.png">

条件を満たしていない項目に対しては、対策の提案が実施されます。
この部分は日本語化されておらず英語で表示されます。
複数のオプションが提示されるため、その中から必要なオプションを選択して、対応を実施します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f97f2a01-0133-45b7-b4e4-b6d1963713b6.png">

オプションの内容としては変更点や料金情報、対応後のRPO/RTOが提示されるので、重視する内容を元にオプションを選択することができます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/40287226-2861-4d99-9ad8-d8c34115054a.png">

対策が完了したら、再度評価を実施して、改善していることを確認します。
これが一連の流れです。

なお、AWS Resilience Hub にはアプリケーションを評価する以外にも、評価した環境に対するアラームの設定や耐久テストを提案してくれなど、様々な機能が実装されています。ただし、今回のブログの内容は耐久性の評価の部分が中心となるため、それ以外の機能の詳細説明は割愛しています。


## 今回のブログ内で検証すること
今回のブログでは、AWS Resilience Hub が耐障害性ポリシーの設定ごとにどのような指摘と提案を実施してくるのかを確認します。

今回検証するAWS構成は以下となります。本来冗長化しておく一部の設定を、敢えて実施していません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f3d21b1b-8ca9-4acb-ba61-4e7d00043b45.png">

当初環境の設定に関するポイントは以下の通りです。

|サービス |現状の問題点| 
|:-----------|:-----------|
|S3 bucket|・バックアップが未設定。|
|EFS|・バックアップが未設定。|
|NatGateway|・2つ目のAZには未作成。|
|RDS|・バックアップが未設定。<br>・片方のAZのみに作成。|
|ELB|・AutoScaling設定の対象AZを片方のみに設定。|

上記の制限がある環境に対して、アプリケーションの評価と対策を実施します。耐障害性ポリシーはアプリケーション、インフラストラクテャ、アベイラビリティゾーン、リージョンの4つの階層で評価します。それぞれ以下の状況になった場合が前提となっています。

|項目 |内容|
|:-----------|:-----------|
|アプリケーション|オペレーターのエラー、ソフトウェアの不具合等によるアプリケーションの停⽌。|
|インフラストラクテャ|EC2 や RDS などのハードウェアの停⽌。|
|アベイラビリティゾーン|1 つ以上の AZ が利⽤できない。|
|リージョン|１つ以上のリージョンが利⽤できない。|

次に耐障害性ポリシーの種類ですが、7つのレベルが定義されています。

|区分 |内容| 評価対象|
|:-----------|:-----------|:-----------|
|Non Critical Application|非クリティカル|AZまで|
|Important Application|重要|AZまで|
|Critical Application|クリティカル|AZまで|
|Mission Critical Application|ミッションクリティカル|AZまで|
|Global Critical Application|クリティカル|リージョンまで|
|Global Mission Critical Application|ミッションクリティカル|リージョンまで|
|Foundational Core Service|基盤となる IT コアサービス|リージョンまで|

大きく2つに分かれており、アプリケーション、インフラストラクチャ、アベイラビリティゾーンまでの3段階を評価するのが以下の4つのポリシーです。ポリシーごとにRTOとRPOが異なっており、右側に行くほど厳しい基準値が求められます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/cc5e0f53-9f96-4791-b6e8-c5e5cb0eaab5.png">

アプリケーション、インフラストラクチャ、アベイラビリティゾーンまでの3段階に加えてリージョンまで含めて評価するのが以下のポリシーです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/fe57b011-79f2-4e86-9baa-c5a8765b102e.png">

対象のアプリケーションがリージョン障害発生時の復旧対応を想定するかどうかで利用する耐障害性ポリシーが変わります。例えば東京リージョンが利用できなくなった時のために、大阪リージョンでの業務継続を視野に入れる場合は、リージョンレベルも含めた評価が必要になります。


### 検証１：Non Critical Application
それでは、1つ目の耐障害性ポリシーである Non Critical Application からはじめます。
Non Critical Applicationで求められる基準は以下の通りです。
2日以内に障害発生前1日以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/933b1601-01ba-4471-a5fe-6b21c4595145.png">

前提は以下の通りです。
先ほど説明した当初構築環境に対して評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|当初構築環境|
|評価するポリシー|Non Critical Application|

この基準のもとに評価すると、アプリケーション、インフラストラクチャ、アベイラビティゾーンのすべてで回復不能と評価されます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/60b0c64e-3377-4106-9fe6-162f01999cc9.png">

アプリケーションでは、EFS、S3、RDS が回復不能と評価されています。バックアップが未取得のため回復できないことが指摘されています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/29f300a1-de92-434f-aa70-70e9c8092963.png">

インフラストラクテャでは、RDS が回復不能と評価されています。S3 や EFS は内部的に冗長化されているサービスなので対象にはなっていません。ここではインスタンスに依存するサービスである RDS のみが指摘されています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/6b6c8dfb-8caf-461b-b93f-2ac1af409c18.png">

アベイラビリティーゾーンでは、NatGateway と RDS が回復不能であると判断されています。NatGateway は片方の AZ でしか作成されていないため指摘されています。RDS は先ほどのインフラストラクテャの際と同様の原因です。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9f5e1f21-ddf9-417e-b260-3ead8244d9e4.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。今回は以下の対応を実施しました。表の中で、RTO と RPO に 〇 が記載されているのは、その項目が満たす為の対策という意味です。また、ELBについては基準は満たしていましたが、改善の提案があったため対応しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket|〇|〇|・バケットのバージョニングをONにする。<br>・AWS backupでバックアップ設定（日次）。|
|EFS|〇|〇|・AWS backupでバックアップ設定（日次）。|
|NatGateway|〇||・もう１つのAZにNatGateway作成。|
|RDS|〇|〇|・RDSの自動バックアップを有効化。|
|ELB|||・AutoScaling設定で2つ目のAZを追加。<br>・ターゲットのEC2台数を2台に変更。|
|EC2|||・変更点特になし。|

構成図では以下の部分で対応しています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/760258d8-f065-4348-a500-aa37fe29329c.png">

設定変更後の再測定結果は以下の通りで、全て基準を満たしていました。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/b93a68e0-9b80-447a-9cb1-e4c69fa16225.png">

AWS Resilience Hub では、このような流れで、評価と対策が可能です。

### 検証２：Important Application
Important Application で求められる基準は以下の通りです。
2日以内に障害発生前4時間以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/1d968dde-8b03-4a7f-97d0-e5a054887bdd.png">

前提は以下の通りです。
検証１で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Non Critical Application の指摘事項対応済|
|評価するポリシー|Important Application|

この基準のもとに測定すると、アプリケーションの RPO が4時間以内の条件を満たしていないことが分かります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/65bace71-0ed5-4a14-924b-acafe07e4d73.png">

アプリケーションでは、EFS、S3 が RPO を満たしていないことが指摘されています。これは、この2つのサービスの AWS backup バックアップ設定が、日時バックアップであるため、24時間に1回しか取得されていないためです。ここでは4時間以内の頻度でのバックアップが求められています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/62d7d4fd-c5c0-4e58-b3d6-df8669559abe.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。
以下の対応を実施しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket||〇|・AWS backupでバックアップ設定変更（日次→1時間毎）。|
|EFS||〇|・AWS backupでバックアップ設定変更（日次→1時間毎）。|
|NatGateway|||・変更点特になし。|
|RDS|||・変更点特になし。|
|ELB|||・変更点特になし。|
|EC2|||・変更点特になし。|

構成図では以下の部分が影響します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/16e9a20f-5197-4aa1-8251-c1f2626bd97f.png">

設定変更後の再測定結果は以下の通りで、全ての基準を満たしました。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/aea8f452-6893-4dc1-9ea7-a19f2834ccfe.png">

### 検証３：Critical Application
Critical Application で求められる基準は以下の通りです。
4時間以内に障害発生前1時間以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/a9656b43-3760-496f-b66f-4028a80e892e.png">

前提は以下の通りです。
検証２で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Important Application の指摘事項対応済|
|評価するポリシー|Critical Application|

この基準のもとに測定すると、すでにすべての条件が満たされています。
先ほど AWS backup のバックアップ間隔を1時間に短縮したため、このポリシーの基準も超えたためです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/49a7659f-ccd0-422b-90ca-25d3b2934e5d.png">

そのため、特段変更は発生しません。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket|||・変更点特になし。|
|EFS|||・変更点特になし。|
|NatGateway|||・変更点特になし。|
|RDS|||・変更点特になし。|
|ELB|||・変更点特になし。|
|EC2|||・変更点特になし。|


### 検証４：Mission Critical Application
Mission Critical Applicationで求められる基準は以下の通りです。
1時間以内に障害発生前15分以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/79dd9dcd-3b08-437c-8409-81aa787ab0af.png">

前提は以下の通りです。
検証３で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Critical Application の指摘事項対応済|
|評価するポリシー|Mission Critical Application|

この基準のもとに測定すると、アプリケーションは RPO を、インフラストラクチャとアベイラビリティゾーンは RTO を満たしていないことが分かります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9b186139-d049-4235-bb43-27f07b073bac.png">

アプリケーションでは、EFS、S3 が RPO を満たしていないと評価されています。現在の AWS backup は1時間毎の設定になっているため、15分の RPO が満たせないためです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/6a64c701-a35f-4ac0-a955-38b62c344439.png">

インフラストラクテャでは、RDS の RTO が基準を満たしていないと評価されています。RDS の自動バックアップからリストアする時間を40分と推定しており、5分の基準を満たしていません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/70f583cc-9ea8-4877-b216-9e680a04ea7a.png">

アベイラビリティーゾーンでは、RDS の RTO が基準を満たしていないと評価されています。RDS の自動バックアップからリストアする時間を40分と推定しており、5分の基準を満たしていません。これは、インフラストラクチャの項目を同じです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d2f2f8c2-de89-4f72-bc95-808aabda7582.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。
以下の対応を実施しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket||〇|・AWS backup のバックアッププランでポイントインタイムリカバリオプションを有効化。|
|EFS||×|・EFS は RPO の改善提案なし。|
|NatGateway|||・変更点特になし。|
|RDS|〇||・マルチ AZ インスタンスに移行。|
|ELB|||・変更点特になし。|
|EC2|||・変更点特になし。|

構成図では以下の部分が影響します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c6022b52-0518-4c73-b7a0-3edb32a81318.png">

設定変更後の再測定結果は以下の通りです。
アプリケーションの RPO のみ条件を満たしていません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/3ee0acb9-7336-405a-aab1-3727693cdcc8.png">

これは、EFS が RPO 未達のため表示されたものですが、提案なしのため一旦このままとします。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/aeb3b165-44a0-4753-bf95-5064e098d441.png">

### 検証５：Global Critical Application
Global Critical Applicationで求められる基準は以下の通りです。
4時間以内に障害発生前1時間以内の状態に復旧する必要があります。
また、このポリシーからはリージョンが評価項目に含まれます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/38fccb37-8a8e-48c4-ac03-a54d7d7dce76.png">

前提は以下の通りです。
検証４で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Mission Critical Application の指摘事項対応済|
|評価するポリシー|Global Critical Application|

この基準のもとに測定すると、リージョンの RTO、RPO を満たしてないことが分かります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/5917fdec-f701-4604-a705-02b7233bd6dd.png">

リージョンでは、S3、EFS、RDS がリージョンを跨いだレプリケーションやバックアップの設定ができていないので回復不能と表示されます。また、NatGateway も DR 環境のリージョン内に追加作成する必要がある旨を指摘されます。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/041f2f76-42fd-4a46-b439-e4796b1e5d3c.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。
以下の対応を実施しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket|〇|〇|・クロスリージョンレプリケーション (CRR) 設定を実施。<br>・Amazon S3 レプリケーション時間制御 (S3 RTC) の有効化。|
|EFS|〇|〇|・AWS backupのリージョン間バックアップ オプションを有効。|
|NatGateway|||・別リージョンのDR環境にNatGatewayを作成。|
|RDS|〇||・AWS backupのリージョン間バックアップ オプションを有効|
|ELB|||・変更点特になし。|
|EC2|||・変更点特になし。|

構成図では以下の部分が影響します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/21485226-b5e4-4ac7-9826-978d71657a5c.png">

設定変更後の再測定結果は以下の通りです。
リージョンの RTO が満たしていません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c7581820-d700-43cc-948f-4ab28792453b.png">

これは、別リージョンの NatGateway をリソースとして認識できていないため回復不能と表示されていますが、実際は作成済みのため、一旦このままとしています。この評価を実施するためには別リージョンリソースを手動追加する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d986cd02-d849-4812-962d-7603fb4f9a62.png">

### 検証６：Global Mission Critical Application
Global Mission Critical Applicationで求められる基準は以下の通りです。
1時間以内に障害発生前15分以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f09866fd-a26a-463d-86ad-ca1f1086ee42.png">

前提は以下の通りです。
検証５で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Global Critical Application の指摘事項対応済|
|評価するポリシー|Global Mission Critical Application|

この基準のもとに測定すると、アプリケーションの RPO と、リージョンの RTO、RPO を満たしてないことが分かります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/65712d36-7b1d-4a53-a442-ef8095637057.png">

アプリケーションでは、EFS が RPO を満たしていないと評価されています。現在の AWS backup は1時間毎の設定になっているため、15分の RPO が満たせないためです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/4ce400be-80f3-4278-96ee-fe0ec269a763.png">

リージョンでは以下のとおり基準を満たしていないことが分かります。今のままだとRDSが別リージョンで復旧させるRTOが満たせないことを指摘されています。また、ELBのAutoScaling環境も障害時にDR環境で再構築する時間を想定するとRTOが満たせないという指摘を受けています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0db3c326-da6b-46b2-9a9a-28c26d1c6a38.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。
以下の対応を実施しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket|||・変更点特になし。|
|EFS||×|・EFS は RPO の改善提案なし。|
|NatGateway|||・変更点特になし。|
|RDS|〇|〇|・別リージョンの DR 環境にリードレプリカとリージョン内 AWS バックアップ プランを備えた Amazon RDS マルチ AZ インスタンスを作成。|
|ELB|〇||・別リージョンのDR環境にELB環境を構築します。<br>・Route53 で2つのリージョンの ELB のフェールオーバー設定を実施します。<br>|
|EC2|||・変更点特になし。|

構成図では以下の部分が影響します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/2088dfb2-99fe-4f28-8c99-7aac2727ba8c.png">

提案された内容を元に対策を実施することができます。


### 検証７：Foundational Core Service
Foundational Core Serviceで求められる基準は以下の通りです。
1時間以内に障害発生前15分以内の状態に復旧する必要があります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c0d1798a-408e-42c4-a2c4-bfbff03ded8a.png">

前提は以下の通りです。
検証６ではなく検証５で対策済の環境に対して、評価を実施します。

|区分 |内容| 
|:-----------|:-----------|
|前提の環境|Global Mission Critical Application の指摘事項対応済|
|評価するポリシー|Foundational Core Service|

この基準のもとに測定すると、アプリケーションのRPOと、リージョンの RTO、RPO を満たしてないことが分かります。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/282f1632-d0af-4142-85d7-6abc38e35d01.png">

アプリケーションでは、EFS が RPO を満たしていないと評価されています。現在の AWS backup は1時間毎の設定になっているため、15分の RPO が満たせないためです。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/897dca81-aafa-4934-87c6-8ce68240d646.png">

インフラストラクテャでは以下のとおり基準を満たしていないことが分かります。ELBはヘルスチェックによる切替の時間、RDSはマルチAZの切り替えの時間が、RTOを満たしていません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c84470db-a228-44b8-878d-9da51800e220.png">

アベイラビリティゾーンでは以下のとおり基準を満たしていないことが分かります。インフラストラクチャと同様の理由です。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/53d3e2ba-2a3d-4f4f-b3de-1c55fa88cd08.png">

リージョンでは以下のとおり基準を満たしていないことが分かります。今のままだとRDSが別リージョンで復旧させるRTOが満たせないことを指摘されています。また、ELBのAutoScaling環境も障害時にDR環境で再構築する時間を想定するとRTOが満たせないという指摘を受けています。また、S3もリージョン間のレプリケーションの時間がRTOを満たさないと指摘されています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0db3c326-da6b-46b2-9a9a-28c26d1c6a38.png">

耐障害性に関するレコメンデーションでは、複数の対応方法が提案されます。
以下の対応を実施しました。

|サービス |RTO|RPO| 対応内容 |
|:-----------|:-----------|:-----------|:-----------|
|S3 bucket|×|×|・S3 は RPO の改善提案なし。|
|EFS|×|×|・EFS は RPO の改善提案なし。|
|NatGateway|||・変更点特になし。|
|RDS|〇|〇|・別リージョンの DR 環境にリードレプリカとリージョン内 AWS バックアップ プランを備えた Amazon RDS マルチ AZ インスタンスを作成。<br>・Amazon RDS インスタンス用の RDS プロキシを作成して設定する。|
|ELB|〇||・別リージョンのDR環境にELB環境を構築します。<br>・Route53 で2つのリージョンの ELB のフェールオーバー設定を実施する。<br>|
|EC2|||・変更点特になし。|

提案された内容を元に対策を実施することができます。

### 検証に関するまとめ
検証１～７の通り、各段階で要求される RTO、RPO に基づいて改善提案が実施されています。AWS 環境を構築した上で、要求している可用性が確保できているかをチェックする機能としては活用できると感じました。

以下は耐障害性ポリシーごとに S3 で提案されて実践した内容です。AWS backup のバックアップポリシーの設定時間などもチェックして、バックアップ間隔を短くする提案をしてくれるなど、細かい対応ができていると感じました。

|区分 |提案内容と対応|
|:-----------|:-----------|
|Non Critical Application|・バケットのバージョニングをONにする。<br>・AWS backupでバックアップ設定（日次）。|
|Important Application|・AWS backupでバックアップ設定変更（日次→1時間毎）。|
|Critical Application|※Important Application での設定で条件を持たしている。|
|Mission Critical Application|・AWS backup のバックアッププランでポイントインタイムリカバリオプションを有効化。|
|Global Critical Application|・クロスリージョンレプリケーション (CRR) 設定を実施。<br>・Amazon S3 レプリケーション時間制御 (S3 RTC) の有効化。|
|Global Mission Critical Application|※Global Critical Application での設定で条件を持たしている。|
|Foundational Core Service|・S3 は RPO は改善提案なし。|

## AWS Resilience Hub を利用するに当たっての注意点
### AWS Resilience Hub　の対象サービスに関する注意点
AWS Resilience Hub で評価できるサービスは限られているので、全ての問題を解決してくれるわけではないことは認識しておく必要があります。対象のサービスは「[AWS サービスの耐障害性チェック](https://docs.aws.amazon.com/ja_jp/resilience-hub/latest/userguide/resilience-checks.html)」に掲載されています。そして、それぞれのサービスの中でチェックできる項目も決まっています。例えば S3 で評価できる内容は以下となります。

|区分 |内容|
|:-----------|:-----------|
|バージョニング|S3 バケットでバージョニングが有効になっているかどうかを確認します。|
|スケジュールされたバックアップ|デプロイされた S3 バケットに対して AWS Backup プランが定義されているかどうかを確認します。|
|ポイントインタイムリカバリ|障害耐性ポリシーの RPO ターゲットでpoint-in-timeリカバリ (PITR) が必要かどうかを確認します。|
|データレプリケーション|デプロイされた S3 バケットに同じリージョンレプリケーション (SRR) とクロスリージョンレプリケーション (CRR) が定義されているかどうかを確認します。|

AWS Resilience Hub の対象サービス一覧に掲載されていないサービスは当然チェックができません。

1つ例を挙げるとインタフェース型 VPC エンドポイントが該当します。このサービスは VPC 内のリソースと AWSサービスをプライベートな通信で接続するために利用します。特徴として各 AZ 単位でサブネットを指定してエンドポイントを作成することにより、そのエンドポイント経由で通信が可能です。

以下は SystemsManager とインタフェース型 VPC エンドポイント経由で接続した場合の構成図です。2つの AZ が異なるサブネットにエンドポイントを作成しています。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/a8f6d88b-4cef-4d92-aa87-00c719daf9db.png">

では、以下のように1つのエンドポイントで設定した場合はどうなるか。当然ながらエンドポイントが存在する アベイラビリティゾーン で障害発生すると通信ができなくなります。これは、AWS Resilience Hub ではチェックができません。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/77991e38-1d71-4d4b-928b-4eb55d26b568.png">

このように、AWS Resilience Hub にサービスが対応しているは、意識する必要があります。

### リージョンレベルの評価のリソース設定の注意点
AWS Resilience Hub 自体がリージョンに依存するサービスのため、そのチェック対象は基本的にはリージョンに依存します。ただし、リージョンレベルでの評価の場合、2つのリージョンで冗長化できていることがチェック条件になる場合があります。例えば、以下のような例です。

|区分 |内容|
|:-----------|:-----------|
|NatGateway|リージョンの中断が発生した場合に回復できるように、AWS NAT ゲートウェイを別のリージョンにデプロイします。|
|ELB|複数のアベイラビリティーゾーンにまたがってデプロイされ、リージョンの中断が発生した場合に ELB が回復できるように複数のターゲットを持つ別のリージョンに追加の Amazon Elastic Load Balancer (ELB) を作成します。|

こういう場合は、AWS Resilience Hub の対象アプリケーションに対して手動でリソース追加して対応します。以下のようにユーザ定義として登録して、グループ化した上で、評価を実施します。
<img width="800" alt="画像" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/86f72712-c3dc-45bb-ae0c-e2c86ab85dd1.png">

リージョンレベルでの評価の場合は、このようにひと手間必要になる評価項目があります。


## まとめ
AWS Resilience Hub を利用すれば、指定した RTO と RPO のポリシーに従って、現状AWS環境の評価と、その条件を満たす為の提案を簡単に受けることが可能となっています。AWS Well-Architected Framework を元に検討しなければならない項目が自動的に評価できるのがメリットだと感じます。AWS 環境構築の際の助けになると思うので、興味のある方は是非ご活用ください。

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