在一个无服务器项目中使用AWS CDK,但我遇到了一个症结。我的项目部署了一个DynamoDB表,在执行Lambda函数之前,我需要用数据填充该表。
需要加载的数据是通过进行API调用生成的,而不是可以通过.json文件或其他简单文件加载的静态数据。
对于如何满足生产工作负载的这一要求,您有什么想法吗?
发布于 2020-07-22 00:27:32
您可以使用AwsCustomResource对表进行PutItem调用。
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 (在这种情况下,tableName应该是不同的),则会触发PutItem操作。如果由于某些原因不起作用,可以将physicalResourceId设置为随机值,即UUID,以触发每次堆栈更新的操作(由于ConditionExpression,该操作是幂等的)
发布于 2020-07-04 18:05:58
CustomResource允许您编写自定义配置逻辑。在这种情况下,您可以在自定义资源中使用类似于AWS Lambda函数的内容来读取自定义json并更新DynamoDb。
https://stackoverflow.com/questions/62724486
复制相似问题