2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Akamai EdgeWorkersのFlexible compositionでEdgeWorkerをライブラリ化する

Posted at

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を利用できます

  1. ChildのEdgeWorkers (ライブラリとなるEdgeWorkers)を作成する
  2. 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を呼び出します。
ew.png

おわりに

今回のサンプルは非常に簡単なものですが、EdgeWorkersをライブラリ化できることが確認できました。
チーム開発を行う際などに大きな効果を発揮するFlexible compositionをぜひ活用ください。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?