Code Engine：CISのPage Ruleを使ったカスタムドメイン設定

# 概要
Code Engineにてカスタムドメインを利用する際の設定として、docsには**Edge Functions**が例に挙げられています。しかし、Edge Functionsはスクリプトを手書きする必要があり、CISのプランによっては使えないものもあります。
docs: [カスタム・ドメイン・ネームを使用した複数リージョンでのアプリケーションのデプロイ](https://cloud.ibm.com/docs/codeengine?topic=codeengine-deploy-multiple-regions&locale=ja)

そこで本記事では、CISの**page rule機能**を用いて、Code EngineアプリケーションのURLに対してカスタムドメイン設定してみます。

:::note info
**Code Engine の新機能**
2022年11月より、カスタムドメインをより簡単に実装する機能が提供されています。
こちらも併せて参照ください。
[IBM Cloud docs: Configuring custom domain mappings for your app](https://cloud.ibm.com/docs/codeengine?topic=codeengine-domain-mappings)
[Qiita: カスタム・ドメインを使ってIBM Cloud Code Engineのアプリを公開してみる](https://qiita.com/satokota/items/485c0635386bc4ff51c9)
:::

# 前提
Code Engineにて、以下のアプリケーションを作成済です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/aa1a6663-bc79-485b-0311-118aa3d13a02.png)

現在は`https://yyyy.jp-tok.codeengine.appdomain.cloud/`でアクセスできるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/7aee0837-10dd-2f9b-8e4b-1df807633419.png)


こちらのアプリケーションに`https://xxxx.domain.com/`でアクセスできるよう設定します。

Code Engine概要やアプリケーション作成方法は以下をご覧ください。
qiita:[数分でアプリがデプロイできるコンテナ環境！IBM Cloud Code Engine](https://qiita.com/satokota/items/b3cecd591e244fed391f)

# 設定してみる
### 1. page ruleの設定
検索バーでCISリソース名を検索し、詳細画面を開きます。左メニューより「**Performance**」をクリックし、「**ページ・ルール**」をクリックします。ルール一覧右上の「**ルールの作成**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/5fe2f877-5cd3-1eca-b29d-848a6fdf0905.png)


Code Engineのアプリケーションにアクセスするためには"**HTTPリクエストのホスト・ヘッダーの書き換え**"、"**CIS宛アクセスがCode Engine宛になるように書き換え**"が必要があります。
そこで以下のように設定します。
- URLの一致：「"設定したいカスタムドメイン"」
    - 今回は`xxxx.domain.com/*`を指定しています。
- 設定：
    - 「ホスト・ヘッダーのオーバーライド」の値には「"Code EngineのアプリケーションURI"」を入力
        - page ruleに一致する URI のホスト・ヘッダーを、指定した値に置き換えます。
        -  (https://`yyyy.jp-tok.codeengine.appdomain.cloud`/の灰色部分)
    - 「解決のオーバーライド」の値には「"CISドメインの任意のURL"」を入力
        - CIS宛のリクエストを、Code Engineに転送するための設定です。
            - 本来はCode EngineのURLを直接入力したいところですが、「解決のオーバーライド」で入力できる値は、今回利用している同一ドメイン内のURLしか許可されていません。
            - そこで、ここでは一旦CISドメイン`domain.com`を使って`resolve-xxxx.domain.com`というURLを指定し、後ほどDNSのCNAMEでCode EngineのURLを指定することにします。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/72c16a95-056c-1cab-8f62-be260d803d03.png width=80%>

page ruleの設定を作成できたので、有効化します。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/37e43fdf-f8b2-8003-c75a-8814e7e2f20e.png width=100%>


### 2. DNS設定
CIS詳細画面の左メニューより「**Reliability**」をクリックし、「**DNS**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/1d2f8e5d-ead2-59b4-0b1f-6c827b4bd075.png)




下にスクロールし、「**追加**」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/c4e716b5-5d28-64cd-7748-d36f74078fc1.png)

以下の2つを設定します。
- CNAME：「"解決のオーバーライドで設定したURL"」、「"Code EngineのアプリケーションURL"」
- A：「"サブドメイン"」、「"任意のIPアドレス"」 
    - このAレコードはPage ruleを動作させるためだけに設定します。そのため、登録するIPアドレスは後で使用することはないので何でも構いません！ここでは、`8.8.8.8`を利用します。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/ca165f51-b69f-bb35-fa5c-d874fc77d6ce.png width=40%>   
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/cd42ab59-ea9f-bc83-1888-91d3aa04c76f.png width=34.5%>


以下のように、先ほど追加したAレコードとCNAMEの作成が確認できました。
次に、Aレコードのプロキシー設定を有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/582242bf-68b1-bd17-61e8-a7867a06a6df.png)





以上で設定終了です。

# アクセスしてみる
モザイクをかけていますが、設定したカスタムドメインにてアクセスできました！！
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/b190dee3-cd87-af6b-05bf-684e6c03e928.png width=80%>

(参考)より詳細な挙動を知りたい方はこちらをご覧ください。
[CIS(Cloud Internet Service): Host Header OverrideとResolve Overrideを使ったICOSアクセス](https://qiita.com/testnin2/items/dd58ce2051a6e72fcf02)

# ご利用における注意
### CIS導入費用について
新規にCISを利用するの場合、追加費用がかかります。
CISには5つのプランがありますが、最も安価なstandardプランで約3万円〜かかります。。

### ドメインを複数利用したい場合
開発と本番にてサブドメインではなくドメインを分けたいといった要件がある場合、2つ以上のドメインが必要になります。
**standardプランでは利用可能なドメインは1つ**のため、以下の2パターンが考えられます。
- プランのアップグレード
- standard プランを2つ購入 (こちらの方が現実的かもしれません)

その他のプラン比較表は[こちら](https://cloud.ibm.com/docs/cis?topic=cis-cis-plan-comparison&locale=ja)