从 AWS CDK 中的另一个堆栈更新 DynamoDB table

Update DynamoDB table from another stack in AWS CDK

我正在寻找 TypeScript 代码以使用 lambda 和 API 网关从另一个堆栈更新在一个堆栈中创建的 DynamoDB。两个堆栈都在相同的环境中。如果可行,请指教。

我对您的要求的理解:您之前使用 DynamoDB table 部署了一个 CDK 应用程序(我们称之为应用程序堆栈 DynamoStack)。现在你有了一个新的堆栈——比如说,APIStack——带有一个由 Lambda 目标支持的 API 网关。您的 APIStack 如何从 DynamoStack 访问 table 以便您的 Lambda 可以 read/write 访问 table?

更喜欢 Multi-Stack 应用程序

理想情况下,您可以将 APIStack 添加到包含您的 DynamoStack 的应用程序中。将相关堆栈分组在单个 CDK 应用程序中通常很好。如果这样做,在堆栈之间传递资源就很简单了。只需将 dynamodb.TableDynamoStack 导出为 class 字段并将其作为道具传递给 APIStack

单独的应用程序

如果出于某种原因在单个应用程序中对堆栈进行分组不可行,连接 cross-stack 引用需要更多步骤。

DynamoStack 中,创建一个 CloudFormation 输出,其导出名称可以导入到其他堆栈中:

// DynamoStack.ts
new cdk.CfnOutput(this, 'TableArn', { value: table.tableArn, exportName: 'DemoTableArn' });

APIStack 中,使用导入的 ARN 创建一个 ITable 引用。用它来设置 Lambda env var 并让 lambda read-write 访问 table:

// ApiStack.ts
const tableArn = cdk.Fn.importValue('DemoTableArn');
const table: dynamodb.ITable = dynamodb.Table.fromTableArn(this, 'ITable', tableArn);

const func = new nodejs.NodejsFunction(this, 'MyHandlerFunction', {
  entry: path.join(__dirname, 'func.ts'),
  environment: {
    TABLE_NAME: cdk.Arn.extractResourceName(tableArn, 'table'),
  },
});

table.grantReadWriteData(func);