Akamai Visitor Prioritization Cloudlet をTerraformで管理する

# Akamai Visitor Prioritization とは
イベントやチケットサイトは突発的なアクセスが発生しオリジンの処理負荷が増加して、サーバーがダウンしてしまうことがあります。
Visitor PrioritizationはAkamai CDN上に導入できる機能で、アクセスに応じて一定の割合を待合室画面に転送し、トラフィック量が急増した場合でも、サイトの応答性を維持することができます。
設定値はTerraformやAPIで設定変更を行うことができるため、アクセス数に応じて即座に調整することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/ce8d292d-862d-d7ae-8e35-6fe35c9a2079.png)

::: note info
Visitor Prioritization CloudletによるVirtual Waiting RoomのFIFO (First In First Out)機能は執筆時点ではBetaテスト中です。本稿では正式サポート済みの「接続待ちの中から一定の確率（抽選）でオリジンに接続する方式」で制御します。
https://techdocs.akamai.com/cloudlets/docs/what-visitor-prioritization-fifo
:::

# Visitor Prioritization を設定する

Akamai Control Center(ACC)のハンバーガーメニューからEdge logic Cloudletsを選択します。

<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/b22813a3-949d-5a10-3769-ecdd994455d8.png">

Create New Policyを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/bc408ea6-3d6e-a70f-13da-05e0bd563071.png)

Cloudlet TypeでVisitor Prioritizationを選択してポリシーを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/c3b79b1f-41eb-d32e-319f-c01f2f1b2b26.png)

Add Ruleを選択して待機ページへ向けるトラフィックを設定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/9dbf00e7-565f-b495-6c55-b2908bbbae6d.png)

1つ目のルールは、vp_force=trueが付与されているクエリ ストリングの場合には待合室を表示させるように設定します。これは表示のテスト用のための設定になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/02b7b92c-67f9-83ff-1d68-4d4820fb305f.png)

2つ目のルールは、すべてのPathを対象にVisitor Prioritizationを適用する設定です。割合としてはオリジンに3割のアクセスが行くように設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/ee5443dc-e165-0c71-68b4-e4e6ad845aaf.png)

その他、マッチ条件に関しては以下を参照ください。

[Review available match types for Visitor Prioritization](https://techdocs.akamai.com/cloudlets/docs/review-available-match-types-visitor-prioritization)

設定を保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/609ec979-8b8f-e495-3936-fe645c099184.png)

Active PolicyからStagingとProductionにRuleを展開します。適用先のPropertyを指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/a8ea531e-2c6a-fb8d-7772-a84887f94165.png)


# NetStorageにコンテンツをアップロードする

待合室のページをNetStorageにアップロードします。

HTMLサンプルは以下からダウンロードが可能です。

**[Set up waiting room page](https://techdocs.akamai.com/cloudlets/docs/setup-waiting-room-page)**

ディレクトリについては決まりがあり、vpディレクトリ配下に作成する必要があります。
また、HTMLのファイル名もvpwatingroom.htmlで固定となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/c1da2360-c808-586b-3e97-df785ec8487c.png)


今回はRcloneを利用してNetStorageにコンテンツをアップロードしています。

https://qiita.com/isss802/items/de89a3d32517fa462ceb

```
rclone copy vpwaitingroom.html ns:vp/wr/
```

# CDNのPropertyにVisitor Prioritization Cloudletの設定を追加する

対象のAkamai CDN のPropertyにVisitor Prioritization CloudletのBehaviorを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/bb7f5370-7145-fa22-fcf5-142e9b6bdc48.png)

詳細な設定値は以下を参照ください。

**[Configure the Visitor Prioritization behavior](https://techdocs.akamai.com/cloudlets/docs/config-visitor-prioritization-beh)**

設定を保存して、Stagingに展開します。（必要に応じてProductionにも展開します。）

# 設定の確認

サイトのURLへアクセスし、設定したクエリ ストリングを付与してアクセスすると待合室が表示されていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/c6fa2f1c-e5b0-c242-f1d4-1db7273f30ee.png)

:::note info
上記HTMLページはサンプルからロゴ等を表示するために修正しています。
修正した内容はこちらになります。
https://gist.github.com/isss802/9c644f46b86c0a8dfd4437319fbcb7de
:::

# Visitor Prioritization を Terraform で管理する

Visitor Prioritizationで設定したオリジンへアクセスを転送する割合は、総アクセス数の増加やオリジンの処理負荷など状況に応じて変更することがあります。
Terraformなどの構成管理ツールを利用することで、変更を実行しやすくし、サーバー負荷などのモニター値をトリガーに調整を自動化するようなワークフローにも組み込みやすくなります。

先程ACCから設定した内容をAkamai Terraform CLIを利用してエクスポートします。

https://github.com/akamai/cli

```
akamai --section default terraform export-cloudlets-policy [policy_name]
```

設定したポリシーから自動的にTerraformのファイルが作成されます。

```
➜ tree
.
├── import.sh
├── match-rules.tf
├── policy.tf
└── variables.tf
```

importコマンドが記載されているファイルを実行します。

```
chmod +x import.sh
./import.sh
```

例としてpass_through_percentの設定値を30から60に変更します。

```
 vim match-rules.tf

  1 data "akamai_cloudlets_visitor_prioritization_match_rule" "match_rules_vp" {
~~~~~~~~~~~~中略~~~~~~~~~~~~~~
 15     pass_through_percent = 30→60に変更
 16     disabled             = false
 17   }
```

Terraformを実行して設定を反映させます。

```
# Stagingの場合
terraform apply -var 'env=staging'
# Producationの場合
terraform apply -var 'env=production'
```

設定値が変更されていることをACCから確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49877/7cc4d374-a828-33d5-4866-3ae97a773b3d.png)


# まとめ
Akamai Visitor Prioritizationは、オリジンサーバーのパフォーマンスと安定性を確保するために必要な機能を備えています。

Terraformを利用することにより構成変更も迅速に行えるようになり、DevOpsにも組み込むことができます。