lambda-dynamodb 연결은(는) 무엇을 하나요?
AWS Lambda 함수를 DynamoDB에 연결하여 IAM 역할, 스트림 이벤트 소스 매핑, 읽기/쓰기 권한을 설정합니다. Lambda-DynamoDB 통합 설정, DynamoDB 스트림 이벤트 처리, 서버리스 이벤트 기반 아키텍처 배포 시 사용합니다.
개요
이 스킬은 AWS Lambda 함수와 DynamoDB 테이블 간의 통합을 구성합니다. 주요 구성 요소는 다음과 같습니다:
- IAM 역할 및 정책: Lambda 함수가 DynamoDB 테이블에서 읽고 쓸 수 있는 권한을 가진 IAM 역할을 생성합니다.
- DynamoDB 스트림: DynamoDB 테이블에서 스트림을 활성화하여 변경 사항을 캡처합니다.
- 이벤트 소스 매핑: Lambda 함수를 DynamoDB 스트림에 구독하여 새 레코드가 나타날 때마다 함수가 트리거되도록 합니다.
사용 사례
- 서버리스 웹 애플리케이션: 사용자 데이터를 DynamoDB에 저장하고 Lambda를 통해 API 요청을 처리합니다.
- 실시간 데이터 처리: DynamoDB 스트림을 사용하여 데이터 변경 사항을 처리하고 다른 서비스(예: SNS, SQS)로 전파합니다.
- 이벤트 기반 워크플로우: 데이터 업데이트에 반응하여 이메일 전송, 알림 트리거, 분석 파이프라인 업데이트 등을 수행합니다.
전제 조건
- AWS 계정 및 적절한 IAM 권한(Lambda, DynamoDB, IAM에 대한 전체 액세스 권한).
- AWS CLI 또는 AWS SDK(예: boto3)가 설치 및 구성되어 있어야 합니다.
- 기존 DynamoDB 테이블 또는 새로 생성할 테이블.
- 기존 Lambda 함수 또는 새로 생성할 함수.
단계별 설정
1. DynamoDB 테이블 생성 (또는 기존 테이블 사용)
my-table이라는 DynamoDB 테이블을 생성하고 파티션 키 id(문자열)를 사용합니다.
aws dynamodb create-table \
--table-name my-table \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
참고: 기존 테이블을 사용하는 경우 describe-table을 사용하여 ARN을 가져옵니다.
aws dynamodb describe-table --table-name my-table --query 'Table.TableArn'
2. DynamoDB 스트림 활성화
테이블에서 스트림을 활성화합니다. 스트림 보기 유형은 NEW_AND_OLD_IMAGES를 사용합니다.
aws dynamodb update-table \
--table-name my-table \
--stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
스트림 ARN을 가져옵니다:
aws dynamodb describe-table --table-name my-table --query 'Table.LatestStreamArn'
참고: 스트림 ARN은 이벤트 소스 매핑을 생성하는 데 필요합니다.
3. Lambda 함수 생성 (또는 기존 함수 사용)
my-function이라는 Lambda 함수를 생성합니다(런타임: Python 3.9, 역할: 기본 Lambda 실행 역할).
aws lambda create-function \
--function-name my-function \
--runtime python3.9 \
--role arn:aws:iam::123456789012:role/lambda-execution-role \
--handler index.lambda_handler \
--zip-file fileb://function.zip
참고: 기존 함수를 사용하는 경우 ARN을 기록해 둡니다.
4. Lambda 실행 역할에 IAM 정책 연결
Lambda 함수가 DynamoDB 테이블에 액세스할 수 있도록 인라인 정책을 연결합니다.
aws iam put-role-policy \
--role-name lambda-execution-role \
--policy-name dynamodb-access \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:PutItem",
"dynamodb:UpdateItem",
"dynamodb:DeleteItem",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/my-table"
},
{
"Effect": "Allow",
"Action": [
"dynamodb:DescribeStream",
"dynamodb:GetRecords",
"dynamodb:GetShardIterator",
"dynamodb:ListStreams"
],
"Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/my-table/stream/*"
}
]
}'
참고: Resource ARN을 실제 테이블 ARN으로 바꾸세요. 위 정책은 테이블 데이터 및 스트림 액세스 권한을 모두 부여합니다.
5. 이벤트 소스 매핑 생성
DynamoDB 스트림을 Lambda 함수에 구독합니다.
aws lambda create-event-source-mapping \
--function-name my-function \
--event-source-arn arn:aws:dynamodb:us-east-1:123456789012:table/my-table/stream/2024-01-01T00:00:00.000 \
--enabled \
--starting-position LATEST
참고: event-source-arn을 실제 스트림 ARN으로 바꾸세요. starting-position은 LATEST 또는 TRIM_HORIZON일 수 있습니다.
6. Lambda 함수 코드 예제
Lambda 함수(Python)가 DynamoDB 스트림 이벤트를 처리하는 방법입니다:
import json
def lambda_handler(event, context):
for record in event['Records']:
# 레코드 변경 사항 출력
print(json.dumps(record, indent=2))
# 예: 새 이미지 처리
if 'dynamodb' in record and 'NewImage' in record['dynamodb']:
new_image = record['dynamodb']['NewImage']
print(f"새 이미지: {new_image}")
return {'statusCode': 200}
테스트
DynamoDB에 항목을 삽입하여 스트림 트리거
aws dynamodb put-item \
--table-name my-table \
--item '{"id": {"S": "123"}, "data": {"S": "hello"}}'
Lambda 함수 로그 확인
aws logs describe-log-groups --log-group-name-prefix /aws/lambda/my-function
이벤트 소스 매핑 나열
aws lambda list-event-source-mappings --function-name my-function
오류 처리
- AccessDeniedException: IAM 역할에 올바른 권한이 있는지 확인합니다.
- ResourceNotFoundException: DynamoDB 테이블 또는 Lambda 함수가 존재하는지 확인합니다.
- InvalidParameterValueException: 스트림 ARN이 올바른지, Lambda 함수가 스트림과 동일한 리전에 있는지 확인합니다.
고려 사항
- 비용: DynamoDB 스트림 읽기 요청 및 Lambda 호출 비용이 발생합니다.
- 제한: Lambda 함수는 최대 6개의 동시 스트림을 처리할 수 있습니다. 배치 크기 및 병렬화 요소를 조정하여 성능을 최적화합니다.
- 재시도: Lambda는 실패한 레코드를 최대 24시간 동안 재시도합니다. 데드 레터 큐(DLQ)를 구성하여 재시도 실패를 처리하는 것을 고려합니다.