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. やりたいこと
まず、前提として既にこの記事に従って、東京リージョンの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というPage Rulesを使います。
3-1. Resolve Overrideを選択
3-2. Resolve Override with COSの設定
- URL matchingとして、
image.certest.tk/*
にアクセスされた時のみこのPage Ruleが適用されるように指定。 - 対象のICOSインスタンスおよびBucketを選択。
- DNSのRecord nameとして、
image.certest.tk
が生成されるように指定。
3-3. Resolve Override with COSの内容
このPage Ruleを作成後に実際に作成された設定を確認すると、以下のように構成されていることがわかる。
-
Host Header Override
->mybucket106.s3.jp-tok.cloud-object-storage.appdomain.cloud
-
Resolve Override
->image.certest.tk
そして、DNSには以下のレコードがProxy=ONで作成されている。
(注意:現時点ではProxy=Offで作成されますが、これはバグです。Proxy=ONに変更してください)
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経由にしたのですね。