这是我的区域 lambda sdk 配置。
问题似乎是tableStreamArn:
const globalTableTableName = "my-org-glb-table1"
const regionalTable = Table.fromTableAttributes(this, `Table-${Stack.of(this).region}`, {
tableName: globalTableTableName,
tableStreamArn: `arn:aws:dynamodb:${Stack.of(this).region}:${this.account}:table/${globalTableTableName}/stream/latest` // here !
});
const eventSource = new DynamoEventSource(regionalTable, {
startingPosition: StartingPosition.TRIM_HORIZON,
batchSize: 5,
bisectBatchOnError: true,
retryAttempts: 2
});
lambda1.addEventSource(eventSource);
我不知道表将有什么流,所以我的 lambda 堆栈无法部署。
拥有
stream/latest
- 不起作用:
❌ 部署失败:错误:堆栈名为 app-my-org-lambda-stack 创建失败, 可能需要从 AWS 控制台手动删除它: ROLLBACK_COMPLETE:资源处理程序返回消息:“无效请求 提供:未找到流: arn:aws:dynamodb:us-east-1:123456789012:table/app-my-org-glb-table1/stream/latest (服务:Lambda,状态代码:400,请求 ID: e165f9e7-f808-4528-b383-4992861e5aa0)”(请求令牌: d98d6f65-21d1-80b0-4ab3-7a3fc9430268,处理程序错误代码: 无效请求)
除非我做错了,否则我已经检查了这个和那个:
听起来不错,但是如何让它发挥作用呢?
附注 我使用 L1 构造来创建全局表,并测试它是否可部署并且流就在那里(带有一些 ARN)。
if(stackRegion == PRIMARY_REGION) {
const globalTable = new CfnGlobalTable(this, 'my-org-glb-table1', {
tableName: "my-org-glb-table1",
...
好的。这个想法来自这个答案。
我是如何做到这一点的,就像那样(顺便说一句,GPT 失败了):
const globalTableTableName =“my-org-glb-table1”
// getting the stream arn for the table
const streamArnProvider = this.getStreamArnProviderService(props.lambdaStreamArnProviderArn, ecrRepo);
const streamArnResource = new CustomResource(this, 'StreamArnResource', {
serviceToken: streamArnProvider.serviceToken,
properties: {
TableName: globalTableTableName // this is where we pass table name to the lambda
}
});
const streamArn = streamArnResource.getAtt('StreamArn').toString();
const regionalTable = Table.fromTableAttributes(this, `${globalTableTableName}-${Stack.of(this).region}`, {
tableName: globalTableTableName,
tableStreamArn: streamArn
});
哪里: 私有 getStreamArnProviderService(streamArnProviderLambdaArn: string, ecrRepo: IRepository): 提供者 {
const streamArnProviderLambda = lambda.Function.fromFunctionAttributes(this, 'ImportedLambda', {
functionArn: streamArnProviderLambdaArn,
// true, since the Lambda function is in the same environment and we want CDK to manage permissions
sameEnvironment: true
});
return new Provider(this, 'StreamArnProviderService', {
onEventHandler: streamArnProviderLambda,
});
}