자습서: DynamoDB Streams 및 Lambda 를 사용하여 새 항목 처리 - Amazon DynamoDB

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

자습서: DynamoDB Streams 및 Lambda 를 사용하여 새 항목 처리

이 자습서에서는 DynamoDB 테이블의 스트림을 처리하기 위해 AWS Lambda 트리거를 생성합니다.

이 자습서의 시나리오는 간단한 소셜 네트워크인 Woofer입니다. Woofer 사용자는 다른 Woofer 사용자에게 전달되는 바크(간단한 문자 메시지)를 이용해 의사소통합니다. 다음 다이어그램은 이 애플리케이션에 대한 구성 요소 및 워크플로우를 보여줍니다.

  1. 사용자는 DynamoDB 테이블 (BarkTable). 테이블에서 각 항목은 바크를 나타냅니다.

  2. 작성된 새 스트림 레코드는 새 항목이 BarkTable에 추가되었다는 것을 반영합니다.

  3. 새 스트림 레코드에서 AWS Lambda 함수 (publishNewBark).

  4. 스트림 레코드에 새 항목이 추가되었음을 나타내는 경우BarkTable를 선택하면 Lambda 함수가 스트림 코드에서 데이터를 읽고 Amazon Simple Notification Service (Amazon SNS) 의 주제에 메시지를 게시합니다.

  5. Amazon SNS 주제의 구독자는 메시지를 수신합니다. (본 자습서에서 이메일 주소는 구독자에 해당됩니다.)

시작하기 전

이 자습서에서는 AWS 명령줄 인터페이스 AWS CLI를 사용합니다. 아직 완료하지 않았다면 의 지침에 따라AWS 명령줄 인터페이스 사용 설명서를 클릭하여 AWS CLI를 설치하고 구성합니다.

단계 1: 활성화된 스트림으로 DynamoDB 테이블 만들기

이 단계에서는 DynamoDB 테이블 (BarkTable) 를 사용하여 Woofer 사용자의 모든 바크를 저장합니다. 기본 키는 Username(파티션 키)와 Timestamp(정렬 키)로 구성됩니다. 이 두 가지 속성 모두 문자열 유형입니다.

BarkTable에서는 스트림이 활성화되어 있습니다. 이 자습서의 뒷부분에서는 AWS Lambda 함수를 스트림에 연결하여 트리거를 생성합니다.

  1. 테이블을 생성하려면 다음 명령을 입력합니다.

    aws dynamodb create-table \ --table-name BarkTable \ --attribute-definitions AttributeName=Username,AttributeType=S AttributeName=Timestamp,AttributeType=S \ --key-schema AttributeName=Username,KeyType=HASH AttributeName=Timestamp,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
  2. 출력에서 LatestStreamArn를 찾습니다.

    ... "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp ...

    regionaccountID를 기록해 둡니다. 이 두 항목은 자습서의 다른 단계에서 필요합니다.

단계 2: Lambda 역할 실행 생성

이 단계에서는 AWS IAM (Identity and Access Management) 역할 (WooferLambdaRole) 에 대한 권한을 할당합니다. 이 역할은 에서 만든 Lambda 함수에 사용됩니다.단계 4: Lambda 함수 생성 및 테스트를 선택합니다.

또한 해당 역할에 대한 정책도 생성합니다. 이 정책에는 런타임 시 Lambda 함수에 필요한 모든 권한이 포함되어 있습니다.

  1. 다음 콘텐츠를 통해 trust-relationship.json이라는 파일을 생성합니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 다음 명령을 입력하여 WooferLambdaRole을 생성합니다.

    aws iam create-role --role-name WooferLambdaRole \ --path "/service-role/" \ --assume-role-policy-document file://trust-relationship.json
  3. 다음 콘텐츠를 통해 role-policy.json이라는 파일을 생성합니다. (regionaccountID를 AWS 리전 및 계정 ID로 바꿉니다.)

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:region:accountID:function:publishNewBark*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:accountID:*" }, { "Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:ListStreams" ], "Resource": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/*" }, { "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": [ "*" ] } ] }

    정책은 WooferLambdaRole이 다음을 수행할 수 있도록 해주는 네 가지 문을 가지고 있습니다.

    • Lambda 함수 (publishNewBark). 이 자습서에서는 나중에 함수를 생성합니다.

    • Amazon CloudWatch Logs 액세스 Lambda 함수는 실행 시간에 CloudWatch Logs s에 진단을 작성합니다.

    • 다음에 대한 DynamoDB 스트림에서 데이터를 읽습니다.BarkTable를 선택합니다.

    • Amazon SNS S에 메시지를 게시합니다.

  4. 다음 명령을 입력하여 정책을 WooferLambdaRole에 연결합니다.

    aws iam put-role-policy --role-name WooferLambdaRole \ --policy-name WooferLambdaRolePolicy \ --policy-document file://role-policy.json

단계 3: Amazon SNS 주제 생성

이 단계에서는 Amazon SNS 주제 (wooferTopic) 에 대한 이메일 주소를 구독합니다. Lambda 함수에서는 이 주제를 사용하여 Woofer 사용자의 새 바크 메시지를 게시합니다.

  1. 다음 명령을 입력하여 새 Amazon SNS 주제를 생성합니다.

    aws sns create-topic --name wooferTopic
  2. 다음 명령을 입력해 wooferTopic에 대한 이메일 주소를 구독합니다. (regionaccountID를 AWS 리전 및 계정 ID로 바꾸고, example@example.com를 유효한 이메일 주소로 바꿉니다)

    aws sns subscribe \ --topic-arn arn:aws:sns:region:accountID:wooferTopic \ --protocol email \ --notification-endpoint example@example.com
  3. Amazon SNS 에서는 사용자 이메일 주소로 확인 메시지를 보냅니다. 구독 프로세스를 완료하는 메시지와 연결된 구독 확인 링크를 클릭합니다.

단계 4: Lambda 함수 생성 및 테스트

이 단계에서는 AWS Lambda 함수 (publishNewBark) 에서 스트림 레코드를 처리BarkTable를 선택합니다.

publishNewBark 함수는 BarkTable의 새 항목에 해당하는 스트림 이벤트만을 처리합니다. 함수는 이벤트에서 데이터를 읽은 다음 Amazon SNS 호출하여 게시합니다.

  1. 다음 콘텐츠를 통해 publishNewBark.js이라는 파일을 생성합니다. regionaccountID를 AWS 리전 및 계정 ID로 바꿉니다.

    'use strict'; var AWS = require("aws-sdk"); var sns = new AWS.SNS(); exports.handler = (event, context, callback) => { event.Records.forEach((record) => { console.log('Stream record: ', JSON.stringify(record, null, 2)); if (record.eventName == 'INSERT') { var who = JSON.stringify(record.dynamodb.NewImage.Username.S); var when = JSON.stringify(record.dynamodb.NewImage.Timestamp.S); var what = JSON.stringify(record.dynamodb.NewImage.Message.S); var params = { Subject: 'A new bark from ' + who, Message: 'Woofer user ' + who + ' barked the following at ' + when + ':\n\n ' + what, TopicArn: 'arn:aws:sns:region:accountID:wooferTopic' }; sns.publish(params, function(err, data) { if (err) { console.error("Unable to send message. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("Results from sending message: ", JSON.stringify(data, null, 2)); } }); } }); callback(null, `Successfully processed ${event.Records.length} records.`); };
  2. publishNewBark.js가 포함된 zip 파일을 만듭니다. zip 명령줄 유틸리티를 사용하는 경우 다음과 같은 명령을 입력하여 이를 수행할 수 있습니다.

    zip publishNewBark.zip publishNewBark.js
  3. Lambda 함수를 만들 경우, 에 대한 Amazon 리소스 이름 (ARN) 을WooferLambdaRole에서 만든단계 2: Lambda 역할 실행 생성를 선택합니다. 이 ARN을 가져오려면 다음 명령을 입력합니다.

    aws iam get-role --role-name WooferLambdaRole

    출력에서 WooferLambdaRole의 ARN을 찾습니다.

    ... "Arn": "arn:aws:iam::region:role/service-role/WooferLambdaRole" ...

    Lambda 함수를 생성하려면 다음 명령을 입력합니다. Replace roleARN 에 대한 ARN 이 있는 경우WooferLambdaRole를 선택합니다.

    aws lambda create-function \ --region us-east-1 \ --function-name publishNewBark \ --zip-file fileb://publishNewBark.zip \ --role roleARN \ --handler publishNewBark.handler \ --timeout 5 \ --runtime nodejs10.x
  4. 이제, publishNewBark을 테스트하여 제대로 작동하는지 확인합니다. 이렇게 하려면 DynamoDB Streams s의 실제 레코드와 유사한 내용을 입력합니다.

    다음 콘텐츠를 통해 payload.json이라는 파일을 생성합니다.

    { "Records": [ { "eventID": "7de3041dd709b024af6f29e4fa13d34c", "eventName": "INSERT", "eventVersion": "1.1", "eventSource": "aws:dynamodb", "awsRegion": "us-west-2", "dynamodb": { "ApproximateCreationDateTime": 1479499740, "Keys": { "Timestamp": { "S": "2016-11-18:12:09:36" }, "Username": { "S": "John Doe" } }, "NewImage": { "Timestamp": { "S": "2016-11-18:12:09:36" }, "Message": { "S": "This is a bark from the Woofer social network" }, "Username": { "S": "John Doe" } }, "SequenceNumber": "13021600000000001596893679", "SizeBytes": 112, "StreamViewType": "NEW_IMAGE" }, "eventSourceARN": "arn:aws:dynamodb:us-east-1:123456789012:table/BarkTable/stream/2016-11-16T20:42:48.104" } ] }

    publishNewBark 함수를 테스트하려면 다음 명령을 입력합니다.

    aws lambda invoke --function-name publishNewBark --payload file://payload.json output.txt

    테스트가 성공적이면 다음 출력이 생성됩니다.

    { "StatusCode": 200 }

    또한 output.txt 파일에는 다음 텍스트가 포함됩니다.

    "Successfully processed 1 records."

    몇 분 안에 새 이메일 메시지가 전송됩니다.

    참고

    AWS Lambda 는 Amazon CloudWatch Logs s에 진단 정보를 작성합니다. Lambda 함수에서 오류가 발생하면 문제 해결을 위해 이 진단 정보를 사용합니다.

    1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

    2. 탐색 창에서 로그를 선택합니다.

    3. 다음과 같은 로그 그룹을 선택합니다./aws/lambda/publishNewBark

    4. 최신 로그 스트림을 선택하여 함수의 출력(오류 사항 포함)을 봅니다.

단계 5: 트리거 생성 및 테스트

단계 4: Lambda 함수 생성 및 테스트에서 Lambda 함수를 테스트하여 제대로 실행되는지 확인합니다. 이 단계에서는 해당트리거Lambda 함수 (publishNewBark) 를 이벤트 소스 (BarkTable스트림).

  1. 트리거를 생성할 때 BarkTable 스트림의 ARN을 지정해야 합니다. 이 ARN을 가져오려면 다음 명령을 입력합니다.

    aws dynamodb describe-table --table-name BarkTable

    출력에서 LatestStreamArn를 찾습니다.

    ... "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp ...
  2. 다음 명령을 입력하여 트리거를 생성합니다. streamARN를 실제 스트림 ARN으로 바꿉니다.

    aws lambda create-event-source-mapping \ --region us-east-1 \ --function-name publishNewBark \ --event-source streamARN \ --batch-size 1 \ --starting-position TRIM_HORIZON
  3. 트리거를 테스트합니다. 다음 명령을 입력하여 BarkTable에 항목을 추가합니다.

    aws dynamodb put-item \ --table-name BarkTable \ --item Username={S="Jane Doe"},Timestamp={S="2016-11-18:14:32:17"},Message={S="Testing...1...2...3"}

    몇 분 이내에 새 이메일 메시지를 수신합니다.

  4. DynamoDB 콘솔을 열고BarkTable를 선택합니다. UsernameTimestamp에 대한 속성값을 지정해야 합니다. (필수 사항은 아니지만 Message에 대한 값을 지정할 수도 있습니다.) 추가한 BarkTable의 각 항목에 대해 새 이메일 메시지를 수신하게 됩니다.

    Lambda 함수는 에 추가된 새 항목만을 처리합니다.BarkTable를 선택합니다. 테이블에 업데이트되거나 삭제한 항목에 대해 이 함수는 별도의 작업을 하지 않습니다.

참고

AWS Lambda 는 Amazon CloudWatch Logs s에 진단 정보를 작성합니다. Lambda 함수에서 오류가 발생하면 문제 해결을 위해 이 진단을 사용할 수 있습니다.

  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 탐색 창에서 로그를 선택합니다.

  3. 다음과 같은 로그 그룹을 선택합니다./aws/lambda/publishNewBark

  4. 최신 로그 스트림을 선택하여 함수의 출력(오류 사항 포함)을 봅니다.