Uso el CDK de AWS para un proyecto sin servidor, pero he llegado a un punto conflictivo. Mi proyecto implementa una tabla de DynamoDB que necesito completar con datos antes de ejecutar mi función Lambda.
Los datos que deben cargarse se generan mediante llamadas a la API y no son datos estáticos que puedan cargarse mediante un archivo .json o algo simple.
¿Alguna idea sobre cómo abordar este requisito para una carga de trabajo de producción?
Puede usar AwsCustomResource para realizar una llamada PutItem a la tabla.
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); La operación PutItem se activará si se crea la pila o si se actualiza la table (se supone que tableName es diferente en ese caso). Si no funciona por alguna razón, puede configurar el ID de recurso physicalResourceId en un valor aleatorio, es decir, UUID, para activar la operación para cada actualización de la pila (la operación es idempotente debido a ConditionExpression )
CustomResource le permite escribir una lógica de aprovisionamiento personalizada. En este caso, podría usar algo como una función AWS Lambda en un recurso personalizado para leer el json personalizado y actualizar DynamoDb.