要订阅区域 aws lambda 中的 dynamodb 全局表流吗?

问题描述 投票:0回答:1

这是我的区域 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",
                ...
amazon-web-services aws-cdk amazon-dynamodb-streams
1个回答
0
投票

好的。这个想法来自这个答案

我是如何做到这一点的,就像那样(顺便说一句,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,
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.