【OCI】Webサイトにソーリーページを実装する方法

# はじめに

この記事は[Oracle Cloud Infrastructure Advent Calendar 2021](https://qiita.com/advent-calendar/2021/oci) Day22の記事として書いています。
OCIで公開しているWebサイトにソーリーページを実装する方法について書きます。

# 結論
ロード・バランサのバックアップ機能＋Sorryサーバで実現出来ます。

### Appendix: 本記事以外で、SorryPageを出す方法紹介

この記事で紹介する方法以外にも２つ、SorryPageに切り替える手法がありますので、以下に参考として記載します。

- ① WAFのHTTPレスポンスを利用してSorryページに切り替える
- ② LBの機能でリダイレクト機能を利用する（Object Storageや、API Gatewayのコンテンツにリダイレクト）

それぞれのメリット・デメリットは以下です。

| 方法 | メリット | デメリット | 参考URL |
| ------ | ------ | ------ | ------ |
| ① WAFHTTPレスポンス | 専用Compute不要/URLは不変 | 自動化はFunctionsを利用 | [OCI:WAFとFunctionsを使ったSorryPageの自動切り替えの実装手順](https://qiita.com/NICAREGI/items/d1ba42c2597c427a6776#5-2-%E5%BE%A9%E6%97%A7%E6%99%82%E3%81%AE%E5%8B%95%E4%BD%9C-%E6%9C%AC%E6%9D%A5%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E6%8F%90%E4%BE%9B) |
| ② LBリダイレクト機能 | 専用Compute不要 | SorryPageはURLが変わる | [クラウド・ネイティブ・サービスを使用したロード・バランサのカスタム・エラー・ページの実装](https://docs.oracle.com/ja/solutions/implement-lbaas-error-page/index.html#GUID-BCFAB6D5-6CE2-4468-8B5D-42A9409E0AE3) |
| ③ LB標準機能 | LB機能のみで自動的にできる | Sorryページ用Computeが必要 | ＜本記事＞ |



# ソーリーページとは？
障害やメンテナンスなどでWebサイトが停止している時に表示されるページの事です。

ソーリーページがない場合。エラーが表示されます。
OCIの ロード・バランサ 経由でホストしたWebサービスが応答ない場合、502エラーが表示されます。

| ![chrome-alldown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/598a8095-1091-b50d-80a1-251fb95d60ae.png) |
|:--|

なお、このメッセージを編集する方法は現在（2021/12時点）ではありません。

# 想定構成

| ![構成図-20211222_qiita_sorry.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/5afdff30-bbe0-d23c-6035-7c1b9549f1ec.png) |
|:---|


LB経由で、以下のメッセージがラウンドロビンで表示されます。

| ![chrome-web1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/b9047975-a265-8420-c63b-e199bb9575f6.png) | ![chrome-web2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/e5f68955-f985-5051-d2c3-db4e9e7c94b2.png) |
|--|--|

サーバ2台ともダウンしている場合は、以下のメッセージを表示させます。

| ![chrome.sorry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/8c5cba86-0647-29ff-d91e-41158b7021ed.png) |
|:--|




# 実現方法
ロード・バランサの **バックアップ機能** を使います。

バックアップ機能とは、通常時はトラフィックは転送されないサーバを設定できます。
全てのバックエンド・サーバのヘルスチェックが失敗した場合にのみ、トラフィックが転送されます。

[OCI技術資料 : ロード・バランサー 概要 バックエンドサーバー](https://speakerdeck.com/ocise/ociji-shu-zi-liao-rodobaransa-gai-yao?slide=25)

# 実装方法
Webサーバの作成とロード・バランサの作成は割愛します。

ロードバランサの作成詳細手順は以下のスライド13～21ページを参照ください。
[OCI技術資料 : ロード・バランサー 概要](https://speakerdeck.com/ocise/ociji-shu-zi-liao-rodobaransa-gai-yao)

## 1.Sorryサーバをバックエンドサーバに登録
ロード・バランサのバックエンド・セットの画面から「バックエンドの追加」を押下します。

| ![バックエンド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/3baa0e3c-b876-cef1-ef32-42b6e4cca391.png) |
|:--|

コンピュート・インスタンスで用意したsorryサーバを選択し、「追加」を押下します。

| ![バックエンド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/ae84dbdb-221f-5831-2ec4-2123c14f3547.png) |
|:--|

## 2.Sorryサーバをバックアップ状態に変更
今のままだと、ラウンドロビンでSorryサーバも選択されてしまいます。

一覧からSorryサーバ選択後、「アクション」→「バックアップ状態の編集」を押下します。

| ![バックエンド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/4a7ea8e2-9c49-9275-222f-1549f44d55a3.png) |
|:--|


「True」にチェックを入れ、「変更の保存を押下」します。

|![バックエンド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/a903a684-9fe4-8262-f4b2-2e629fc7efd1.png)|
|:--|

これで設定完了です。

|![バックエンド5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/e321ac28-dbb9-15cb-ff8f-87a1bf5f9719.png)|
|:--|

## 3.動作確認
Webサーバ1を停止（今回はWebサーバ1はApacheの停止を実施）

|![stop-web1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/9582e876-2a45-aeab-42f9-e3270fda396c.png)|
|:--|

この時点ではWebサーバ2が生きているため、Sorryサーバに飛ばない事を確認。

|![chrome-web2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/ac814875-ea8d-c1bb-9ebe-87d453f7121a.png) |
|:--|


Webサーバ2を停止（ロード・バランサからオフラインを実施）

| ![stop-web12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/d82a21c4-f017-71cb-18ba-d71401dfa9aa.png)|
|:--|

Sorryサーバに飛んだ事を確認。

|![chrome.sorry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276568/e720df18-4032-1177-0e20-2d407bf16c45.png)|
|:--|


# まとめ
ロード・バランサのバックアップ機能を使用することで実現出来ます。
ただし、ソーリーページ用のサーバの用意が必要です。