EdgeWorkers のコードを Akamai Sandbox 環境で検証する

Akamai EdgeWorkers をローカル環境で動作する方法について説明します。

# Akamai EdgeWorkers とは
超分散された Akamai CDN のエッジプラットフォーム上でサーバーレスコンピューティング機能を提供するのが EdgeWorkers です。EdgeWorkers を利用すると、Web アプリケーション、API、IoT のトラフィックに対してエッジ上でカスタムロジックを起動することができます。EdgeWorkers のコンセプトやユースケースについては、[Qiita X Akamai Meetup](https://www.youtube.com/watch?v=iPxhuyecYik) を参照ください。

https://www.youtube.com/watch?v=iPxhuyecYik

# Akamai Sandbox とは
Akamai Sandbox は Akamai CDN の環境設定を変更することなくローカルホストで Akamai の振る舞いを検証する環境です。Akamai には Production 環境以外に Staging 環境が用意されている利点があります。Staging 環境に反映するまでに２分ほどしかかかりませんが、開発者にとっては 2 分は長く感じると思います。EdgeWorkers は ECMAScript 言語に対応しており、JavaScript エンジニアが気軽にコードを書けます。コードのデバッグをするために Staging 環境で 2 分待つことなく、直ぐにローカル環境でテストできるのが Akamai Sandbox を使う利点です。Sandbox についてはユーザーガイドを参照ください。

https://techdocs.akamai.com/edgeworkers/docs/sandbox

:::note warn
Sandbox 環境は Akamai CDN に統合されていますので、Akamai 上にプロパティが存在している必要があります。 
:::

# Sandbox 環境の作成
Akamai Sandbox は Windows や macOS 上でプロキシサーバーとして動作し、Akamai エッジプラットフォームと接続します。次のコマンドで、Akamai Sandbox CLI をインストールし、ツールとプロキシサーバーを入手できます。

```
akamai install sandbox
```
Akamai CLI をインストールをしていない場合は、下記のページを参照してください。

https://github.com/akamai/cli

Akamai Sandbox CLI を入手したら、ローカル環境に Sandbox を作成します。

```
akamai sandbox create --hostname www.example.com --name sandbox_for_example.com
```
``www.example.com`` は Akamai 化したホスト名です。``sandbox_for_example.com`` はローカル環境に作成する Sandbox 環境の名前です。ホスト名の指定以外にもプロパティ名で作成もできます。

```
akamai sandbox create --property ion-property:42 --name my-ion-property
```
``ion-property:42`` は Akamai 上に作成されたプロパティ名とバージョン番号です。バージョンを指定しないと、プロダクション環境にアクティベートされたバージョンを優先的に取得しますので、ステージング環境にしかアクティベーションされていないような最新バージョンを取るときはバージョン番号を指定します。プロパティのバージョンによって振る舞いを変えているケースもあると思いますので、バージョン番号を付けて Sandbox 環境を作成すると良いと思います。私もバージョンの違いで無駄な時間を過ごしたことがあります。コマンドを実行すると、一つだけ質問事項があります。

```
>> akamai sandbox create -p ion-property:42 -n my-ion-property
building origin list
Detected the following origins: XXX.linodeusercontent.com
? Do you want the Sandbox Client to proxy the origins in your dev environment to the destination defined in the Akamai config? En
ter **y** and the CLI will automatically update your configuration file. If you want to route sandbox traffic to different develo
pment origins, enter **n** to customize the origin mappings. (Y/n)
```
``Y`` を選択すると先に進みます。こちらは、EdgeWorkers とは関係ない選択肢となります。プロパティのオリジンサーバーを変更する場合は、こちらで変更することができますが、今回は変更なしを選択します。最後に ``Successfully created`` のメッセージが表示されれば環境作成は成功です。
```
Successfully created sandbox-id 13e80739-ef4e-4a55-8b26-429bc0363797 Generated sandbox client configuration at /cli/.akamai-cli/cache/sandbox-cli/sandboxes/hiito-ion-wpa-20220408/config.json Edit this file to specify the port and host for your dev environment.
```

# Sandbox 環境の確認

Sandbox 環境をみるには ``list`` を使います。
```
akamai sandbox list
```
Sandbox 環境は複数作成することができます。最後に作成されたものがデフォルト環境となります。
```
Local sandboxes:

Default  Sandbox Name                Sandbox ID                            JWT Expiration Date       
-------  --------------------------  ------------------------------------  --------------------------
         sandbox_for_example.com    fd79a614-bd3a-41db-847c-300f1a3ad2fe  Jul 11, 2022, 2:24 PM UTC 
         dsa-property               780e9635-e0d1-45cf-a6de-d206b5b156e5  Sep 3, 2022, 4:06 PM UTC  
YES      my-ion-property            13e80739-ef4e-4a55-8b26-429bc0363797  Oct 5, 2022, 9:48 AM UTC  
```
Sandbox CLI の詳細はヘルプを参照してください。

# Sandbox の起動

ローカル環境で Sandbox を起動します。フォアグラウンドで起動し、ログが表示されます。
```
akamai sandbox start
```
Ctrl-C で停止できます。Sandbox は内部で Java を使用していますので、起動できないときはJava のバージョンなど要件を確認してください。

https://techdocs.akamai.com/sandbox/docs/create-sandbox-cli

もし、環境の問題で起動できない場合は、Akamai Docker の利用も検討してください。Akamai Docker については下記の文書を参考にしてください。

https://qiita.com/110hideki/items/58428a14974fd8003d7a

正常であれば以下のようなログが表示されます。

```
Starting Sandbox Client with arguments:
Config: /cli/.akamai-cli/cache/sandbox-cli/sandboxes/my-ion-property/config.json
Logging path: /cli/.akamai-cli/cache/sandbox-cli/sandboxes/my-ion-property/logs
Logging file: /cli/.akamai-cli/cache/sandbox-cli/sandboxes/my-ion-property/logs/sandbox-client.log
Logging config: /cli/.akamai-cli/cache/sandbox-cli/sandbox-client-1.4.0-RELEASE/conf/logback.xml

Arguments: "/usr/lib/jvm/default-jvm/bin/java",-DLOG_PATH="/cli/.akamai-cli/cache/sandbox-cli/sandboxes/my-ion-property/logs",-DLOGGING_CONFIG_FILE="/cli/.akamai-cli/cache/sandbox-cli/sandbox-client-1.4.0-RELEASE/conf/logback.xml",-jar "/cli/.akamai-cli/cache/sandbox-cli/sandbox-client-1.4.0-RELEASE/lib/sandbox-client-1.4.0-RELEASE.jar",--config="/cli/.akamai-cli/cache/sandbox-cli/sandboxes/ion-property/config.json"

Successfully launched Akamai Sandbox Client
Sandbox Client running on port: 9550
```
Sandbox は内部で 9550 のポートを使います。このポート番号は Sandbox のコンフィグファイルで変更することもできます。ログに表示されているパスを見ると、Sandbox 環境のコンフィグやログの存在が分かります。


# Sandbox に EdgeWorkers のバンドルファイルをアップロード
既にプロパティには EdgeWorkers を呼び出すパスの設定がされていて、EdgeWorkers ID が指定されていることを前提としています。もし、Akamai Network 上に EdgeWorkers が登録されていたとしても、Sandbox 上に最新の EdgeWorkers のコードを登録する必要があります。

```
akamai sandbox add-edgeworker 43796 helloworld.tgz
```
``43796`` は EdgeWorker ID です。利用されている ID を指定します。``helloworld.tgz`` は EdgeWorker のコードバンドルファイルです。成功すると次のような素っ気ないメッセージが表示されます。
```
done!
```


# Sandbox 環境でのテスト
Sandbox 上に EdgeWorker ID を登録したら、Sandbox 上で最新の EdgeWorkers コードをテストできます。

```
curl -i http://127.0.0.1:9550/ew/hello-world -H 'Host: www.sample.com'
```
自身のホスト IP である ``127.0.0.1`` とポート番号 ``9550`` に対して curl でテストします。必ず Host ヘッダーは必要です。Host ヘッダーにはテストするホスト名を渡します。このケースでは EdgeWorker ID 43796 が割り当てられている ``/ew/hello-world`` というパスにリクエストしています。curl を実行すると以下のような結果が得られます。

```
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 70
Cache-Control: max-age=0
Date: Fri, 08 Apr 2022 09:50:47 GMT
Connection: keep-alive
X-Akamai-Sandbox: true
X-Akamai-Staging: ESSL
X-Hello-World: From Akamai EdgeWorkers

<html><body><h1>Hello World From Akamai EdgeWorkers</h1></body></html>
```
上記の結果は次のような JavaScript を呼び出しているだけです。onClientRequest で Hello World のメッセージを表示し、X-Hello-World リスポンスヘッダーをセットしています。

![Screen Shot 2023-01-18 at 7.46.02 PM.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264188/c0a24430-d1e7-2ae1-a921-9abf5e3ca8ff.jpeg)

# Akamai 環境へのデプロイ

Sandbox 環境でコードの確認ができたら、Akamai 環境にコードをデプロイします。Akamai EdgeWorkers CLI を使ってデプロイできます。

```
akamai ew upload 43797 --bundle helloworld.tgz
```

ステータスの確認をします。
```
akamai ew status 43797
```

ステージング環境をアクティベートします。
```
akamai ew activate 43797 STAGING 0.2 
```

プロダクション環境をアクティベートします。
```
akamai ew activate 43797 PRODUCTION 0.2 
```

最終的な確認をします。
```
curl -i http://www.sample.com/ew/hello-world
```

# まとめ
Akamai Sandbox は Akamai EdgeWorkers のコードを検証するには最適な環境です。Akamai Sandbox は Akamai Sandbox CLI として提供され、ローカルマシンの環境でプロキシサーバーを動かし、 Akamai CDN と統合されて動作します。Akamai Sandbox は無償で利用できますので、ご活用ください。