AWS계정 간 Amazon RDS 인스턴스 복제를 자동화합니다. - AWS 권장 가이드

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

AWS계정 간 Amazon RDS 인스턴스 복제를 자동화합니다.

작성자: 파라그 나그웨카르 () 와 아룬 찬다필라이 () AWS AWS

환경: 프로덕션

기술 DevOps: 데이터베이스, 서버리스, 인프라

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

AWS서비스: AWS 람다, RDS 아마존, 파이썬용 (AWSSDKBoto3), Step FunctionsAWS, 아마존 SNS

요약

이 패턴은 Step AWS Functions와 Lambda를 사용하여 AWS 여러 계정에서 Amazon 관계형 데이터베이스 서비스 (RDSAmazon) DB 인스턴스를 복제, 추적 및 AWS 롤백하는 프로세스를 자동화하는 방법을 보여줍니다. 이 자동화를 사용하면 조직의 규모와 상관없이 성능에 영향을 미치거나 운영 오버헤드 없이 RDS DB 인스턴스의 대규모 복제를 수행할 수 있습니다. 또한 이 패턴을 사용하여 여러 계정 및 지역에 걸쳐 데이터를 복제하고 중복해야 하는 필수 데이터 거버넌스 전략 또는 규정 준수 요구 사항을 조직이 준수하도록 도울 수 있습니다. AWS AWS Amazon RDS 데이터의 대규모 계정 간 복제는 비용과 시간이 많이 소요될 수 있는 비효율적이고 오류가 발생하기 쉬운 수동 프로세스입니다. 그러나 이 패턴의 자동화는 계정 간 복제를 안전하고 효과적이며 효율적으로 수행하는 데 도움이 될 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

  • 두 개의 계정 AWS

  • 소스 AWS 계정에서 실행 중인 RDS DB 인스턴스

  • 대상 AWS 계정의 RDS DB 인스턴스용 서브넷 그룹

  • 원본 AWS 계정에서 생성되어 대상 계정과 공유된 AWS Key Management Service (AWSKMS) 키 (정책 세부 정보에 대한 자세한 내용은 이 패턴의 추가 정보 섹션 참조)

  • 대상 AWS 계정의 데이터베이스를 암호화하기 위한 대상 계정의 AWS KMS 키

제품 버전

  • 파이썬 3.9 (람다 사용AWS)

  • 포스트그레 SQL 11.3, 13.x, 14.x

아키텍처

기술 스택

  • 아마존 관계형 데이터베이스 서비스 (아마존RDS)

  • 아마존 심플 알림 서비스 (아마존SNS)

  • AWS키 관리 서비스 (AWSKMS)

  • AWS람다

  • AWS Secrets Manager

  • AWS Step Functions

대상 아키텍처 

다음 다이어그램은 Step Functions를 사용하여 원본 계정 (계정 A) 에서 대상 계정 (계정 B) 으로 RDS DB 인스턴스의 예약 온디맨드 복제를 오케스트레이션하는 아키텍처를 보여줍니다.

Step Functions를 사용하여 원본 및 대상 계정 간에 Amazon RDS DB 인스턴스를 복제합니다.

소스 계정(다이어그램의 계정 A)에서 Step Functions 상태 시스템은 다음을 수행합니다.

  1. 계정 A의 RDS DB 인스턴스에서 스냅샷을 생성합니다.

  2. 계정 A의 AWS KMS 키를 사용하여 스냅샷을 복사하고 암호화합니다. 전송 시 암호화를 보장하기 위해 DB 인스턴스의 암호화 여부에 관계없이 스냅샷은 암호화됩니다.

  3. 계정 B에게 스냅샷에 대한 액세스 권한을 부여하여 계정 B와 DB 스냅샷을 공유합니다.

  4. SNS주제에 알림을 푸시하면 주제가 계정 B의 Lambda 함수를 호출합니다. SNS

대상 계정(다이어그램의 계정 B)에서 Lambda 함수는 Step Functions 상태 시스템을 실행하여 다음을 오케스트레이션합니다.

  1. 계정 A의 키를 사용하여 데이터를 먼저 해독한 다음 계정 B의 AWS KMS 키를 사용하여 데이터를 암호화하는 동안 계정 A에서 계정 B로 공유 스냅샷을 복사합니다. AWS KMS

  2. Secrets Manager에서 보안 암호를 읽어 현재 DB 인스턴스의 이름을 캡처합니다.

  3. RDSAmazon의 새 이름과 기본 AWS KMS 키를 사용하여 스냅샷에서 DB 인스턴스를 복원합니다.

  4. 새 데이터베이스의 엔드포인트를 읽고 Secrets Manager에서 보안 암호를 새 데이터베이스 엔드포인트로 업데이트한 다음, 나중에 삭제할 수 있도록 이전 DB 인스턴스에 태그를 지정합니다.

  5. 데이터베이스의 최신 N 인스턴스를 유지하고 나머지 인스턴스는 모두 삭제합니다.

도구

AWS도구

  • Amazon 관계형 데이터베이스 서비스 (RDSAmazon) 는 클라우드에서 AWS 관계형 데이터베이스를 설정, 운영 및 확장할 수 있도록 지원합니다.

  • Amazon Simple Notification Service (AmazonSNS) 를 사용하면 웹 서버 및 이메일 주소를 포함하여 게시자와 클라이언트 간의 메시지 교환을 조정하고 관리할 수 있습니다.

  • AWS CloudFormationAWS리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 전체 AWS 계정 및 지역의 수명 주기 전반에 걸쳐 리소스를 관리할 수 있도록 지원합니다.

  • AWS키 관리 서비스 (AWSKMS) 를 사용하면 데이터를 보호하는 데 도움이 되는 암호화 키를 생성하고 제어할 수 있습니다.

  • AWSLambda는 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있는 컴퓨팅 서비스입니다. 필요할 때만 코드를 실행하며 자동으로 확장이 가능하므로 사용한 컴퓨팅 시간만큼만 비용을 지불합니다.

  • AWSSDKfor Python (Boto3) 은 Python 응용 프로그램, 라이브러리 또는 스크립트를 서비스와 AWS 통합하는 데 도움이 되는 소프트웨어 개발 키트입니다.

  • AWSSecrets Manager를 사용하면 암호 등 코드에 하드코딩된 자격 증명을 Secrets Manager를 API 호출하여 프로그래밍 방식으로 암호를 검색하는 것으로 대체할 수 있습니다.

  • AWSStep Functions는 Lambda 함수와 기타 AWS 서비스를 결합하여 비즈니스에 중요한 애플리케이션을 구축하는 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.

코드

이 패턴의 코드는 계정 간 복제 리포지토리에서 사용할 수 있습니다. GitHub RDS

에픽

작업설명필요한 기술

소스 계정에 CloudFormation 스택을 배포합니다.

  1. 소스 계정 (계정 A) 의 AWS 관리 콘솔에 로그인하고 CloudFormation 콘솔을 엽니다.

  2. 탐색 창에서 스택을 선택합니다.

  3. 스택 생성을 선택한 다음 기존 리소스 사용(리소스 가져오기))를 선택합니다.

  4. 리소스 식별 페이지에서 다음을 선택합니다.

  5. 템플릿 지정 페이지에서 템플릿 업로드를 선택합니다.

  6. 파일 선택을 선택하고 GitHub 계정 간 RDS 복제 리포지토리에서 Cloudformation-SourceAccountRDS.yaml 파일을 선택한 후 다음을 선택합니다.

  7. 스택 이름에 스택에 대한 이름을 입력합니다.

  8. Parameters(파라미터) 섹션에서 스택 템플릿에서 정의된 파라미터를 다음과 같이 지정합니다.

    • DestinationAccountNumber대상 RDS DB 인스턴스의 계정 번호를 입력합니다.

    • KeyName에 AWS KMS 키를 입력합니다.

    • ScheduleExpression경우 cron 표현식을 입력합니다 (기본값은 매일 오전 12:00).

    • S의 ourceDBIdentifier 경우 원본 데이터베이스의 이름을 입력합니다.

    • S ourceDBSnapshot 이름에 스냅샷 이름을 입력하거나 기본값을 그대로 사용합니다.

  9. Next(다음)를 선택합니다.

  10. 스택 옵션 구성 페이지에서 기본 옵션을 유지하고 다음(Next)을 선택합니다.

  11. 스택 구성을 검토하고 제출을 선택합니다.

  12. 스택의 리소스 탭을 선택한 다음 SNS 주제의 Amazon 리소스 이름 (ARN) 을 기록해 둡니다.

클라우드 관리자, 클라우드 아키텍트

대상 계정에 CloudFormation 스택을 배포하십시오.

  1. 대상 계정 (계정 B) 의 AWS 관리 콘솔에 로그인하고 CloudFormation 콘솔을 엽니다.

  2. 탐색 창에서 스택을 선택합니다.

  3. 스택 생성을 선택한 다음 기존 리소스 사용(리소스 가져오기))를 선택합니다.

  4. 리소스 식별 페이지에서 다음을 선택합니다.

  5. 템플릿 지정 페이지에서 템플릿 업로드를 선택합니다.

  6. 파일을 선택하고 GitHub 계정 간 RDS 복제 리포지토리에서 Cloudformation-DestinationAccountRDS.yaml 파일을 선택한 후 다음을 선택합니다.

  7. 스택 이름에 스택에 대한 이름을 입력합니다.

  8. Parameters(파라미터) 섹션에서 스택 템플릿에서 정의된 파라미터를 다음과 같이 지정합니다.

    • DatabaseName에 데이터베이스 이름을 입력합니다.

    • Engine의 경우 소스 데이터베이스와 일치하는 데이터베이스 엔진 유형을 입력합니다.

    • 의 경우 DBInstanceClass, 선호하는 데이터베이스 인스턴스 유형을 입력하거나 기본값을 그대로 사용합니다.

    • 서브넷 그룹의 경우 기존 VPC 서브넷 그룹을 입력합니다. 서브넷 그룹을 생성하는 방법에 대한 지침은 Amazon 사용 RDS 설명서의 2단계: DB 서브넷 그룹 생성을 참조하십시오.

    • 의 경우 SecretName, 경로와 암호 이름을 입력하거나 기본값을 그대로 사용하십시오.

    • SGID대상 클러스터의 보안 그룹 ID를 입력합니다.

    • KMSKey에 대상 계정의 KMS 키를 입력합니다. ARN

    • 에 롤백을 위해 NoOfOlderInstances보관하려는 RDS DB 인스턴스의 이전 복사본 수를 입력합니다.

  9. Next(다음)를 선택합니다.

  10. 스택 옵션 구성 페이지에서 기본 옵션을 유지하고 다음(Next)을 선택합니다.

  11. 스택 구성을 검토하고 제출을 선택합니다.

  12. 스택의 리소스 탭을 선택한 다음 물리적 ID와 물리적 ID를 기록해 ARN 둡니다. InvokeStepFunction

클라우드 아키텍트, DevOps 엔지니어, 클라우드 관리자

대상 계정에서 RDS DB 인스턴스가 생성되었는지 확인합니다.

  1. AWS관리 콘솔에 로그인하고 Amazon RDS 콘솔을 엽니다.

  2. 탐색 창에서 [Databases] 를 선택한 다음 새 RDS DB 인스턴스가 새 클러스터 아래에 나타나는지 확인합니다.

클라우드 관리자, 클라우드 아키텍트, DevOps 엔지니어

Lambda 함수를 구독하여 주제를 구독하십시오. SNS

다음 AWS 명령줄 인터페이스 (AWSCLI) 명령을 실행하여 대상 계정 (계정 B) 의 Lambda 함수를 소스 계정 (계정 A) 의 주제로 구독해야 합니다. SNS

계정 A에서 다음  명령을 실행합니다.

aws sns add-permission \ --label lambda-access --aws-account-id <DestinationAccount> \ --topic-arn <Arn of SNSTopic > \ --action-name Subscribe ListSubscriptionsByTopic

계정 B에서 다음  명령을 실행합니다.

aws lambda add-permission \ --function-name <Name of InvokeStepFunction> \ --source-arn <Arn of SNSTopic > \ --statement-id function-with-sns \ --action lambda:InvokeFunction \ --principal sns.amazonaws.com

계정 B에서 다음  명령을 실행합니다.

aws sns subscribe \ --protocol "lambda" \ --topic-arn <Arn of SNSTopic> \ --notification-endpoint <Arn of InvokeStepFunction>
클라우드 관리자, 클라우드 아키텍트, DBA

원본 계정의 RDS DB 인스턴스를 대상 계정과 동기화합니다.

소스 계정에서 Step Functions 상태 기계를 시작하여 온디맨드 데이터베이스 복제를 시작합니다.

  1. Step Functions 콘솔을 엽니다.

  2. 탐색 창에서 상태 머신을 선택합니다.

  3. 상태 머신을 선택합니다.

  4. 실행 탭에서 함수를 선택한 다음 실행 시작을 선택하여 워크플로를 시작합니다.

참고: 일정에 따라 복제를 자동으로 실행할 수 있도록 스케줄러가 마련되어 있지만 스케줄러는 기본적으로 꺼져 있습니다. 대상 계정의 CloudFormation 스택에 있는 리소스 탭에서 스케줄러에 대한 Amazon CloudWatch 규칙의 이름을 찾을 수 있습니다. 이벤트 규칙을 수정하는 방법에 대한 지침은 사용 CloudWatch 설명서의 CloudWatch CloudWatch 이벤트 규칙 삭제 또는 비활성화를 참조하십시오.

클라우드 설계자, DevOps 엔지니어, 클라우드 관리자

필요한 경우 데이터베이스를 이전 복사본 중 하나로 롤백합니다.

  1. Secrets Manager 콘솔을 엽니다.

  2. 암호 목록에서 이전에 CloudFormation 템플릿을 사용하여 만든 암호를 선택합니다. 애플리케이션은 보안 암호를 사용하여 대상 클러스터의 데이터베이스에 액세스합니다.

  3. 세부 정보 페이지에서 보안 암호 값을 업데이트 하려면, 보안 암호 값 섹션에서 보안 암호 값 검색을 선택한 후 편집을 선택합니다.

  4. 데이터베이스 엔드포인트의 세부 정보를 입력합니다.

클라우드 관리자DBA, DevOps 엔지니어

관련 리소스

추가 정보

다음 예제 정책을 사용하여 계정 간에 키를 공유할 수 있습니다. AWS KMS AWS

{ "Version": "2012-10-17", "Id": "cross-account-rds-kms-key", "Statement": [ { "Sid": "Enable user permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<SourceAccount>:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow administration of the key", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<DestinationAccount>:root" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<DestinationAccount>:root", "arn:aws:iam::<SourceAccount>:root" ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey", "kms:CreateGrant" ], "Resource": "*" } ] }