AWS-CDK - DynamoDB 初始数据

Ser*_*key 5 amazon-web-services aws-cdk

将 AWS CDK 用于无服务器项目,但我遇到了一个症结。我的项目部署了一个 DynamoDB 表,我需要在执行 Lambda 函数之前填充数据。

需要加载的数据是通过调用 API 生成的,而不是可以通过 .json 文件或简单的东西加载的静态数据。

关于如何满足生产工作负载的这一要求的任何想法?

Rom*_*nko 5

您可以使用AwsCustomResourcePutItem调用表。

AwsSdkCall initializeData = AwsSdkCall.builder()
        .service("DynamoDB")
        .action("putItem")
        .physicalResourceId(PhysicalResourceId.of(tableName + "_initialization"))
        .parameters(Map.ofEntries(
                Map.entry("TableName", tableName),
                Map.entry("Item", Map.ofEntries(
                        Map.entry("id", Map.of("S", "0")),
                        Map.entry("data", Map.of("S", data))
                )),
                Map.entry("ConditionExpression", "attribute_not_exists(id)")
        ))
        .build();

AwsCustomResource tableInitializationResource = AwsCustomResource.Builder.create(this, "TableInitializationResource")
        .policy(AwsCustomResourcePolicy.fromStatements(List.of(
                PolicyStatement.Builder.create()
                        .effect(Effect.ALLOW)
                        .actions(List.of("dynamodb:PutItem"))
                        .resources(List.of(table.getTableArn()))
                        .build()
        )))
        .onCreate(initializeData)
        .onUpdate(initializeData)
        .build();
tableInitializationResource.getNode().addDependency(table);
Run Code Online (Sandbox Code Playgroud)

PutItem如果创建堆栈或table更新堆栈(tableName在这种情况下应该不同),将触发该操作。如果由于某种原因不起作用,您可以设置physicalResourceId为随机值,即UUID,以触发每次堆栈更新的操作(该操作是幂等的ConditionExpression