Cloudflare

Key-Value Storeに対応したCloudflare Workers
ーコラムー
2020年4月13日号



昨年、CloudflareはWorkers KVという機能をリリースしました。Workers KVは、Cloudflare WorkersでKVS(Key-Value Store)を使えるようにするものです。



シンプルに言えばそれだけですが、サーバ上で実装する場合と異なり、追加・更新・削除の結果が世界中に分散配置されたエッジサーバへ短時間で反映され、サイト訪問者の近くで読み取ることが出来る点が大きな違いです。
Workers KVの登場で、これまでのWorkersと比較して、より高度な処理が行えるようになる、よりシンプルに記述できるようになるなどの効果がもたらされます。
例えばリクエストの条件によって異なるリダイレクト先URLや応答すべきコンテンツなどを格納しておく、認証済みセッションのアクセストークンを保持し、オリジンサーバに先んじて検証するなどの処理によって、アプリケーション上の要件への対応をパフォーマンスを改善しながら実現することが出来ます。
以下は翻訳サービスのCrowdinと連携し、/translateへのリクエストを受信すると全ての翻訳KeyをダウンロードしてWorkers KVに一括書き込みする例です。

addEventListener("fetch",  event = > {
     if (event.request.url.pathname ==="/translate") {
     event.respondWith(uploadTranslations())
}
})

async function uploadTranslations() {
  // Ask crowdin for all of our translations.

  var response = await fetch(
   "https://api.crowdin.com/api/project" +
   "/:ci_project_id/download/all.zip?key=:ci_secret_key")
// If crowdin is responding, parse the response into
// a single json with all of our translations.

if (response.ok) {
   var translations = await zipToJson(response)
   return await bulkWrite(translations)
}
// Return the errored response from crowdin.

return response
}

async function bulkWrite(keyValuePairs) {
 return fetch(
   "https://api.cloudflare.com/client/v4/accounts" +
   "/:cf_account_id/storage/kv/namespaces/:cf_namespace_id/bulk",
   {

   method: "PUT",
   headers: {
   "Content-Type": "application/json",
   "X-Auth-Key": ":cf_auth_key",
   "X-Auth-Email": ":cf_email"
},
body: JSON.stringify(keyValuePairs)
      }
   )
}

async function zipToJson(response) {
     // ... omitted for brevity ...
     // (eg. https://stuk.github.io/jszip)

   return [
     {
key: "hello.EN", value: "Hello World"},
  return [
     {
key: "hello.ES", value: "Hola Mundo"}
     ]
  }



ページを翻訳したい場合はWorkers KVから読み取ります。




  async function translate(keys, lang) {
     // You bind your translations namespace to the TRANSLATIONS variable.

    return Promise.all(keys.map(key => TRANSLATIONS.get(key + "." + lang)))


その他、Workers KVは以下のような機能/性能を持っています。

  • ●アカウントあたり最大20個のNAME SPACE(それぞれKey数無制限)
  • ●最大512バイトのKeyと最大2MBのValue
  • ●異なるKeyに対する1秒あたりの書き込みは無制限
  • ●同じKeyに対して1秒あたり1回の書き込み
  • ●Keyごとの1秒あたりの読み取り数は無制限
  • ●Key&Valueペアに有効期限を付与することも可能(自動削除)


以前にCloudflare Workersスクリプトの事例を紹介しましたが、Workers KVについても実証して何れフィードバックさせて頂きたいと思います。




角田貴寛

 執筆者:角田 貴寛

三井情報株式会社
ソリューション技術本部 次世代基盤第二技術部 第一技術室
CISSP、CEH
現在、セキュリティ関連調査研究・教育業務に従事