AWS-CDK - DynamoDB 初始数据
AWS-CDK - DynamoDB Initial Data
将 AWS CDK 用于无服务器项目,但我遇到了症结所在。我的项目部署了一个 DynamoDB table,我需要在执行 Lambda 函数之前用数据填充它。
需要加载的数据是通过 API 调用生成的,不是可以通过 .json 文件或其他简单的东西加载的静态数据。
关于如何满足生产工作负载的这一要求有什么想法吗?
CustomResource 允许您编写自定义配置逻辑。在这种情况下,您可以在自定义资源中使用 AWS Lambda 函数之类的东西来读取自定义 json 并更新 DynamoDb。
您可以使用 AwsCustomResource 来 PutItem
调用 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
,该操作是幂等的)
将 AWS CDK 用于无服务器项目,但我遇到了症结所在。我的项目部署了一个 DynamoDB table,我需要在执行 Lambda 函数之前用数据填充它。
需要加载的数据是通过 API 调用生成的,不是可以通过 .json 文件或其他简单的东西加载的静态数据。
关于如何满足生产工作负载的这一要求有什么想法吗?
CustomResource 允许您编写自定义配置逻辑。在这种情况下,您可以在自定义资源中使用 AWS Lambda 函数之类的东西来读取自定义 json 并更新 DynamoDb。
您可以使用 AwsCustomResource 来 PutItem
调用 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
,该操作是幂等的)