Oracle Cloud Infrastructure(OCI) WAFのキャッシュを使ってWebページのレスポンス改善

# はじめに
OCIのWAFにはキャッシュ機能があります。（静的コンテンツのみ）
利用の際にはWAF以外の費用は掛かりません。

OCIのWAFを使うことで、Webページの画像読み込み 10MB 10秒が1秒に改善できました。
htmlページもキャッシュが効いて早くなりますが、わかりやすい画像データにフォーカスして説明しています。

本記事はその設定内容と結果を記載しています。

- ※注意
    - WAFのキャッシュ容量は1WAFポリシー(1インスタンス)毎に1GBです。
    - 動的コンテンツには対応していません。
    - 他にも細かにキャッシュ対象を指定したりできない為、ヒット率の確認などができない為、CDNの代わりとは言い難い機能です。




# 環境

- NGINX Webサーバにサンプルのhtmlを配置し、10MBの画像を表示できるようにしています。
- フレキシブル・ロードバランサ(パブリック)(以後、FLB)を配置し、FLB経由で外部公開。SSL/TLS化。
- WAFを設置し、TLS/SSL化。設定等はこちらのQiitaが分かりやすいと思います。
    - [[OCI] WAFにSSL証明書を追加して通信経路をHTTPSで暗号化する](https://qiita.com/cocotaro0202/items/be643bcf839255bc1b66)
- 自身の持っているドメインを用いて検証。ここでは　sample.work ドメインとしています。（※実際のドメインではありません）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/328a5a1f-e3f4-97c3-d1b5-2c66baf93038.png)


# 手順

### キャッシュ・ルールの追加

WAFポリシーを開き、画面左下の「キャッシュ・ルール」を選択
「キャッシュ・ルールの追加」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/d5d1e6b4-401d-9245-f8a9-f1522d5bfa1b.png)

### キャッシュ・ルールの設定

名前：<任意>
アクション：キャッシュ
キャッシュ期間：99秒（最長）
条件：「/」 に設定し、全てのパスで有効とした

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/cffb89d3-f6eb-7852-0bef-7ab6413d71fe.png)

### WAFキャッシュポリシー設定後のイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/7e9f5884-6926-50ae-be8c-214594470b16.png)

### WAF キャッシュ設定反映確認

設定変更後、反映までに10分～30分かかるのでしばらく待つ
反映後、OCICLIで以下コマンドで有効になっている事を確認
(OCIDはサンプルです）

```
oci waas caching-rule list --waas-policy-id ocid1.waaspolicy.oc1..aaaaaaaav6ea7samplesamplesampleqnera
{
  "etag": "W/\"2021-06-27T05:59:00.587Z\""
}
```



# テスト

### 通常読み込み

PCのGoogle Chromeで、デベロッパーツールを表示しながらURLにアクセス。
`Shift`を押しながら`F5`キーで画面を再読み込み、キャッシュがクリアな状態でアクセスする。
画像データの読み込みに10秒かかっていることが分かる。

- Network タブでページ読み込みの全体の時間を確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/b483bd12-9ed1-6c16-6fa0-6ed7990d5ec2.png)

- Networkタブで「10MB.png」をクリックし、「Timing」タブを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/b49fe5a5-2627-d1e8-e5eb-08c7af550bb2.png)


※参考
ここで仮に`F5`キーのみを押下し画面を再読み込みすると、ブラウザのキャッシュから応答している事が分かる。これはWAFのキャッシュを用いていない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/5061e8b1-1016-d816-ee3a-84617778ecee.png)


### WAFキャッシュにより 10秒が1秒になった結果

上述の後、99秒以内に`Shift`を押しながら`F5`キーで画面を再読み込み

WAFからのレスポンスヘッダを見ると、キャッシュにHITしている旨がわかる

- Networkタブで「www.sample.work」をクリックし、「Header」タブを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/0db726dc-4b50-1d1c-6e93-fbc9b198f0bd.png)

- Networkタブで「10MB.png」をクリックし、「Timing」タブを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/469c88cc-dc40-8280-8d6f-c2cba6aa3ed7.png)


# APPWNDIX

### キャッシュアウトしたらどうなる？(99秒後)

WAFからのレスポンスヘッダから、キャッシュヒットが期限切れ(EXPIRED)になったことがわかる
この時、ページ読み込みは10秒かかる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266598/b8709dde-a455-8985-cc7a-40c520018c93.png)


### キャッシュをパージする方法

OCI WAF側のキャッシュを削除する場合以下を実行する
反映には設定変更同様に10分から30分かかる

※注意：対象の指定はできず、WAFポリシー全体に関係する

APIでの実行可能。ここではOCICLIを用いている

```
oci waas purge-cache --waas-policy-id ocid1.waaspolicy.oc1..aaaaaaaav6ea7imnsamplesamplesample6fdulil6qnera

{
  "opc-work-request-id": "ocid1.waasworkrequest.oc1..aaaaaaaaspnjxsc4uibqvase2yb66a3lxroeth2wn2exg53n5z2wd5fvewza"
}
```

### 


### 参考資料

- [OCI] WAFにSSL証明書を追加して通信経路をHTTPSで暗号化する
    - https://qiita.com/cocotaro0202/items/be643bcf839255bc1b66
- OCIドキュメント：キャッシングルール
    - https://docs.oracle.com/en-us/iaas/Content/WAF/Tasks/cachingrules.htm
- OCIドキュメント：WAF FAQ
    - https://docs.oracle.com/en-us/iaas/Content/WAF/Concepts/faq_topic.htm
- サンプル画像データ
    - https://sample-img.lb-product.com/