AWS-CDK - DynamoDB 初始数据

AWS-CDK - DynamoDB Initial Data

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

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

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

CustomResource 允许您编写自定义配置逻辑。在这种情况下,您可以在自定义资源中使用 AWS Lambda 函数之类的东西来读取自定义 json 并更新 DynamoDb。

您可以使用 AwsCustomResourcePutItem 调用 table。

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);

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