DynamoDB에서 Lambda를 이용하여 Join을 사용하는 방법

3분 분량
콘텐츠 수준: 중급
0

해당기사에서는 DynamoDB에서 지원하지 않는 Join을 Lambda를 통해서 조인하는 방법을 알려드립니다.

사용사례

일반적으로 DynamoDB의 특성상 NoSQL이기에 Join연산을 지원하지 않습니다. 그러나 Join연산이 부득이하게 필요한 경우가 있습니다. 그런 경우에 한해서 Join을 사용할 수 있는 솔루션을 설명해드립니다.

해결방안

우선 예시로 임의의 두개의 테이블을 생성합니다. 생성한 두개의 테이블의 파티션키는 동일한 파티션키로 지정합니다. 해당 파티션키를 이용하여 두 테이블간의 join을 할 수 있게합니다. 이후 Lambda에서는 두개의 테이블을 join한 결과값을 RDS 또는 DynamoDB에 다시 저장할수있습니다.

1단계: Lambda에 사용할 IAM Role생성

  1. IAM 페이지에서 [IAM 역할],[역할 만들기]를 클릭합니다.
  2. 일반사용사례 [lambda]를 클릭한뒤 [AmazonDynamoDBReadOnlyAccess]를 추가합니다.
  3. DynamoDB_Join_Role 이라고 IAM 역할을 생성합니다.

Enter image description here

2단계 : 테이블 생성

  1. DynamoDB 페이지에서 [테이블], [테이블 생성]을 클릭하여 Users테이블을 생성합니다.
  2. 파티션키는 User_id로 설정하고 테이블을 생성합니다.
  3. 두번째도 위와 마찬가지로 [테이블], [테이블 생성]을 클릭하여 Orders 테이블을 생성합니다.
  4. Orders 테이블의 경우 파티션키는 user_id로 설정하고 정렬키로 order_id로 설정합니다.

Enter image description here

(참고: 아래의 Python 코드를 이용해서 테이블을 생성할 수 있습니다.)

import boto3

dynamodb = boto3.client('dynamodb')

dynamodb.create_table(
    TableName='Users',
    KeySchema=[
        {'AttributeName': 'user_id', 'KeyType': 'HASH'}
    ],
    AttributeDefinitions=[
        {'AttributeName': 'user_id', 'AttributeType': 'S'}
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    }
)

dynamodb.create_table(
    TableName='Orders',
    KeySchema=[
        {'AttributeName': 'user_id', 'KeyType': 'HASH'},
        {'AttributeName': 'order_id', 'KeyType': 'RANGE'}
    ],
    AttributeDefinitions=[
        {'AttributeName': 'user_id', 'AttributeType': 'S'},
        {'AttributeName': 'order_id', 'AttributeType': 'S'}
    ],
    ProvisionedThroughput={
        'ReadCapacityUnits': 5,
        'WriteCapacityUnits': 5
    }
)

3단계: 테이블에 예제 데이터 넣기

  1. [테이블], [Users] 테이블을 클릭합니다.
  2. [작업], [항목 생성]에서 User_id에 1을 넣고 생성한뒤 그뒤에 2를 넣고 생성합니다.
  3. 뒤로돌아가서 [Orders]테이블을 선택합니다.
  4. [작업], [항목 생성]에서 아래의 예제 데이터를 넣습니다.
  • User_id에 1을 넣고 Order_id에 a를 넣습니다.
  • User_id에 2를 넣고 Order_id에는 b를 넣습니다.
  • User_id에 2를 넣고 Order_id는 c를 넣어줍니다.

Enter image description here

4단계: Lambda함수 생성

  1. Lambda 함수 생성하기
  2. Lambda 페이지에서 [함수],[함수 생성]을 클릭합니다.
  3. DynamoDB_Join_Lambda 로 함수 이름에 입력합니다.
  4. 최신버전의 파이썬 버전(3.11) 을 선택합니다.
  5. 역할이름에는 이전에 생성해두었던 역할(DynamoDB_Join_Role )을 클릭합니다.
  6. 함수를 생성한뒤 코드에서 아래의 코드를 입력합니다.
import boto3

def lambda_handler(event, context):
    dynamodb = boto3.client('dynamodb')
    response_users = dynamodb.scan(
        TableName='Users',
        ProjectionExpression='user_id'
    )
    user_ids = [item['user_id']['S'] for item in response_users['Items']]
    

    combined_data = []
    for user_id in user_ids:
        response_orders = dynamodb.query(
            TableName='Orders',
            KeyConditionExpression='user_id = :uid',
            ExpressionAttributeValues={':uid': {'S': user_id}},
            ProjectionExpression='order_id'
        )
        order_ids = [item['order_id']['S'] for item in response_orders['Items']]
        combined_data.append({'user_id': user_id, 'order_ids': order_ids})

    print(combined_data)

5단계: Lambda 함수 테스트

  1. 위의 단계를 거쳐서 Lambda함수가 생성되었다면 [Deployment]를 클릭하여 배포합니다.
  2. 이후 [Test]를 클릭하여 Execution results 탭의 Function Logs에서 확인이 가능합니다.

Enter image description here

참고 자료

[+] DynamoDB / Client / scan

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/scan.html

profile pictureAWS
지원 엔지니어
게시됨 8달 전289회 조회