Lambda로 Amazon Kinesis Data Streams 레코드 처리 - AWS Lambda

Lambda로 Amazon Kinesis Data Streams 레코드 처리

Lambda로 Amazon Kinesis Data Streams 레코드를 처리하려면 스트림에 대한 소비자를 생성한 다음 Lambda 이벤트 소스 매핑을 생성합니다.

데이터 스트림과 함수 구성

Lambda 함수는 데이터 스트림의 소비자 애플리케이션입니다. 이 함수는 각 샤드에서 한 번에 한 개의 레코드 배치를 처리합니다. Lambda 함수를 공유 처리량 소비자(표준 반복기)에 매핑하거나 향상된 팬 아웃 기능이 있는 전용 처리량 소비자에 매핑할 수 있습니다.

  • 표준 반복자: Lambda는 초당 1회의 속도로 Kinesis 스트림의 각 샤드에서 레코드를 폴링합니다. 더 많은 레코드를 사용할 수 있는 경우 Lambda는 함수가 스트림을 따라잡을 때까지 배치 처리를 유지합니다. 이벤트 소스 매핑은 샤드의 다른 소비자와 읽기 처리량을 공유합니다.

  • 향상된 팬아웃: 지연 시간을 최소화하고 읽기 처리량을 최대화하려면 향상된 팬아웃으로 데이터 스트림 소비자를 생성하세요. 향상된 팬아웃 소비자는 각 샤드에 대해 전용 연결을 설정하므로 스트림에서 읽는 다른 애플리케이션에 영향을 주지 않습니다. 스트림 소비자는 HTTP/2를 사용하여 수명이 긴 연결을 통해 레코드를 Lambda에 푸시하고 요청 헤더를 압축함으로써 지연 시간을 최소화합니다. Kinesis RegisterStreamConsumer API를 사용하여 스트림 소비자를 생성할 수 있습니다.

aws kinesis register-stream-consumer \ --consumer-name con1 \ --stream-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream

다음 결과가 표시됩니다:

{
    "Consumer": {
        "ConsumerName": "con1",
        "ConsumerARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream/consumer/con1:1540591608",
        "ConsumerStatus": "CREATING",
        "ConsumerCreationTimestamp": 1540591608.0
    }
}

함수가 레코드를 처리하는 속도를 높이려면 데이터 스트림에 샤드를 추가합니다. Lambda는 각 샤드의 레코드를 순서대로 처리합니다. 함수가 오류를 반환하면 샤드는 추가 레코드 처리를 중지합니다. 샤드가 많을수록 한 번에 더 많은 배치가 처리되므로 동시 실행에 대한 오류의 영향이 줄어듭니다.

함수가 총 동시 배치 수를 처리하기 위해 확장할 수 없는 경우 함수에 대한 할당량 증가를 요청하거나 동시성을 예약합니다.

이벤트 소스 매핑을 생성하여 Lambda 함수 간접 호출

데이터 스트림의 레코드와 함께 Lambda 함수를 간접 호출하려면 이벤트 소스 매핑을 생성합니다. 여러 이벤트 소스 매핑을 생성하여 여러 Lambda 함수로 동일한 데이터를 처리하거나, 단일 함수로 여러 데이터 스트림의 항목을 처리할 수 있습니다. 여러 스트림에서 항목을 처리할 때 각 배치에는 단일 샤드 또는 스트림의 레코드만 포함됩니다.

다른 AWS 계정에서 스트림의 레코드를 처리하도록 이벤트 소스 매핑을 구성할 수 있습니다. 자세한 내용은 계정 간 이벤트 소스 매핑 생성을 참조하십시오.

이벤트 소스 매핑을 생성하기 전에 Kinesis 데이터 스트림에서 읽을 수 있는 권한을 Lambda 함수에 부여해야 합니다. Lambda는 Kinesis 데이터 스트림 관련 리소스를 관리하기 위해 다음 권한이 필요합니다.

AWS 관리형 정책 AWSLambdaKinesisExecutionRole에는 다음 권한이 포함됩니다. 다음 절차의 설명에 따라 함수에 해당 관리형 정책을 추가합니다.

AWS Management Console
함수에 Kinesis 권한을 추가
  1. Lambda 콘솔의 함수 페이지를 열고 함수를 선택합니다.

  2. 구성 탭을 선택한 다음 사용 권한을 선택합니다.

  3. 실행 역할 창의 역할 이름에서 함수의 실행 역할 링크를 선택합니다. 이 링크를 클릭하면 IAM 콘솔에서의 해당 역할 페이지가 열립니다.

  4. 권한 정책 창에서 권한 추가를 선택한 다음 정책 연결을 선택합니다.

  5. 검색 필드에 AWSLambdaKinesisExecutionRole를 입력합니다.

  6. 정책 옆의 확인란을 선택하고 권한 추가를 선택합니다.

AWS CLI
함수에 Kinesis 권한을 추가
  • 함수의 실행 역할에 AWSLambdaKinesisExecutionRole 정책을 연결하려면 다음 CLI 명령을 실행합니다.

    aws iam attach-role-policy \ --role-name MyFunctionRole \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole
AWS SAM
함수에 Kinesis 권한을 추가
  • 함수 정의에서 다음 예제처럼 Policies 속성을 추가합니다.

    Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./my-function/ Handler: index.handler Runtime: nodejs22.x Policies: - AWSLambdaKinesisExecutionRole

필요한 권한을 구성한 후 이벤트 소스 매핑을 생성합니다.

AWS Management Console
Kinesis 이벤트 소스 매핑 생성
  1. Lambda 콘솔의 함수 페이지를 열고 함수를 선택합니다.

  2. 함수 개요 창에서 트리거 추가를 선택합니다.

  3. 트리거 구성에서 소스로 Kinesis를 선택합니다.

  4. 이벤트 소스 매핑을 생성할 Kinesis 스트림과 필요에 따라 스트림 소비자를 선택합니다.

  5. (선택 사항)이벤트 소스 매핑에 대해 배치 크기, 시작 위치배치 창을 편집합니다.

  6. 추가를 선택합니다.

콘솔에서 이벤트 소스 매핑을 생성하는 경우 IAM 역할에는 kinesis:ListStreamskinesis:ListStreamConsumers 권한이 있어야 합니다.

AWS CLI
Kinesis 이벤트 소스 매핑 생성
  • 다음 CLI 명령을 실행하여 Kinesis 이벤트 소스 매핑을 생성합니다. 사용 사례에 따라 배치 크기와 시작 위치를 직접 선택합니다.

    aws lambda create-event-source-mapping \ --function-name MyFunction \ --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \ --starting-position LATEST \ --batch-size 100

배치 기간을 지정하려면 --maximum-batching-window-in-seconds 옵션을 추가합니다. 이 파라미터와 다른 파라미터에 대한 자세한 내용은 AWS CLI 명령 참조의 create-event-source mapping을 참조하세요.

AWS SAM
Kinesis 이벤트 소스 매핑 생성
  • 함수 정의에서 다음 예제처럼 KinesisEvent 속성을 추가합니다.

    Resources: MyFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./my-function/ Handler: index.handler Runtime: nodejs22.x Policies: - AWSLambdaKinesisExecutionRole Events: KinesisEvent: Type: Kinesis Properties: Stream: !GetAtt MyKinesisStream.Arn StartingPosition: LATEST BatchSize: 100 MyKinesisStream: Type: AWS::Kinesis::Stream Properties: ShardCount: 1

AWS SAM에서 Kinesis Data Streams의 이벤트 소스 매핑을 생성하는 방법에 대해 자세히 알아보려면 AWS Serverless Application Model 개발자 안내서의 Kinesis를 참조하세요.

폴링 및 스트리밍 시작 위치

이벤트 소스 매핑 생성 및 업데이트 중 스트림 폴링은 최종적으로 일관됩니다.

  • 이벤트 소스 매핑 생성 중 스트림에서 이벤트 폴링을 시작하는 데 몇 분 정도 걸릴 수 있습니다.

  • 이벤트 소스 매핑 업데이트 중 스트림에서 이벤트 폴링을 중지했다가 다시 시작하는 데 몇 분 정도 걸릴 수 있습니다.

이 동작은 스트림의 시작 위치로 LATEST를 지정하면 이벤트 소스 매핑이 생성 또는 업데이트 중에 이벤트를 놓칠 수 있음을 의미합니다. 누락된 이벤트가 없도록 하기 위해서는 스트림 시작 위치를 TRIM_HORIZON 또는 AT_TIMESTAMP로 지정하세요.

계정 간 이벤트 소스 매핑 생성

Amazon Kinesis Data Streams는 리소스 기반 정책을 지원합니다. 따라서 다른 계정의 Lambda 함수를 사용하여 스트림으로 수집된 데이터를 하나의 AWS 계정에서 처리할 수 있습니다.

다른 AWS 계정에서 Kinesis 스트림을 사용하여 Lambda 함수에 대한 이벤트 소스 매핑을 생성하려면 리소스 기반 정책을 사용하여 스트림을 구성해서 Lambda 함수에 항목 읽기 권한을 부여합니다. 크로스 계정 액세스를 허용하도록 스트림을 구성하는 방법을 알아보려면 Amazon Kinesis Streams 개발자 안내서의 교차 계정 AWS Lambda 함수를 통한 액세스 공유를 참조하세요.

Lambda 함수에 필요한 권한을 부여하는 리소스 기반 정책으로 스트림을 구성하고 나면 이전 섹션에서 설명한 방법 중 하나를 사용하여 이벤트 소스 매핑을 생성합니다.

Lambda 콘솔을 사용하여 이벤트 소스 매핑을 생성하기로 선택한 경우 스트림의 ARN을 입력 필드에 직접 붙여넣기합니다. 스트림의 소비자를 지정하려는 경우 소비자의 ARN을 붙여넣기하면 스트림 필드가 자동으로 채워집니다.