사용자 지정 구현을 사용하여 계정 전반적으로 Amazon DynamoDB 테이블 복사 - AWS 권장 가이드

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

사용자 지정 구현을 사용하여 계정 전반적으로 Amazon DynamoDB 테이블 복사

작성자: Ramkumar Ramanujam(AWS)

환경: 프로덕션

소스: Amazon DynamoDB

대상: Amazon DynamoDB

R 유형: 해당 없음

워크로드: 기타 모든 워크로드

기술: 데이터베이스

AWS 서비스: Amazon DynamoDB

요약

Amazon Web Services(AWS)에서 Amazon DynamoDB로 작업할 때 일반적인 사용 사례는 개발, 테스트 또는 스테이징 환경의 DynamoDB 테이블을 프로덕션 환경에 있는 테이블 데이터와 복사하거나 동기화하는 것입니다. 표준 관행으로 각 환경은 다른 AWS 계정을 사용합니다.

DynamoDB는 이제 AWS 백업을 사용하여 교차 계정 백업을 지원합니다. AWS 백업 사용 시 관련 스토리지 비용에 대한 자세한 내용은 AWS 백업 요금 섹션을 참조하세요. AWS 백업을 사용하여 계정 간에 복사하는 경우 소스 및 대상 계정은 AWS Organizations 조직의 일부여야 합니다. AWS Glue와 같은 AWS 서비스를 사용하여 교차 계정 백업 및 복원을 위한 다른 솔루션이 있습니다. 그러나 이러한 솔루션을 사용하면 배포 및 유지 관리할 AWS 서비스가 더 많기 때문에 애플리케이션 설치 공간이 늘어납니다. 

Amazon DynamoDB Streams를 사용하여 소스 계정의 테이블 변경 내용을 캡처할 수도 있습니다. 그런 다음 AWS Lambda 함수를 시작하고 대상 계정의 대상 테이블에서 해당 내용을 변경할 수 있습니다. 하지만 이 솔루션은 소스 테이블과 대상 테이블을 항상 동기화된 상태로 유지해야 하는 사용 사례에 적용됩니다. 데이터가 자주 업데이트되는 개발, 테스트 및 스테이징 환경에는 적용하지 못할 수 있습니다.

이 패턴은 한 계정에서 다른 계정으로 Amazon DynamoDB 테이블을 복사하기 위해 사용자 지정 솔루션을 구현하는 절차를 제공합니다. 이 패턴은 C#, Java, Python과 같은 일반적인 프로그래밍 언어를 사용하여 구현할 수 있습니다. 에서 지원하는 언어를 사용하는 것이 좋습니다AWSSDK.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정 2개

  • 두 계정 모두의 DynamoDB 테이블

  • AWS Identity and Access Management(IAM) 역할 및 정책에 대한 지식

  • C#, Java 또는 Python과 같은 모든 일반적인 프로그래밍 언어를 사용하여 Amazon DynamoDB 테이블에 액세스하는 방법에 대한 지식

제한 사항

이 패턴은 크기가 약 2GB 이하인 DynamoDB 테이블에 적용됩니다. 연결 또는 세션 중단, 조절, 장애 및 재시도를 처리하는 추가 로직이 있으면 더 큰 테이블에 이를 사용할 수 있습니다.

소스 테이블에서 항목을 읽는 DynamoDB 스캔 작업은 한 번의 호출로 최대 1 MB의 데이터만 가져올 수 있습니다. 크기가 2 GB를 초과하는 대형 테이블의 경우 이 제한으로 인해 전체 테이블 복사를 수행하는 데 걸리는 총 시간이 늘어날 수 있습니다.

아키텍처

다음 다이어그램은 소스 계정과 대상 AWS 계정 간의 사용자 지정 구현을 보여줍니다. IAM 정책 및 보안 토큰은 사용자 지정 구현에 사용됩니다. 소스 계정의 Amazon DynamoDB에서 데이터를 읽고 대상 계정의 DynamoDB에 기록합니다.

사용자 지정 구현을 사용하여 복사할 소스 및 대상 계정 아키텍처입니다.

자동화 및 규모 조정

이 패턴은 크기가 약 2GB 이하인 DynamoDB 테이블에 적용됩니다. 

대형 테이블에 이 패턴을 적용하려면 다음 문제를 해결합니다.

  • 테이블 복사 작업 중에는 서로 다른 보안 토큰을 사용하여 두 개의 활성 세션을 유지합니다. 테이블 복사 작업이 토큰 만료 시간보다 더 오래 걸리는 경우 보안 토큰을 새로 고치는 로직을 마련해야 합니다. 

  • 충분한 읽기 용량 단위(RCUs)와 쓰기 용량 단위(WCUs)가 프로비저닝되지 않으면 소스 또는 대상 테이블의 읽기 또는 쓰기가 제한될 수 있습니다. 이러한 예외를 파악하고 처리해야 합니다. 

  • 기타 실패나 예외를 처리하고, 복사 작업이 실패한 부분부터 다시 시도하거나 계속할 수 있는 재시도 메커니즘을 마련합니다.

도구

도구

  • Amazon DynamoDB - Amazon DynamoDB는 완전 관리형 NoSQL 데이터베이스 서비스로, 원활한 확장성과 함께 빠르고 예측 가능한 성능을 제공합니다. 

  • 필요한 추가 도구는 구현을 위해 선택하는 프로그래밍 언어에 따라 달라집니다. 예를 들어 C#를 사용하는 경우 Microsoft Visual Studio와 다음 NuGet 패키지가 필요합니다.

    • AWSSDK

    • AWSSDK.DynamoDBv2

code

다음 Python 코드 조각은 Boto3 라이브러리를 사용하여 DynamoDB 테이블을 삭제하고 다시 생성합니다.

장기 보안 인증 정보이므로 AWS 서비스에 대한 프로그래밍 방식의 액세스를 위해 AWS_ACCESS_KEY_ID와 IAM AWS_SECRET_ACCESS_KEY를 사용하지 마세요. 임시 보안 자격 증명에 관한 자세한 내용은 모범 사례 섹션을 확인하십시오.

다음 코드 조각에 TEMPORARY_SESSION_TOKEN 사용되는 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, 는 AWS Security Token Service()AWS에서 가져온 임시 보안 인증 정보입니다STS.

import boto3 import sys import json #args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ... #Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION #[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}] #Input param: ATTRIBUTES_JSON_COLLECTION #[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}] region = args['TARGET_REGION'] target_ddb_name = args['TARGET_DYNAMODB_NAME'] global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION']) attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION']) # Drop and create target DynamoDB table dynamodb_client = boto3.Session( aws_access_key_id=args['AWS_ACCESS_KEY_ID'], aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'], aws_session_token=args['TEMPORARY_SESSION_TOKEN'], ).client('dynamodb') # Delete table print('Deleting table: ' + target_ddb_name + ' ...') try: dynamodb_client.delete_table(TableName=target_ddb_name) #Wait for table deletion to complete waiter = dynamodb_client.get_waiter('table_not_exists') waiter.wait(TableName=target_ddb_name) print('Table deleted.') except dynamodb_client.exceptions.ResourceNotFoundException: print('Table already deleted / does not exist.') pass print('Creating table: ' + target_ddb_name + ' ...') table = dynamodb_client.create_table( TableName=target_ddb_name, KeySchema=[ { 'AttributeName': 'PK', 'KeyType': 'HASH' # Partition key }, { 'AttributeName': 'SK', 'KeyType': 'RANGE' # Sort key } ], AttributeDefinitions=attribute_definitions, GlobalSecondaryIndexes=global_secondary_indexes, BillingMode='PAY_PER_REQUEST' ) waiter = dynamodb_client.get_waiter('table_exists') waiter.wait(TableName=target_ddb_name) print('Table created.')

모범 사례

임시 보안 인증

보안 모범 사례로 프로그래밍 방식으로 AWS 서비스에 액세스하는 동안 AWS_SECRET_ACCESS_KEY IAM 사용자의 AWS_ACCESS_KEY_ID 및 는 장기 보안 인증 정보이므로 사용하지 마세요. 항상 임시 자격 증명을 사용하여 프로그래밍 방식으로 AWS 서비스에 액세스하세요.

예를 들어 개발자는 개발 중에 애플리케이션에서 IAM 사용자의 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 를 하드코딩하지만 코드 리포지토리에 변경 사항을 푸시하기 전에 하드코딩된 값을 제거하지 못합니다. 이러한 노출된 자격 증명은 의도하지 않았거나 악의적인 사용자가 사용할 수 있으며, 이는 심각한 영향을 미칠 수 있습니다(특히 노출된 자격 증명에 관리자 권한이 있는 경우 더욱 그렇습니다). 이러한 노출된 보안 인증 정보는 IAM 콘솔 또는 AWS 명령줄 인터페이스(AWS )를 사용하여 즉시 비활성화하거나 삭제해야 합니다CLI.

AWS 서비스에 프로그래밍 방식으로 액세스할 수 있는 임시 자격 증명을 가져오려면 AWS 를 사용합니다STS. 임시 자격 증명은 지정된 시간(15분~36시간) 동안만 유효합니다. 임시 자격 증명의 최대 허용 기간은 역할 설정 및 역할 함께 묶기와 같은 요인에 따라 달라집니다. 에 대한 자세한 내용은 설명서 섹션을 AWS STS참조하세요.

에픽

작업설명필요한 기술

DynamoDB 테이블을 생성합니다.

소스 계정과 대상 AWS 계정 모두에서 인덱스가 있는 DynamoDB 테이블을 생성합니다.

용량 프로비저닝을 온디맨드 모드로 설정하면 DynamoDB가 워크로드에 따라 읽기/쓰기 용량을 동적으로 확장할 수 있습니다. 

또는 4000 RCUs 및 4000 에서 프로비저닝된 용량을 사용할 수 있습니다WCUs.

앱 개발자, DBA, 마이그레이션 엔지니어

소스 테이블을 채웁니다.

소스 계정의 DynamoDB 테이블을 테스트 데이터로 채웁니다. 최소 50MB 이상의 테스트 데이터를 보유하면 테이블 복사 중에 RCUs 소비되는 피크와 평균을 확인할 수 있습니다. 그런 다음 필요에 따라 용량 프로비저닝을 변경할 수 있습니다.

앱 개발자, DBA, 마이그레이션 엔지니어
작업설명필요한 기술

소스 및 대상 DynamoDB 테이블에 액세스할 IAM 역할을 생성합니다.

소스 계정에서 DynamoDB 테이블에 액세스(읽기)할 수 있는 권한이 있는 IAM 역할을 소스 계정에 생성합니다.

소스 계정을 이 역할의 신뢰할 수 있는 개체로 추가합니다.

대상 계정에서 DynamoDB 테이블에 액세스(생성, 읽기, 업데이트, 삭제)할 수 있는 권한이 있는 IAM 역할을 대상 계정에 생성합니다. 

대상 계정을 이 역할의 신뢰할 수 있는 개체로 추가합니다.

앱 개발자, AWS DevOps
작업설명필요한 기술

IAM 역할에 대한 임시 자격 증명을 가져옵니다.

소스 계정에서 생성된 IAM 역할에 대한 임시 자격 증명을 가져옵니다.

대상 계정에 생성된 IAM 역할에 대한 임시 자격 증명을 가져옵니다.

IAM 역할에 대한 임시 자격 증명을 가져오는 한 가지 방법은 AWS AWSSTS에서 를 사용하는 것입니다CLI.

aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name>

적절한 AWS 프로필(소스 또는 대상 계정에 해당)을 사용합니다.

임시 보안 자격 증명에 관한 자세한 내용은 다음을 참조하십시오.

앱 개발자, 마이그레이션 엔지니어

소스 및 대상 DynamoDB 액세스를 위한 DynamoDB 클라이언트를 초기화합니다.

소스 및 대상 DynamoDB 테이블에 SDK대해 AWS 에서 제공하는 DynamoDB 클라이언트를 초기화합니다.

  • 소스 DynamoDB 클라이언트의 경우 소스 계정에서 가져온 임시 자격 증명을 사용합니다.

  • 대상 DynamoDB 클라이언트의 경우 대상 계정에서 가져온 임시 자격 증명을 사용합니다.

IAM 임시 자격 증명을 사용하여 요청하는 방법에 대한 자세한 내용은 AWS 설명서를 참조하세요.

앱 개발자

대상 테이블을 삭제하고 다시 생성합니다.

대상 계정 DynamoDB 클라이언트를 사용하여 대상 계정에서 대상 DynamoDB 테이블(인덱스 포함)을 삭제하고 다시 생성합니다.

DynamoDB 테이블에서 모든 레코드를 삭제하는 것은 프로비저닝된 를 사용하기 때문에 비용이 많이 드는 작업입니다WCUs. 테이블을 삭제하고 다시 생성하면 이러한 추가 비용을 피할 수 있습니다.

테이블을 생성한 후 테이블에 인덱스를 추가할 수 있지만, 이 경우 2~5분 정도 더 걸립니다. 인덱스 컬렉션을 createTable 호출에 전달하여 테이블을 생성하는 동안 인덱스를 생성하는 것이 더 효율적입니다.

앱 개발자

테이블 복사를 수행합니다.

모든 데이터가 복사될 때까지 다음 절차를 반복합니다.

  • 소스 DynamoDB 클라이언트를 사용하여 소스 계정의 테이블을 스캔합니다. 각 DynamoDB 스캔은 테이블에서 1 MB의 데이터만 검색하므로 모든 항목 또는 레코드를 읽을 때까지 이 작업을 반복해야 합니다.

  • 스캔한 각 항목 세트에 AWS SDK 대해 DynamoDB 클라이언트를 사용하여 대상 계정의 테이블에 항목을 작성합니다 DynamoDB. BatchWriteItem 따라서 DynamoDB에 대한 PutItem 요청 수가 줄어듭니다. 

  • BatchWriteItem(은)는 쓰기 또는 올리기가 25개로 제한되거나 최대 16MB로 제한됩니다. BatchWriteItem 호출 전에 스캔한 항목을 25개까지 누적하는 로직을 추가해야 합니다. BatchWriteItem(은)는 성공적으로 복사하지 못한 항목의 목록을 반환합니다. 이 목록을 사용하여, 성공하지 못한 항목만으로 다른 BatchWriteItem 호출을 수행하기 위한 재시도 로직을 추가합니다.

자세한 내용은 첨부 파일 섹션에서 C#의 참조 구현(테이블 삭제, 생성, 채우기에 사용)을 참조하십시오. 예제 테이블 구성 JavaScript 객체 표기법(JSON) 파일도 첨부됩니다.

앱 개발자

관련 리소스

추가 정보

이 패턴은 200,000개의 항목(평균 항목 크기 5 KB, 테이블 크기 250 MB) 이 있는 DynamoDB 테이블을 복사하기 위해 C#을 사용하여 구현되었습니다. 대상 DynamoDB 테이블은 프로비저닝된 용량 4000 RCUs 및 4000으로 설정되었습니다WCUs.

테이블 삭제 및 재생성을 포함한 전체 테이블 복사 작업(소스 계정에서 대상 계정으로 복사)에는 5분이 걸렸습니다. 총 소비 용량 단위: 30,000 RCUs 및 약 400,000 WCUs.

DynamoDB 용량 모드에 대한 자세한 내용은 AWS 설명서의 읽기/쓰기 용량 모드를 참조하세요.

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.