DynamoDb 스트림 람다 트리거

과제



DynamoDb stream 이벤트를 구독하고 AWS lambda function 트리거해야 하는 일반적인 시나리오를 살펴보겠습니다. 이론과 tutorials에서 작업은 매우 간단해 보입니다.
  • 설정 a lambda
  • 첨부된 표와 함께 event source을 추가합니다.
    견본:

  • private subscribeToDynamoDbStream(
        lambdaRole: Role,
        layer: LayerVersion,
        applicationName: string,
        targetTable: ITable) {
        const lambda = new Function(this, `${applicationName}-lambda`, 
        {
              code: Code.fromAsset('functions/custom-trigger/src'),
              functionName: `${applicationName}-lambda`,
              handler: handler,
              layers: [layer],
              role: lambdaRole,
              runtime: Runtime.NODEJS_12_X,
         });
    
         lambda.addEventSource(new DynamoEventSource(targetTable, {
         startingPosition: StartingPosition.TRIM_HORIZON, }));
    }
    


    이 시나리오는 single repository 의 경우 람다, dynamodb 및 dynamodb 스트림이 동일한 스택에 프로비저닝되면 잘 작동합니다.

    문제



    더 복잡한 레이아웃에서는 dynamodb 자체가 생성되고 해당 dynamodb 스트림이 다른 스택에 프로비저닝됩니다. dynamodb arn이 SSM parameter store 에 저장되거나 이름이 알려져 있습니다.
    따라서 첫 번째 가져오기 테이블:

    private importTargetTable(environment: string, tableArn: string) {
        const table = Table.fromTableArn(this, 'ImportedTable', tableArn);
        return table;
      }
    


    그런 다음 subscribeToDynamoDbStream 함수를 호출합니다.

    const importedTable = importTargetTable(this.environment, this.tableArn);
    this.subscribeToDynamoDbStream(lambdaRole, layer, applicationName, importedTable);
    


    결과는 예상하지 못했습니다: DynamoDB Streams must be enabled on the table [tablename] . AWS 콘솔은 Dynamodb 스트림이 활성화되었음을 명확하게 보여줍니다. 빠른 인터넷 검색은 가장 확실한 것을 권장합니다: 이미 활성화된 기능을 활성화합니다. CDKsource code 검사에 따르면 fromTableArn 호출 중에 스트림 arn이 로드되지 않았을 가능성이 큽니다.

    해결책



    우선 DynamoDB 프로비저닝 중에 SSM으로 내보낸 DynamoDb 스트림이 있어야 합니다.

    const targetTable = new Table(this, `targeTableName`, {
       partitionKey: { ... },
       sortKey: { ... },
       ...
       stream: StreamViewType.NEW_AND_OLD_IMAGES,
       tableName: `targetTableName`
        });
       // Export target table stream arn to SSM
       new StringParameter(this.ctx, `targetTable-stream-arn`, {
          description: "Exported stream arn",
          parameterName: `/targeTable-stream-arn`,
          stringValue: targetTable.tableStreamArn!
        });  
    


    람다가 생성되고 dynamodb 스트림에 대한 구독이 설정된 스택에서 SSM에서 tableStreamArn를 읽습니다.

    옵션 1


    ITable 구성 방식 변경:

    private importTargetTable(environment: string, tableArn: string, tableStreamArn: string) {
        const table = Table.fromTableAttributes(this, 'ImportedTable', {
            tableArn: tableArn,
            tableStreamArn: tableStreamArn
        return table;
      }
    


    옵션 2



    기술적으로 말하면 DynamoDb 스트림 트리거가 있는 AWS 람다는 DynamoDb 테이블(및 arn)을 인식할 필요가 없습니다. 옵션 2는 위의 코드를 개선한 것으로 간주할 수 있습니다. 'Invent and Simplify' .
    람다가 생성되면 EventSourceMapping 객체를 사용하여 람다에 대한 DynamoDb 스트림 트리거를 활성화할 수 있습니다tableStreamArn.

    const lambda = new Function(this, ...);
    new EventSourceMapping(this, `lambda-trigger-mapping`, {
        eventSourceArn: tableStreamArn,
        startingPosition: StartingPosition.TRIM_HORIZON,
        // any necessary options of a choice, e.g. batchSize, retryAttempt, etc.
        target: lambda
    });
    


    이 게시물이 CDK 학습 여정에 도움이 되기를 바랍니다.
    최고의 소원..

    좋은 웹페이지 즐겨찾기