EdgeWorkers間でのコード共有
Akamai EdgeWorkersを利用してAkamai CDNのEdgeサーバー上でJavascriptを動かすことで、従来のCDN設定だけでは難しかった動的な処理を実現するケースが急増しています。
複数のEdgeWorkersを利用するケースも多いのですが、たとえば認証処理など複数のEdgeWorkers間で同じ処理を実行したい場合には各EdgeWorkersに同じコードを含める必要がありました。
これがデメリットだったのですが新機能 Flexible composition によってこのデメリットを解消できるようになりました。具体的には別のEdgeWorkersをライブラリとして呼び出すことができるようになりました。
EdgeWorkersとは
EdgeWorkersでは、エッジで駆動するリクエスト/レスポンスのイベントハンドラを提供し、 JavaScriptで書いたコードを実行できます。クライアントの近くのEdgeサーバーで処理を行うためレイテンシーが小さく、世界中に数十万台のサーバーが配置され、自動で分散駆動するためスケーリングを気にしなくてよいというメリットがあります。
参考: EdgeWorkers:Akamaiのエッジサーバー上でJavascriptで書いたコードが実行可能に
Flexible compositionの利用方法
以下の手順でFlexible compositionを利用できます
- ChildのEdgeWorkers (ライブラリとなるEdgeWorkers)を作成する
- ParentのEdgeWorkers (呼び出し元のEdgeWorkers)を作成する
こちらのページに、キャンペーンでの広告表示のためアクセス元の国の言語の情報をCookieに持たせる処理のサンプルがあります。
ここでは、この処理をFlexible compositionを使って実装してみます。
1. ChildのEdgeWorkersを作成する
まずはChildのEdgeWorkersを作成します。
main.js
import { SetCookie } from 'cookies'
// キャンペーンの広告表示用の言語情報を持ったSetCookieオブジェクトを返すfunction
export function getCampaignCookie(request) {
let value = 'en'
if (request.userLocation.country === 'JP') {
value = 'ja'
} else if ( request.userLocation.country === 'ES' ||
request.userLocation.continent === 'SA') {
if (request.userLocation.country !== 'BR') {
value = 'es'
}
}
const cookie = new SetCookie()
cookie.name = 'campaign_lang'
cookie.value = value
cookie.path = '/'
cookie.maxAge = 30 * 24 * 60 * 60
return cookie
}
// Not used
export function onClientRequest() {
}
コードバンドルを作成したらStagingまたはProductionにActivateします。Parentより先にActivateが完了している必要があります。
2. ParentのEdgeWorkersを作成する
次に、ParentのEdgeWorkersを作成します。
bundle.jsonに依存関係としてChildのEdgeWorkersを登録します
bundle.json
{
"edgeworker-version": "0.0.1",
"description" : "Flexible Composition Example",
"dependencies": {
"utilities": {
"edgeWorkerId": 1, // 上記で作成したChildのEdgeWorkerのIDを指定する
"version": "active"
}
}
}
main.js
import * as utilities from 'utilities' // from ‘dependenciesに定義した名前’ でimport
export function onClientResponse(request, response) {
response.setHeader('Set-Cookie', utilities.getCampaignCookie(request).toHeader())
}
Parentも作成が終わったらStagingまたはProductionにActivateします。
EdgeWorkersを呼び出すよう設定
CDNの設定からParentのEdgeWorkersを呼び出します。
おわりに
今回のサンプルは非常に簡単なものですが、EdgeWorkersをライブラリ化できることが確認できました。
チーム開発を行う際などに大きな効果を発揮するFlexible compositionをぜひ活用ください。