AWS Lambda 함수에 대한 DynamoDB 이벤트 필터링

10604 단어 cdkdynamodb

AWS Lambda 함수에 대한 DynamoDB 이벤트 필터링



AWS Lambda는 이제 콘텐츠 필터링 옵션 DynamoDB를 이벤트 소스로 제공합니다. 이를 통해 원하는 데이터만 포함하도록 이벤트를 필터링할 수 있습니다. 이를 통해 고객의 Lambda 기능에 대한 트래픽을 줄이고 코드를 간소화하며 전체 비용을 절감할 수 있습니다.

그러나 AWS CDK는 아직 이를 지원할 수 없습니다. AWS CDK Lambda event filtering에서 이 기능의 진행 상황을 추적할 수 있습니다.

CDK에서 AWS Lambda 함수에 대한 DynamoDB 이벤트를 필터링하는 방법



CDK에서 AWS Lambda 함수에 대한 DynamoDB 이벤트를 필터링하는 방법의 예를 살펴보겠습니다.




// 1. Create a DynamoDB table
const dynamoTable = new dynamodb.Table(this, 'DynamoTable', {
  partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
  billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
  removalPolicy: RemovalPolicy.DESTROY,
  stream: dynamodb.StreamViewType.NEW_AND_OLD_IMAGES,
})

// 2. Create a Lambda function that will be triggered by the DynamoDB stream
// you can see how to create lambda functions in typescript in the following link:
// https://www.codewithyou.com/blog/writing-typescript-lambda-in-aws-cdk
const fn = new NodejsFunction(this, 'Handler', {
  entry: './lambda/index.ts',
  handler: 'main',
  runtime: lambda.Runtime.NODEJS_14_X,
  architecture: lambda.Architecture.ARM_64,
  bundling: {
    externalModules: ['aws_sdk'],
    minify: true,
  },
})

// 3. currently, aws cdk is not yet support filtering event sources
// https://github.com/aws/aws-cdk/issues/17874
// So, we need create a source mapping to map the DynamoDB table to the Lambda function
const sourceMapping = new lambda.EventSourceMapping(this, 'SourceMapping', {
  startingPosition: lambda.StartingPosition.TRIM_HORIZON,
  batchSize: 1, // only process one record at a time
  target: fn, // the lambda function to trigger
  eventSourceArn: dynamoTable.tableStreamArn, // the DynamoDB stream to read from
  bisectBatchOnError: true, // if the Lambda function fails, split the batch into two
  retryAttempts: 3, // retry 3 times if the Lambda function fails
})

// grant the function stream access to the DynamoDB table
dynamoTable.grantStreamRead(fn)

// filter the event source mapping to only process records with the specified event type (in this case, "INSERT")
const cfnSourceMapping = sourceMapping.node.defaultChild as lambda.CfnEventSourceMapping // get the underlying CloudFormation resource

cfnSourceMapping.addPropertyOverride('FilterCriteria', {
  Filters: [
    {
      Pattern: JSON.stringify({
        eventName: ['INSERT'], // only process INSERT events
      }),
    },
  ],
})


위의 코드를 살펴보겠습니다.


  • DynamoDB 테이블을 생성했습니다. 이 테이블이 이벤트의 소스가 됩니다.
  • TypeScript로 작성된 Lambda 함수를 생성했습니다. 다음 링크에서 TypeScript에서 람다 함수를 만드는 방법을 확인할 수 있습니다.
    https://www.codewithyou.com/blog/writing-typescript-lambda-in-aws-cdk
  • DynamoDB 테이블을 Lambda 함수에 매핑하기 위해 소스 매핑을 생성했습니다. 이 소스 매핑은 Lambda 함수의 이벤트 소스가 됩니다.
  • 지정된 이벤트 유형(이 경우 "INSERT")이 있는 레코드만 처리하도록 소스 매핑을 필터링했습니다.

  • cfnSourceMapping.addPropertyOverride('FilterCriteria', {
      Filters: [
        {
          Pattern: JSON.stringify({
            eventName: ['INSERT'], // only process INSERT events
          }),
        },
      ],
    })
    


    이 코드 조각은 소스 매핑에 필터를 추가합니다. 필터는 이벤트 유형이 "INSERT"인 레코드만 처리합니다. 필터는 속성 재정의로 소스 매핑에 추가됩니다.

    The code for this article is available on GitHub



    전체 스택을 AWS에 배포합니다.

    yarn deploy
    


    스택이 배포된 후 DynamoDB 테이블에 항목을 추가하여 DynamoDB 스트림에 의해 Lambda 함수가 트리거되는 것을 볼 수 있습니다.





    청소



    스택을 삭제하는 것을 잊지 마십시오. 다음 명령을 실행하여 이를 수행할 수 있습니다.

    npx cdk destroy
    


    이 기사를 읽어 주셔서 감사합니다. 질문이 있으시면 댓글을 남겨주세요. 가능한 한 빨리 귀하의 질문에 답변하도록 노력하겠습니다.

    좋은 웹페이지 즐겨찾기