OCI Full Stack Disaster Recovery (FSDR)でComputeの移動インスタンスを試してみた　ードリル編


## はじめに
OCIでは、対応するOCIリソースの切り替えコマンドの実行をワンクリックで実装できるFull Stack Disaster Recovery という機能が提供されています。

リージョン障害やメンテナンスなどの計画停止に備える機能として便利です。

サービスの詳細は以下をご参照ください。
[OCI Full Stack Disaster Recovery サービス概要](https://speakerdeck.com/oracle4engineer/fsdr-overview)

今回は「移動インスタンス」を使用した場合の動作確認をしたかったので、スタート・ドリルの実施を試してみました。

## 目次
1. [構成イメージ](https://qiita.com/sy10/items/756c20b9f9aaa1e78a70#1-%E6%A7%8B%E6%88%90%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8)
2. [前提](https://qiita.com/sy10/items/756c20b9f9aaa1e78a70#2-%E5%89%8D%E6%8F%90)
3. [FSDR構成](https://qiita.com/sy10/items/756c20b9f9aaa1e78a70#3-fsdr%E6%A7%8B%E6%88%90)

### 1. 構成イメージ
まずは構成要素についてです。

本検証はComputeを移動インスタンスとした場合の動きを確認したいので、DBを含まないシンプルな構成で、以下のようなイメージを想定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/a249d031-931d-4bd2-abc1-305b704274f1.png)
※構成参考：[Speaker Deck](https://speakerdeck.com/oracle4engineer/fsdr-overview?slide=23)


DR保護グループのメンバーにComputeインスタンスと、インスタンスにアタッチされるBoot VolumeとBlock Volumeをグループ化したボリューム・グループを追加します。

【使用するリージョン】
・プライマリ・リージョン：Austrailia East (Sydney)
・スタンバイ・リージョン：US West (San Jose)

今回は試しに、プライマリ側で障害が発生した際にスタンバイ側にインスタンスが移動されるシナリオを想定し、「移動インスタンス」というものを設定します。

### 2. 前提
使用するリソースごとに事前設定が必要なので、これらをクリアしていることを前提とします。

今回使用するリソースはComputeインスタンスとボリューム・グループのみですが、別途操作ログの保管場所としてObject Storageを用意しておく必要があります。

詳細は以下のドキュメントにてご確認ください。
[フル・スタック・ディザスタ・リカバリの前提条件](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/disaster-recovery/doc/prerequsisites-disaster-recovery.html)

### 3. FSDR構成

FSDRの構成を作成する大まかな手順は以下です。

①DR保護グループの作成（各リージョンで実施）
②各リージョンのDR保護グループを関連付ける（プライマリとスタンバイのロールを指定）
③各DR保護グループにリソースをメンバーとして登録する
④DR計画を作成
⑤計画の実行

順を追って手順を進めていきます。

#### 3-1. DR保護グループの作成
まずはメニューから、「移行とディザスタ・リカバリ」→「ディザスタ・リカバリ」→「DR保護グループ」をクリックします。

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/16dd70af-89da-4f60-9298-9c90970f9042.png)

最初のステップとして、プライマリとスタンバイの両方でDR保護グループを作成する必要があるのでSydneyリージョンでDR保護グループの作成画面に進みます。

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/fe65d115-0400-4f70-b858-f71f5d50963d.png)

「DR保護グループの作成」をクリックし、以下の作成画面を表示させます。

![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/86160301-14d0-47bc-943b-d6e3a6036e65.png)

ここではDR保護グループの名前とログ保管用のObject Storageのバケットを指定し、ロールやメンバーは未設定のまま「作成」に進みます。

※同様にスタンバイのSan Jose側でもDR保護グループの作成をしますが、同じ手順なので今回は割愛します。

各リージョンで作成が完了したことを確認します。

・Sydneyリージョン側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/b2b70284-854c-4dcb-9594-88517e216f27.png)

・San Joseリージョン側
![image (28).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/f53faeb3-bb36-49d6-850c-b06ddc474717.png)



今回はSydney側をプライマリ、San Jose側をスタンバイとします。

#### 3-2. 各リージョンのDR保護グループを関連付ける

次に、作成したDR保護グループを関連付けるためにどちらかのリージョンでDR保護グループの詳細画面に進みます。

※プライマリ側からでもスタンバイ側からでも設定できるため、どちらのリージョンで実施しても問題ありません。

今回はSydneyにてDR保護グループの詳細画面に進み、「関連付け」をクリックします。

![image (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/1d667e6f-5ebd-42f9-9c1c-8168f39371c1.png)

ここでロールを指定します。Sydneyをプライマリとしたいので、プライマリを選択します。

![image (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/03c8a549-df94-4848-bb23-259d3c7309a9.png)

ピア・リージョンの選択ができるようになります。
San Joseをピア・リージョンとして選択すると、ピアDR保護グループは先ほどSan Joseで作成したものが自動で選択されるので、そのまま「関連付け」をクリックします。

![image (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/9462f492-f75e-4146-ae93-6217d0ab48a5.png)


関連付けが完了するとピアDR保護グループとピア・リージョンが表示されるので、無事に紐づいているかをこちらで確認することができます。

![image (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/234fc5d9-b4cd-497f-a2cf-11336079cdb8.png)


#### 3-3. 各DR保護グループにリソースをメンバーとして登録する

DR保護グループの詳細画面の左下のメニューから「メンバー」→「メンバーの追加」に進みます。まずはプライマリ側で実施します。

![image (15).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/4885d6ee-d452-4abf-adfa-9be041172fac.png)

「メンバーの追加」画面に進んだらリソースの選択をします。
今回は「コンピュート」と「ボリューム・グループ」をそれぞれ順番に追加していきます。

![image (16).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/43b97643-1a94-4d8f-b763-0c854d902a0e.png)


「リソース・タイプ」で「コンピュート」を選択すると、対象のインスタンスとインスタンス・タイプ（移動インスタンスまたは非移動インスタンス）を選択できるようになります。

今回は移動インスタンスを試してみたいと思います。

![image (18).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/c4072403-2cab-43fb-a004-61bb8b6b249c.png)

また、「VNICマッピングの追加」で宛先VCN、宛先サブネットなどを指定し「追加」に進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/309d8515-ed6b-44a4-888a-f0fc467235e1.png)

同じようにボリューム・グループもメンバーに追加します。

![image (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/c89e2042-5f8c-4246-933a-e6dbafa25ff6.png)

メンバーに追加されました！

![image (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/55feddaa-cef6-4acd-8c4f-6b9fdf99d65b.png)

#### 3-4. DR計画を作成

次にDR計画を作成します。

DR計画のタイプは4種類あり、それぞれの違いについて以下をご参照ください。

![image (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/2c0d07ca-0c5f-4a64-a48d-a598e115ae20.png)
※[Speaker Deck](https://speakerdeck.com/oracle4engineer/fsdr-overview?slide=11)より抜粋（ドキュメントの該当箇所：[ディザスタ・リカバリ計画のタイプ](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/disaster-recovery/doc/dr-plans-type.html)）

スタンバイ側で設定する必要があるので、San JoseリージョンからDR保護グループの詳細画面に進み、「計画の作成」を選択します。

![image (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/234f1cbd-338b-479e-9d3c-2352d458de39.png)



今回、スタート・ドリルとストップ・ドリルで動作を確認したいので、まずはスタート・ドリルの計画を作成します。

![image (31).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/ceebf9b9-3468-4ab4-be43-63ed4999619d.png)

「状態」が「作成中」→「アクティブ」になるのを待ちます。


:::note warn
作成時にDR計画の状態が「失敗」というステータスになった場合はDR計画の詳細画面に進み、「作業リクエスト」→「DR計画の作成」を選択→「エラー・メッセージ」で詳細を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/64131b46-56c8-42e3-8dc2-c70e7a708b53.png)



本記事の目次2の前提条件を満たしていないことが原因の場合があります。筆者の場合、下記のエラー・メッセージが表示されました。
```
An error occurred while trying to create the DR Plan [ocid1.drplan.oc1.us-sanjose-1.amaaaaaassl65iqagt3rubvhjqpuxppujoh4ievkp6y2zwdzcbai24dswysq]. Check work request for more details. Cause - [An error occurred while refreshing DR Protection Group member details. Cause - [An error occurred while validating member [ocid1.instance.oc1.ap-sydney-1.anzxsljrssl65iqccxurxgblqodz7w7pyo642hpo6wowak5li4r77fzm67mq] of DR Protection Group [ocid1.drprotectiongroup.oc1.ap-sydney-1.amaaaaaassl65iqa5fpwzaw4uve5amlf3ay6jpqhbss5lnclaa7x5ejuvneq]. Cause - An error occurred while validating the movable compute instance [ocid1.instance.oc1.ap-sydney-1.anzxsljrssl65iqccxurxgblqodz7w7pyo642hpo6wowak5li4r77fzm67mq] member of the DR Protection Group [ocid1.drprotectiongroup.oc1.ap-sydney-1.amaaaaaassl65iqa5fpwzaw4uve5amlf3ay6jpqhbss5lnclaa7x5ejuvneq] for plan inclusion. Cause: An error occurred while validating member properties for movable instance [ocid1.instance.oc1.ap-sydney-1.anzxsljrssl65iqccxurxgblqodz7w7pyo642hpo6wowak5li4r77fzm67mq] -- [Error getting information for subnet [ocid1.subnet.oc1.ca-toronto-1.aaaaaaaayz3mrw3vkynjplih2oadms3amkxcvxrqrwl35d6t355vb35fe43q]. Cause: Downstream Error: (404, NotAuthorizedOrNotFound, false) Authorization failed or requested resource not found. (opc-request-id: C0C055DEB3BB42B093F46E4311E9CFE2/E7924526E1C00BD40F584C3C43AEFC77/6F88840AC48DEF7C13118365A8B95C5B).]]]
```
気になったのは、[Error getting information for subnet [ocid1.subnet.oc1.ca-toronto-1.aaaaaaaayz3mrw3vkynjplih2oadms3amkxcvxrqrwl35d6t355vb35fe43q]の箇所です。

【エラーの内容】
Torontoリージョンのサブネット情報の取得でエラー発生（今回はSydney-San Jose間のFSDR構成なので関係ないはずのリージョン）

【原因として考えたこと】
・今回、作成の過程で一度SydneyリージョンとTorontoリージョンの保護グループを関連付けしていたことがあった（メンバーの定義を変更せず、関連付け解除後に今回のSydneyのDR保護グループをSan Joseと関連付け）
・ComputeのVNICマッピングの定義でTorontoのVCNが指定されたままになっていた

【解決策】
・メンバーの編集画面からComputeの編集に進み、「VNICマッピング・リスト」を確認し、過去に定義されているマッピングを削除
・正しいVNICマッピングの追加し、更新（またはメンバーから一度Computeを削除し、再度正しい定義をした上でメンバーに追加）

同様の事象が出た場合は、この手順を踏むとDR計画の作成に進めるはずです！

:::

DR計画が無事に作成されると、状態が「アクティブ」に切り替わります。

![image (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/ab33c138-f639-4912-a250-10c22ddb16d9.png)

作成したDR計画の詳細画面に進むと、「計画グループ」というDR計画のステップが自動で組まれていることがわかります。カスタム・スクリプトを使用する場合など、必要であれば自分でグループの追加をしてステップを追加することも可能です。

![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/de282629-108e-44d3-84d6-3eac11bf90ad.png)

カスタム・スクリプトを使った実装については以下をご参照ください。
[Oracle Cloud Infrastructureフル・スタック・ディザスタ・リカバリを実行コマンドで使用して、カスタム・スクリプトを起動します](https://docs.oracle.com/ja/learn/full-stack-dr-run-command/index.html)

#### 3-5. DR計画の実行

計画の実行をしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/de0cd8f6-4e4c-4c75-81a7-2abaa895382d.png)

ステータスが「進行中」に切り替わり、現在どの計画グループが進行中になっているのかを「計画実行グループ」の項目から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/03406027-091e-460b-bee7-f461608bffb8.png)

「期間」は開始されてからの経過時間を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/62f103ef-15a0-4475-848f-93ff7740dbb3.png)


成功すると、スタンバイ側のSan JoseのメンバーにComputeインスタンスとボリューム・グループが表示されます。

※今回は「移動インスタンス」のパターンで試しており、実行前はプライマリ側にのみメンバーが存在していたため、無事にスタンバイ側でComputeインスタンスが起動され、ボリューム・グループもレプリケートされたことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/331f6ebf-b34b-4320-bcf5-39b1207ecbb3.png)

:::note info
ちなみに、所要時間は4分程度でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/db0b2bfa-a6d3-402b-8e9b-e9b02d40b3fd.png)

:::


同様の手順でストップ・ドリルの計画を作成して実行し、ドリルを終了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/7af83e57-abee-4f0b-8cfd-0537738c8215.png)

スタート・ドリル中はスタンバイのSan Jose側のメンバーにComputeインスタンスとボリューム・グループが出現しましたが、終了したのでメンバーは空の状態に戻ります。


:::note warn
計画の実行が失敗した場合は、原因を辿るためにログの表示をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/dc4e78d4-8a3c-419d-9f2d-51ab1d96258b.png)

計画の詳細画面→「計画実行グループ」の失敗している項目のメニューより「ログの表示」または「ログのダウンロード」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/ca41e1c9-8006-4d91-9d00-6240642400aa.png)

どこでエラーが起きているかをここで確認することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/dc9a00d9-1ea3-4382-8368-ef6b22ae8c79.png)

原因の追求をまずはする必要がありますが、先ほどの画面から失敗している計画をスキップすることも可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/011f922d-c482-4343-844e-0fd972ca4b25.png)

スキップすると、「キュー済」になっている次の計画グループから順に実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/74bca4bc-9f4f-495e-8db7-d1bbd3ce5502.png)

:::

今回はドリルのみ実施したのでロールの入れ替えはありませんでしたが、スイッチ・オーバーまたはフェイル・オーバーを実施するとプライマリとスタンバイが入れ替わります。

OCIコンソールから、Sydney側のロールがスタンバイに変更され、San Joseがプライマリに切り替わったことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/148cc22c-4e00-48bf-b63b-2245cfd2ffa3.png)


## まとめ

移動インスタンス使用時の切り替えの動作確認のためドリルの機能を使ってテストしてみましたが、スタート・ドリル（プリチェックおよびスタンバイ側へのボリューム・グループのレプリケート、Computeインスタンスの起動含む）は4分程でスムーズに実施できました！

エラーの発生などつまづいたポイントもいくつかありましたが、構成の作成から計画の実行までの操作は比較的シンプルだと思います。

ドリルの機能は切り替えのリハーサルの位置付けなので、実装前に動作を試したい場合などに有用です。

## おまけ

各リージョンの関係性（どのリージョンが関連づけられているか、どちらがプライマリでどちらがスタンバイなのか等）をマップで確認することも可能です。

[ディザスタ・リカバリ保護グループのリージョン・マップの表示](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/disaster-recovery/doc/overview-protection-groups.html#CSSGM-GUID-B793B5CA-259C-463A-B3F5-167C672046A0)

コンソールのメニューから「移行とディザスタ・リカバリ」→「ディザスタ・リカバリ」→「概要」に進むとリージョン・マップが表示さます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3116376/42e815e7-6b21-4ccb-8b46-fdd5a48a13bf.png)

リージョン間の関連付けのほか、リージョンのヘルス状態やDR保護グループの有無を色で確認できます。カーソルをリージョンの位置に合わせるとリージョン名と「スタンバイ」または「プライマリ」が表示されます。

今回SydneyとSan Joseが想定通り紐づいており、両方のリージョンでDR保護グループが正常に動作していることが確認できました。

## 参考情報
Speaker Deck
・[OCI Full Stack Disaster Recovery サービス概要](https://speakerdeck.com/oracle4engineer/fsdr-overview)

OCIドキュメント
・[フル・スタック・ディザスタ・リカバリ](https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/disaster-recovery/index.html)
 
YouTube
・[Automate Disaster Recovery orchestration using OCI Full Stack DR](https://www.youtube.com/watch?v=LopJSclx25I)
・[OCI Full Stack Disaster Recovery - Non moving compute enhancements](https://www.youtube.com/watch?v=GONlPCtQxqM)
・[Introducing New Enhancements for OCI Full Stack Disaster Recovery (FSDR)](https://www.youtube.com/watch?v=44_Nr4RPRoA)
・[Understanding movable and non-movable compute](https://www.youtube.com/watch?v=dna14EPgkbM)

オラクルエンジニア通信
・[新機能：FSDRのインスタンスの移動と容量予約の統合](https://blogs.oracle.com/oracle4engineer/post/full-stack-dr-compute-moving-instance-new-features-jp)
・[OCI Full Stack Disaster Recoveryの非移動コンピュートの拡張機能](https://blogs.oracle.com/oracle4engineer/post/ja-fsdr-nonmoving-compute-enhancements)
・[OCI Full Stack Disaster Recovery service(FSDR)をOCIで利用するメリット](https://blogs.oracle.com/oracle4engineer/post/why-use-full-stack-disaster-recovery-service-oci-ja)

Help Center
・[
フル・スタックの障害時リカバリを使用したOCIリージョン間での仮想マシンの移動](https://docs.oracle.com/ja/learn/full-stack-dr-to-move-vm/#introduction)
・[OCI Full Stack DRを使用して、移動していないコンピュート・ブロック・ボリュームをDRドリル・プランでアタッチまたはデタッチ](https://docs.oracle.com/ja/learn/full-stack-dr-blkvolume-dr-drill/index.html)

Maximum Availability Architecture
・[OCI Full Stack Disaster Recovery Introduces DR Drills](https://blogs.oracle.com/maa/post/fullstackdr-drill-plans)

Qiita
・[OCI Full Stack Disaster Recovery (FSDR) が Load Balancer 対応になったので試してみた](https://qiita.com/Assemble_EX-80/items/92262c337290d57b670c#fsdr%E3%81%AEdr%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%ABload-balancer%E3%81%A8vm%E3%82%92%E7%A7%BB%E5%8B%95%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%A8%E3%81%97%E3%81%A6%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)

そのほか
・[Suraj Ramesh's Blog: OCI Full Stack DR](https://surajramesh.com/series/fullstackdr)