AWS CDK で CloudFront KeyValueStore の L2 Construct がサポートされました(ただし CloudFront Functions との関連付けは未対応)
こんにちは、CX 事業本部 Delivery 部の若槻です。
先日に AWS CDK v2.118.0 がリリースされ、CloudFront KeyValueStore の L2 Construct がサポートされました。
Features
- cloudfront: Key Value Store L2 (#28473) (030db42), closes #28377
これにより CloudFront Functions が利用する Key Value Store を AWS CDK でより簡単に構成できるようになりました。ただし注意点として、CloudFront Functions と KeyValueStore の関連付けは現時点でも未対応となります。
試してみた
CDK ライブラリのアップグレード
AWS CDK のモジュールを v2.118.0 以上にアップグレードします。
npm i aws-cdk@latest aws-cdk-lib@latest
型定義
node_modules
に生成された KeyValueStoreProps の型定義は以下となります。source
によりデータをあらかじめインポートできるようになっています。
/** * The properties to create a Key Value Store. */ export interface KeyValueStoreProps { /** * The unique name of the Key Value Store. * * @default A generated name */ readonly keyValueStoreName?: string; /** * A comment for the Key Value Store * * @default No comment will be specified */ readonly comment?: string; /** * The import source for the Key Value Store. * * This will populate the initial items in the Key Value Store. The * source data must be in a valid JSON format. * * @default No data will be imported to the store */ readonly source?: ImportSource; }
ここで、KeyValueStore を Function の関連付けはどう行えば良いのでしょうか。CloudFormation の「AWS::CloudFront::Function FunctionConfig」の定義を見ると KeyValueStoreAssociations
というプロパティがあります。CloudFront Functions 側で関連付けを構成する必要があるんですね。
{ "Comment" : String, "KeyValueStoreAssociations" : [ KeyValueStoreAssociation, ... ], "Runtime" : String }
そこで node_modules
に生成された FunctionConfigProperty の型定義を見ると KeyValueStoreAssociations
は存在しません。これは L1 の定義でもあるのでエスケープハッチによる対応も行えません。
/** * Contains configuration information about a CloudFront function. * * @struct * @stability external * @see http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html */ interface FunctionConfigProperty { /** * A comment to describe the function. * * @see http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html#cfn-cloudfront-function-functionconfig-comment */ readonly comment: string; /** * The function's runtime environment version. * * @see http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-function-functionconfig.html#cfn-cloudfront-function-functionconfig-runtime */ readonly runtime: string; }
今回のアップデートの Pull Request でもコントリビューターの方が関連付けの未対応を指摘しています。
This adds an initial resource to support creating a Key Value Store and specifying an import source. Unfortunately, CloudFormation doesn't seem to support specifying the KeyValueStoreAssociations property of a function so there isn't a way to actually associate the store with a function.
よって、KeyValueStore の AWS CDK での CloudFront Functions との関連付は現時点ではサポートされておらず、リソースの作成のみとなります。
実装
インポートするデータをあらかじめ作成しておきます。ここでは以下のような JSON ファイルを用意しました。
{ "data": [ { "key": "key1", "value": "value" }, { "key": "key2", "value": "value" } ] }
aws_cloudfront.KeyValueStore
クラスを使用して KeyValueStore を作成します。データをインポートしない場合とする場合で試してみます。
import { aws_cloudfront, Stack } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkSampleStack extends Stack { constructor(scope: Construct, id: string) { super(scope, id); // CloudFront KeyValueStore の作成 new aws_cloudfront.KeyValueStore(this, 'KeyValueStore'); // CloudFront KeyValueStore の作成、データの投入 new aws_cloudfront.KeyValueStore(this, 'KeyValueStoreWithData', { source: aws_cloudfront.ImportSource.fromAsset('kvs-data.json'), }); } }
CDK デプロイをすると、以下のような CloudFormation リソースが作成されます。データのインポートに伴うカスタムリソースの作成はされないようです。
CloudFront のコンソールから、データがインポートされていない KeyValueStore と、されていない KeyValueStore が作成されたことを確認できました。
投入データを変更する場合はリソースの再作成が必要
ここで、投入するデータを変更して再度 CDK デプロイを行ってみます。
{ "data": [ { "key": "key1", "value": "value" }, { "key": "key2", "value": "value" }, { "key": "key3", "value": "value" } ] }
しかしデプロイが cannot update a stack when a custom-named resource requires replacing. Rename CdkSampleStackKeyValueStoreWithData
というエラーとなりました。
$ npm run deploy > [email protected] deploy > cdk deploy --require-approval never --method=direct ✨ Synthesis time: 3.38s CdkSampleStack: start: Building 9c0c42c1ee61ea786ad7840cb8809cefd3554138235087ff94532b3a9e5277fb:current_account-current_region CdkSampleStack: success: Built 9c0c42c1ee61ea786ad7840cb8809cefd3554138235087ff94532b3a9e5277fb:current_account-current_region CdkSampleStack: start: Publishing 9c0c42c1ee61ea786ad7840cb8809cefd3554138235087ff94532b3a9e5277fb:current_account-current_region CdkSampleStack: start: Building e63b40bb5b76c03aa7989a7532723e6ee66ad6e57474ee3f4aca9365b9b70451:current_account-current_region CdkSampleStack: success: Built e63b40bb5b76c03aa7989a7532723e6ee66ad6e57474ee3f4aca9365b9b70451:current_account-current_region CdkSampleStack: start: Publishing e63b40bb5b76c03aa7989a7532723e6ee66ad6e57474ee3f4aca9365b9b70451:current_account-current_region CdkSampleStack: success: Published 9c0c42c1ee61ea786ad7840cb8809cefd3554138235087ff94532b3a9e5277fb:current_account-current_region CdkSampleStack: success: Published e63b40bb5b76c03aa7989a7532723e6ee66ad6e57474ee3f4aca9365b9b70451:current_account-current_region CdkSampleStack: deploying... [1/1] CdkSampleStack: updating stack... 8:47:03 PM | UPDATE_FAILED | AWS::CloudFront::KeyValueStore | KeyValueStoreWithData553D2977 CloudFormation cannot update a stack when a custom-named resource requires replacing. Rename CdkSampleStackKeyValueStoreWithData D700711C and update the stack again.
投入データを変更する場合は、結果としてリソースの作り直し(削除デプロイ→再作成デプロイ)をする必要がありました。また source プロパティの追加、削除の場合も同じ挙動となりました。物理 ID を指定していないので L2 Construct ならよろしくやってくれそうではありますが、ここは制限であるようです。
しかし、KeyValueStore のデータ投入は、マネジメントコンソールから手動で行いたい場合がほとんどだと思うので、上記のように CDK で管理することはあまりないかもしれません。
おわりに
AWS CDK で CloudFront KeyValueStore の L2 Construct がサポートされたのでご紹介しました。
今回は KeyValueStore の作成だけで、CloudFront Functions との関連付けが未対応なのは片手落ちな感が大きいですが、少なくともリソースは L2 Construct で管理可能になりました。遠くない将来に関連付けもサポートされると思うので、今後のアップデートに期待しておきましょう。(もしくは自らコントリビュートを行いましょう)
以上