CIS(Cloud Internet Service): Host Header OverrideとResolve Overrideを使ったICOSアクセス

# 1. はじめに
CISのPage Ruleには、`Host Header Override`と`Resolve Override`という機能があります。

- `Host Header Override`は、L7レベルでHTTPヘッダ内のHOST情報を書き換えます。
- `Resolve Override`は、L4レベルの接続先を変更します。

この具体的な挙動と仕組みを理解するために、CIS経由でICOS(IBM Cloud Object Storage)にアクセスする例を使ってその仕組みを説明したいと思います。

# 2. やりたいこと

まず、前提として既に[この記事](https://qiita.com/testnin2/items/6379e5bc5ea165212e15)に従って、東京リージョンのICOSに`mybucket106`という名前のbucketを作成し、認証なしでインターネットからアクセスできるようになっており、公開画像として100.jpgが存在するとします。この場合、その画像ファイルへのアクセスは

`https://mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud/100.jpg`

となります。でも、これだと自分のドメインを使っていないし、画像はキャッシュはされないし、扱いづらいですよね。そこで、CDN機能含めて豊富なインターネットアクセス用のサービスを提供しているCISを使ってアクセスするようにします。最終的には、CISで取得しているドメインを仮に`certest.tk`とすると、このファイルに

`https://image.certest.tk/100.jpg`

でアクセスできるようにしようというのが今回の目標です。


# 3. 設定方法

設定方法に関しては簡単です。CISの[Resolve Override with COS](https://cloud.ibm.com/docs/infrastructure/cis?topic=cis-resolve-override-cos)というPage Rulesを使います。

## 3-1. Resolve Overrideを選択 <br> <img width="763" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/480f4038-81a3-c889-90f8-723f80ddb5b0.png">

## 3-2. Resolve Override with COSの設定

- URL matchingとして、`image.certest.tk/*`にアクセスされた時のみこのPage Ruleが適用されるように指定。
- 対象のICOSインスタンスおよびBucketを選択。
- DNSのRecord nameとして、`image.certest.tk`が生成されるように指定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fbda1679-fb8a-61a6-92b9-c88742ba1c29.png)

## 3-3. Resolve Override with COSの内容

このPage Ruleを作成後に実際に作成された設定を確認すると、以下のように構成されていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/02602846-d1d3-c6af-968f-e54d58fda206.png)


- `Host Header Override`-> `mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud`
- `Resolve Override`-> `image.certest.tk`

そして、DNSには以下のレコードがProxy=ONで作成されている。
(注意:現時点ではProxy=Offで作成されますが、これはバグです。Proxy=ONに変更してください）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4e836f88-df6e-242b-8d18-cc7db45bbd60.png)

CNAME: `image.certest.tk` -> `mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud`

これで、`https://image.certest.tk/100.jpg`にアクセスできるようになります。

# 4. 挙動の説明

## 4.1 ICOSへの直接アクセス時

`https://mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud/100.jpg`への端末からのアクセスは以下のようになっています。

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud |
| (L4)接続先アドレス|IPアドレス(mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloudIPを名前解決した結果）|

## 4.2 CIS経由のアクセス時

### 4.2.1. ブラウザからのアクセス時

`image.certest.tk`の名前解決をすることで、CISのEdgeサーバーのIPアドレスが返ります（そのために、`image.certest.tk`のDNSレコードはProxy=ONになっている）。よって、このリクエストはCISを通るようになります。

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |image.certest.tk|
| (L4)接続先アドレス| N/A|

### 4.2.2. `Host Header Override`による書き換え

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |**mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud**|
| (L4)接続先アドレス|N/A|

### 4.2.3. `Resolve Override`による書き換え

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud|
| (L4)接続先アドレス|**image.certest.tk**|


### 4.2.4. CNAMEによる名前解決

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud|
| (L4)接続先アドレス|**mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud**|

これでICOSへの直接アクセスの時と同じ情報に書き換わりました。これが最終的に名前解決されて、

|     |    |
|:-----------------|:------------|
| (L7)URL PATH     |/100.jpg|  
| (L7)Host Header  |mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud|
| (L4)接続先アドレス|IPアドレス（mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloudを名前解決した結果）|

となるわけです。

（参考）ちなみにL4での接続先アドレスを変更するのであれば、直接`Resolve Override`で`mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud`に変更してしまえばいいのではないか・・・という疑問は誰でも浮かぶところです。しかし、`Resolve Override`では別ドメインを設定することはできないようです。なので、いったんワンクッションを置いてCNAME経由にしたのですね。
<img width="618" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/402d863b-c85c-713a-280f-0f37431e91c4.png">