CloudFront KeyValueStoreがリリース。CloudFront Functionsからキーバリューストアを利用可能に!

2023.11.22

AWS向けのCDNサービスCloudFrontがCDNエッジ向けのグローバルかつ低遅延なキーバリューストアAmazon CloudFront KeyValueStoreをリリースしました。 CloudFront向けエッジ・コンピューティングサービスのCloudFront Functions(CF2)から利用出来ます。

CF2はLambda@Edge(L@E)に比べて速くて安いといったメリットもありましたが、CloudFront Functions関数内に閉じた簡易的な文字列操作しか出来ませんでした。 そのため、豊富なライブラリのインストール、さらには、インターネットアクセス(DB接続)も可能なL@Eに比べて、処理内容が限定的でした。

今回のアップデートにより、CloudFront FunctionsはデータストアKeyValueStoreと連携し、設定を元に処理を変えたり、小規模なアプリをエッジだけで動作させたり、CF2のコードに持たせていた設定をKVSに外だししたりと活用の幅が大いに広がるでしょう。

CloudflareのWorkers KVやFastlyのKV Store相当の機能です。

Amazon CloudFront KeyValueStoreについて

Amazon CloudFront KeyValueStoreは名前の通りCDN CloudFront向けの安全・グローバル・低遅延なキーバリューストアです。

CloudFront Functions向けのデータストアであり、Lambda@Edgeからはアクセス出来ません。

ユースケースとしては、KeyValueStoreのデータを元に、以下のような処理を行えます。

  • URLのリダイレクト・書き換え
  • A/Bテストフラグ
  • 認可ロジック

データストアには最大5MBのデータを保存でき、キーの最大サイズは512バイト、値の最大サイズは1KBです。

利用費は100万回の読み取りあたり $0.03 です。最大5MBのデータストア費用は発生しません。

KVSのバリュー(値)には、以下のタイプが指定できます。

  • 文字列
  • エンコード文字列
  • JSON

データストアにS3から指定のフォーマットでデータをインポートすることもできます。

{
  "data":[
    {
      "key":"key1",
      "value":"value"
    },
    {
      "key":"key2",
      "value":"value"
    }
  ]
}

操作の流れ

KeyValueStoreを作成し、CloudFront Functionsと紐づけるだけで準備完了です。

CloudFront Functionsのランタイム 2.0 にはヘルパーメソッドが用意されており、以下の様にして簡単に KeyValueStore を操作できます。

import cf from 'cloudfront';
const kvsId = 'XXX';
const kvsHandle = cf.kvs(kvsId);
value = await kvsHandle.get(key);

やってみた

実際にコンソールから操作してみます。

1. CloudFront KeyValueStore の作成

コンソールでは、CloudFrontのFunctions配下に、CloudFront Functionsと並列にKeyValueStoreのメニューが追加されています。

「Create KeyValueStore」からKeyValueStoreを作成します。

S3経由でデータをロードすることもできます。

初期データとして、food:udon の1レコードを追加します。

2. CloudFront Function の作成と KeyValueStorとの紐づけ

CloudFront Functionの編集画面で「Associated KeyValueStore」から手順1で作成した KeyValueStore と紐づけます。

紐付けると、このKVSを利用するサンプルコードも提供されるので、そのまま利用しましょう。

URIのパスを / で区切って先頭のパス部をキーにして KeyValueStore から値を取得し、レスポンスに利用するという、シンプルなコードです。

kvsId の値は実際の環境に合わせて調整してください。

import cf from 'cloudfront';

const kvsId = 'XXX';

// This fails if the key value store is not associated with the function
const kvsHandle = cf.kvs(kvsId);

async function handler(event) {
    // Use the first part of the pathname as key, for example http(s)://domain/<key>/something/else
    const key = event.request.uri.split('/')[1]
    let value = "Not found" // Default value
    try {
        value = await kvsHandle.get(key);
    } catch (err) {
        console.log(`Kvs key lookup failed for ${key}: ${err}`);
    }
    var response = {
        statusCode: 200,
        statusDescription: 'OK',
        headers: {
            'x-added-by-cf': { "value": value }
        },
        body: {
            encoding: 'text',
            data: `Key: ${key} Value: ${value}`
        }
    };
    return response;
}

3. CloudFront Function を公開

作成した CloudFront Functionを公開し、ディストリビューションの Viewer Request に紐づます。

4. CloudFront から動作確認

ディストリビューションに GET メソッドでアクセスして動作確認します。

設定直後はデプロイが完了していないため、KVSにアクセスしても、値が見つかりません。

$ curl https://XXX.cloudfront.net/food
Key: food Value: Not found

暫く経つと、値が見つかりました。

$ curl -D -  https://XXX.cloudfront.net/food
HTTP/2 200
server: CloudFront
date: Tue, 21 Nov 2023 22:29:26 GMT
content-length: 21
x-added-by-cf: udon
x-cache: FunctionGeneratedResponse from cloudfront
via: 1.1 XXX.cloudfront.net (CloudFront)
x-amz-cf-pop: NRT12-C3
alt-svc: h3=":443"; ma=86400
x-amz-cf-id: dS8NIRsrhdwcb-1BW_uaIwLHFamqziWQ_oDSyM5aL262t9H3yjN4qw==

Key: food Value: udon

ヘルパーメソッド

提供されているヘルパーメソッドは以下の3つです。(参考

  • get : キーからバリューを取得
  • exists : キーが存在するかチェック
  • meta : KVSのレコード数、作成・最終更新日時を取得

更新系メソッドは存在しません。

また、データアクセスのインターフェースはSQLではなくKey/Valueです。

KeyValueStoreのデータ更新はエッジではなくAWSリージョン側でのみ行なえ、エッジに結果整合性的に展開されると考えられます。 このときにポイントとなるのは meta メソッドの返す「最終更新日時(lastUpdatedDateTime)」です

データはCloudFront Functions起動時にメモリ上に展開されます。

デプロイ時の注意

CloudFront Functionはパブリッシュして初めてコードがデプロイされます。

関数に紐づく KeyValueStore 情報も、デプロイして初めて反映されます。

そのため、KeyValueStore の付け替えを行うと、公開が完了するまでは

  • Development KeyValueStore(デプロイされるKVS)
  • Live KeyValueStore(デプロイ済みのKVS)

が異なります。

最後に

エッジコンピューティングのCloudFront Functionから利用できるエッジ向けのキーバリューストア KeyValueStore がリリースされました。

従来のCloudFront Functionは外部との連携ができませんでしたが、今回のアップデートにより、KVSの設定によって動きを変えたり、CloudFront Functionsのコード内に持たせていた設定情報をKVSに外だししてコードと設定を独立させたり、小規模なアプリケーションをエッジだけで動作させたりと、活用の幅が大きく広がります。

5MBのリードオンリーなデータストアで何ができるか想像力を働かせ、CloudFront Functionsをガンガン使い倒しましょう。

それでは。

参考