Lambda를 사용한 DynamoDB 스트림

Lambdaleul Sayonghan Dynamodb Seuteulim



DynamoDB 스트림은 Amazon DynamoDB의 기능으로, DynamoDB 테이블에 적용된 변경 사항 또는 데이터 변경 사항의 실시간 스트림을 가져올 수 있습니다. 이 기능을 사용하여 캐시 업데이트 및 알림 전송과 같은 DynamoDB 테이블의 데이터 변경에 반응하는 애플리케이션을 구축할 수 있습니다.

물론 DynamoDB 스트림을 사용하여 다운스트림 프로세스와 AWS Lambda 함수를 트리거할 수도 있습니다. Lambda는 정의상 이벤트에 대한 응답으로 코드를 실행하고 컴퓨팅 리소스를 자동으로 관리하는 서버리스 컴퓨팅 서비스입니다.

Lambda를 사용하여 Node.js, Python, Java 또는 C#에서 코드를 작성하여 스트림 레코드를 처리하고 적절한 조치를 취할 수 있습니다. DynamoDB 스트림을 Lambda와 통합할 때의 주요 이점은 Lambda를 통해 관리할 필요 없이 지원 서비스 또는 애플리케이션 코드를 실행할 수 있다는 것입니다.







Lambda와 함께 AWS DynamoDB 스트림을 사용하는 방법

DynamoDB 스트림에서 이벤트 및 발생을 소비하는 Lambda 함수를 생성하는 것이 가능하지만 프로세스는 특히 첫 번째 시도에서 상당한 작업이 될 수 있습니다. 다음 단계가 도움이 될 것입니다.



1단계: 시스템이 전제 조건을 충족하는지 확인

이 절차는 기본 Lambda 작업 및 프로세스를 알고 있는 경우에만 성공합니다. 따라서 Lambda에 대한 이해가 평균 이상인지 확인하는 첫 번째 작업이어야 합니다.



고려해야 할 두 번째 전제 조건은 시스템의 AWS 버전을 확인하는 것입니다. 다음 명령을 사용할 수 있습니다.





AWS 버전

제공된 명령의 결과는 다음과 같아야 합니다.

aws-cli/ 2 .x.x 파이썬/ .x.x 리눅스/ 4 .x.x-xxx-std 보토코어/ 2 .더블 엑스

제공된 샘플 응답에는 설치된 AWS CLI 버전( aws-cli/2.x.x ), Python 버전( 파이썬/3.x.x ) 및 운영 체제( 리눅스/4.x.x-xxx-std ). 응답의 마지막 부분은 AWS CLI가 실행되는 Botocore 라이브러리 버전을 정의합니다( 보토코어/2.x.x ).



따라서 다음과 같이 끝납니다.

2단계: 실행 역할 생성

다음 단계는 AWS CLI에서 실행 역할을 생성하는 것입니다. 실행 역할은 사용자 대신 작업을 수행하기 위해 AWS 서비스에서 수임하는 AWS Identity and Access Management(IAM) 역할입니다. 그 과정에서 필요한 AWS 리소스에 액세스할 수 있습니다.

다음 명령을 사용하여 역할을 생성할 수 있습니다.

aws iam 생성-역할 \

--role-name LambdaDynamoDBExecutionRole \

--assume-role-policy-document 파일://assume-role-policy.json \

--설명 ' AWSLambdaDynamoDBExecutionRole' \

--서비스 이름 lambda.amazonaws.com

이전 명령은 역할을 생성하는 AWS CLI 명령입니다. Amazon Management Console을 사용하여 역할을 생성할 수도 있습니다. IAM 콘솔에 있으면 다음을 엽니다. 역할 페이지를 클릭하고 역할 만들기 단추.

다음을 입력하십시오.

  • 신뢰할 수 있는 엔터티: Lambda
  • 역할 이름: lambda-dynamodb-role
  • 권한: AWSLambdaDynamoDBExecutionRole

Python용 AWS SDK를 먼저 설치하여 Python을 사용할 수도 있습니다.

핍 설치 boto3

3단계: 테이블에서 DynamoDB 스트림 활성화

테이블에서 DynamoDB 스트림을 활성화해야 합니다. 이 그림에서는 Python용 AWS SDK인 Boto3를 사용합니다. 다음 명령이 도움이 될 것입니다.

boto3 가져오기

# DynamoDB 서비스에 연결
dynamodb = boto3.client( '다이나모드비' )

# 'my-table' 테이블에서 DynamoDB 스트림 활성화
응답 = dynamodb.update_table(
테이블 이름= '마이테이블' ,
스트림 사양={
'StreamEnabled' : 진실,
'스트림뷰타입' : 'NEW_AND_OLD_IMAGES'
}
)

# 응답을 확인하여 스트림이 성공적으로 활성화되었는지 확인합니다.
만약 응답[ '스트림 사양' ][ 'StreamEnabled' ]:
인쇄( 'DynamoDB 스트림 활성화 성공' )
또 다른:
인쇄( 'DynamoDB 스트림 활성화 오류' )

이 코드는 변경 사항이 발생하는 즉시 항목의 새 이미지와 이전 이미지를 모두 스트리밍하는 'mytable' 테이블에서 DynamoDB 스트림을 활성화합니다. StreamViewType이 'NEW_IMAGE'로 변경되는 즉시 새 이미지만 스트리밍하도록 선택할 수 있습니다.

특히 이 코드를 실행하면 잠시 후 테이블의 스트림만 활성화될 수 있습니다. 대신 프로세스에 시간이 걸릴 수 있습니다. describe_table 메서드를 사용하여 스트림의 상태를 확인할 수 있습니다.

4단계: Lambda 함수 생성

다음 단계는 DynamoDB 스트림을 트리거하는 Lambda 함수를 생성하는 것입니다. 다음 단계가 도움이 될 것입니다.

  • AWS Lambda 콘솔을 열고 '함수 만들기' 탭을 클릭합니다. '함수 만들기' 페이지에서 '처음부터 작성'을 선택하고 함수 이름을 입력합니다. 또한 이 시점에서 런타임을 입력해야 합니다. 이 그림에서는 Python을 선택했습니다.
  • '실행 역할 선택 또는 생성'에서 '기본 Lambda 권한으로 새 역할 생성'을 선택하여 Lambda 함수에 필요한 권한이 있는 IAM 역할을 생성합니다.
  • '함수 생성' 버튼을 클릭하여 Lambda 함수를 생성합니다.
  • 함수의 '구성' 페이지에서 '디자이너' 섹션까지 아래로 스크롤하고 '트리거 추가' 탭을 클릭합니다.
  • 표시되는 '트리거 구성' 상자의 '트리거' 드롭다운 메뉴에서 'DynamoDB'를 선택합니다.
  • 함수를 트리거하는 데 사용할 DynamoDB 테이블을 선택합니다. 완료되면 테이블에 대한 모든 업데이트 또는 특정 업데이트(예: 특정 열에 대한 업데이트)에만 함수를 트리거할지 여부를 선택합니다.
  • '추가' 버튼을 클릭하여 트리거를 생성합니다.
  • '함수 코드' 편집기에서 함수에 대한 Python 코드를 작성합니다. 함수에 전달된 이벤트 개체를 사용하여 함수를 트리거하는 데이터에 액세스할 수 있습니다.
  • 기능을 저장하려면 '저장' 버튼을 클릭하십시오.

이것이 Lambda 함수를 생성할 때 발생하는 전부입니다! 이제 지정된 DynamoDB 테이블이 업데이트될 때마다 함수가 트리거됩니다.

다음은 DynamoDB 스트림이 트리거할 수 있는 간단한 Python 함수의 예입니다.

def lambda_handler(이벤트, 컨텍스트):

이벤트 기록용[ '레코드' ]:

인쇄(기록[ '다이나모드비' ][ '새 이미지' ])

이 함수는 이벤트 객체의 레코드를 반복하고 함수를 트리거하는 DynamoDB 테이블 항목의 새 이미지를 출력합니다.

5단계: Lambda 함수 테스트

DynamoDB 스트림이 트리거할 수 있는 Lambda 함수를 테스트하려면 다음을 사용할 수 있습니다. 보토3 DynamoDB API 및 부르다 의 방법 람다 기능을 트리거하는 클라이언트.

다음은 이를 수행하는 방법에 대한 예입니다.

boto3 가져오기

# DynamoDB 서비스에 연결
dynamodb = boto3.client( '다이나모드비' )

# Lambda 서비스에 연결
lambda_client = boto3.client( '람다' )

# 'my-table' 테이블에 항목 삽입
응답 = dynamodb.put_item(
테이블 이름= '마이테이블' ,
항목={
'ID' :{ 'N' : '123' },
'이름' :{ '에스' : '조엘 오스틴},
'
나이 ':{' N ':' 3. 4 '}
}
)

# 항목이 성공적으로 삽입되었는지 확인하기 위해 응답을 확인합니다.
if 응답['
응답 메타데이터 '][' HTTPStatusCode '] == 200:
print('항목이 성공적으로 삽입되었습니다.')
또 다른:
print('항목 삽입 오류')

# '에 가입된 Lambda 함수를 트리거합니다.
내 테이블 ' 테이블
응답 = lambda_client.invoke(
함수명='
내 기능 ',
호출 유형='
이벤트 ',
로그 유형='
꼬리 ',
페이로드='
{ '레코드' :[{ '다이나모드비' :{ '새 이미지' :{ 'ID' :{ 'N' : '123' }, '이름' :{ '에스' : '조엘 오스틴' }, '나이' :{ 'N' : '3.4' }}}}]} '
)

# 함수가 성공적으로 트리거되었는지 확인하기 위해 응답을 확인합니다.
if 응답['
상태 코드 '] == 202:
print('Lambda 함수가 성공적으로 트리거되었습니다.')
또 다른:
print('Lambda 함수 트리거 오류')

이 코드는 먼저 항목을 mytable 테이블 다음 트리거 내 기능 다음을 사용하여 함수에 샘플 이벤트 페이로드를 전송하여 Lambda 함수 부르다 방법. 이벤트 페이로드는 방금 삽입된 항목의 새 이미지를 포함하는 DynamoDB 스트림 이벤트를 시뮬레이션합니다.

그런 다음 Lambda 함수의 로그를 확인하여 이벤트 데이터를 성공적으로 트리거하고 처리했는지 확인할 수 있습니다.

결론

DynamoDB 스트림이 Lambda 함수를 트리거할 수 있는 동일한 스트림 레코드에 대해 여러 번 호출할 수 있다는 점에 유의해야 합니다. 그 주된 이유는 스트림 레코드가 최종적으로 일관성이 있고 동일한 레코드를 Lambda 함수로 여러 번 처리할 수 있기 때문입니다. 이 경우를 올바르게 처리하도록 Lambda 함수를 설계하는 것이 중요합니다.