使用AWS CDK进行无服务器项目,但我遇到了一个棘手的问题。我的项目部署了一个DynamoDB表,在执行Lambda函数之前,需要使用该表填充数据。
需要加载的数据是通过调用API生成的,而不是可以通过.json文件或简单的文件加载的静态数据。
关于如何满足生产工作负载这一要求的任何想法?
您可以使用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);
PutItem
如果创建堆栈或table
更新堆栈,则将触发该操作(tableName
在这种情况下应该是不同的)。如果由于某种原因它不起作用,则可以将其设置physicalResourceId
为随机值,即UUID,以在每次堆栈更新时触发操作(由于导致该操作是幂等的ConditionExpression
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句