Amazon DynamoDB에 대한 크로스 계정 액세스 구성 - 권장 가이드

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

Amazon DynamoDB에 대한 크로스 계정 액세스 구성

작성자: Shashi Dalmia(AWS) 및 Jay Enjamoori(AWS)

환경: 프로덕션

기술: DevOps; 데이터베이스; 보안, ID, 규정 준수

AWS 서비스: Amazon DynamoDB, AWS Identity and Access Management, AWS Lambda

요약

이 패턴은 Amazon DynamoDB에 대한 크로스 계정 액세스 구성 단계를 설명합니다. Amazon Web Services(AWS) 서비스는 데이터베이스에 적절한 AWS ID 및 액세스 관리(IAM) 권한이 설정된 경우 동일한 AWS 계정에 있는 DynamoDB 테이블에 액세스할 수 있습니다. 하지만 다른 AWS 계정에서 액세스하려면 IAM 권한을 설정하고 두 계정 간에 신뢰 관계를 설정해야 합니다.

이 패턴은 한 계정에서 다른 계정의 DynamoDB 테이블을 읽고 쓰도록 AWS Lambda 함수를 구성하는 방법을 보여주는 단계 및 샘플 코드를 제공합니다.

사전 조건 및 제한 사항

  • 활성 상태의 AWS 계정 두 개. 이 패턴은 이러한 계정을 계정 A계정 B라고 합니다.

  • DynamoDB 데이터베이스를 생성하기 위해 계정 A에 액세스하도록 AWS Command Line Interface(AWS CLI)가 설치구성되었습니다. 이 패턴의 다른 단계는 IAM, DynamoDB 및 Lambda 콘솔 사용에 대한 지침을 제공합니다. AWS CLI를 대신 사용할 계획이라면 두 계정 모두에 액세스할 수 있도록 구성하십시오.

아키텍처

다음 다이어그램에서 AWS Lambda, Amazon EC2 및 DynamoDB는 모두 동일한 계정에 있습니다. 이 시나리오에서는 Lambda 함수와 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 DynamoDB에 액세스할 수 있습니다.

동일한 계정에서 DynamoDB에 액세스

다른 AWS 계정의 리소스가 DynamoDB에 액세스하려는 경우 크로스 계정 액세스 및 신뢰 관계를 설정해야 합니다. 예를 들어, 다음 다이어그램에서 계정 A의 DynamoDB와 계정 B의 Lambda 함수 간에 액세스를 활성화하려면 에픽 섹션에 설명된 대로 계정 간에 신뢰 관계를 생성하고 Lambda 서비스와 사용자에게 적절한 액세스 권한을 부여해야 합니다. 

다른 계정에서 DynamoDB에 액세스

도구

서비스

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

  • AWS Lambda는 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스입니다. Lambda는 필요 시에만 코드를 실행하며, 일일 몇 개의 요청에서 초당 수천 개의 요청까지 자동으로 규모를 조정합니다. 사용한 컴퓨팅 시간만큼만 비용을 지불하고, 코드가 실행되지 않을 때는 요금이 부과되지 않습니다.

  • AWS Identity and Access Management(IAM)를 사용하면 사용자에 대해 인증 및 권한 부여를 제어함으로써 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.

코드

이 패턴에는 계정 A의 DynamoDB 테이블에서 쓰고 읽도록 계정 B의 Lambda 함수를 구성하는 방법을 설명하는 추가 정보 섹션의 샘플 코드가 포함되어 있습니다. 코드는 설명 및 테스트 목적으로만 제공됩니다. 프로덕션 환경에서 이 패턴을 구현하는 경우 코드를 참조로 사용하고 사용자 환경에 맞게 사용자 정의하십시오.

이 패턴은 Lambda 및 DynamoDB를 사용한 크로스 계정 액세스를 보여줍니다. 다른 AWS 서비스에도 동일한 단계를 사용할 수 있지만 두 계정 모두에 적절한 권한을 부여하고 구성해야 합니다. 예를 들어 계정 A의 Amazon Relational Database Service(RDS) 데이터베이스에 대한 액세스 권한을 부여하려면 해당 데이터베이스의 역할을 생성하고 신뢰 관계에 바인딩하십시오. 계정 B에서 AWS Lambda 대신 Amazon EC2를 사용하려면 해당 IAM 정책 및 역할을 생성한 다음 이를 EC2 인스턴스에 연결합니다.

에픽

작업설명필요한 기술

계정 A에서 DynamoDB 테이블을 생성합니다.

계정 A에 대해 AWS CLI를 구성한 후 다음 AWS CLI 명령을 사용하여 DynamoDB 테이블을 생성합니다.

aws dynamodb create-table \ --table-name Table-Acccount-A \ --attribute-definitions \ AttributeName=category,AttributeType=S \ AttributeName=item,AttributeType=S \ --key-schema \ AttributeName=category,KeyType=HASH \ AttributeName=item,KeyType=RANGE \ --provisioned-throughput \ ReadCapacityUnits=5,WriteCapacityUnits=5

테이블 생성에 대한 자세한 내용은 DynamoDB 설명서를 참조하십시오.

AWS DevOps
작업설명필요한 기술

계정 A에서 역할을 생성합니다.

계정 B는 이 역할을 사용하여 계정 A에 액세스할 수 있는 권한을 얻습니다. 역할을 생성하려면:

  1. https://<account-ID-for-Account-A>.signin.aws.amazon.com/console에서 계정 A에 로그인합니다.

  2. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  3. 콘솔의 탐색 창에서 역할을 선택한 후 역할 생성을 선택합니다.

  4. 신뢰할 수 있는 엔티티에서 AWS 계정을 선택하고, AWS 계정 섹션에서 다른 AWS 계정을 선택합니다.

  5. 계정 ID에 계정 B의 ID를 입력합니다.

  6. 다음: 권한을 선택합니다.

  7. 필터 정책란에 DynamoDB를 입력합니다.

  8. DynamoDB 정책 목록에서 DB를 선택합니다. AmazonDynamo FullAccess

    참고: 이 정책은 DynamoDB에서의 모든 작업을 허용합니다. 보안 모범 사례로서 항상 필요한 권한만 부여해야 합니다. 대신 선택할 수 있는 다른 정책 목록은 IAM 설명서의 정책 예제를 참조하십시오.

  9. 다음: 이름, 검토 및 생성을 선택합니다.

  10. 역할 이름에 역할의 고유한 이름 (예: DynamoDB FullAccess - -For-Account-B) 을 입력하고 역할 설명 (선택 사항) 을 추가합니다.

  11. 모든 섹션을 검토하고 (선택적으로) 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가합니다.

  12. 역할 생성을 선택합니다.

역할 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오.

AWS DevOps

계정 A에서 역할에 대한 ARN을 기록합니다.

  1. IAM 콘솔의 탐색 창에서 역할을 선택합니다.

  2. 검색 상자에 DynamoDB FullAccess - -For-Account-B (또는 이전 스토리에서 만든 역할 이름) 를 입력하고 역할을 선택합니다.

  3. 역할에 대한 요약 페이지에서 Amazon 리소스 이름(ARN)을 복사합니다. 계정 B에서 Lambda 코드를 설정할 때 ARN을 사용하게 됩니다.

AWS DevOps
작업설명필요한 기술

계정 A에 액세스하기 위한 정책을 생성합니다.

  1. https://<account-ID-for-Account-B>.signin.aws.amazon.com/console에서 계정 B에 로그인합니다.

  2. https://console.aws.amazon.com/iam/에서 IAM 콘솔을 엽니다.

  3. 콘솔의 탐색 창에서 정책을 선택한 후 정책 생성을 선택합니다.

  4. JSON 탭을 선택합니다.

  5. 다음 JSON 문서를 입력하거나 붙여넣습니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::<Account-A-ID>:role/DynamoDB-FullAccess-For-Account-B" } ] }

    여기서 Resource 속성에는 이전 스토리에서 계정 A에서 생성한 역할의 ARN이 포함됩니다.

  6. 다음: 태그를 선택합니다.

  7. (선택 사항) 태그를 키 값 페어로 연결하여 메타데이터를 정책에 추가합니다.

  8. 다음: 검토를 선택합니다.

  9. 정책 이름에 정책의 고유한 이름 (예: DynamoDB FullAccess - -Policy-in-Account-A) 을 입력하고 선택적 정책 설명을 추가합니다.

  10. 정책 생성을 선택합니다.

정책 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오.

AWS DevOps

이 정책에 따라 역할을 생성합니다.

이 역할은 계정 B의 Lambda 함수가 계정 A의 DynamoDB 테이블에서 읽고 쓰는 데 사용됩니다.

  1. 계정 B에서 IAM 콘솔의 탐색 창에서 역할을 선택하고 역할 생성을 선택합니다.

  2. 신뢰할 수 있는 엔터티 유형 선택에서 AWS 서비스를 선택합니다.

  3. 사용 사례에서 Lambda를 선택합니다.

  4. 다음: 권한을 선택합니다.

  5. 필터 정책란에 DynamoDB를 입력합니다.

  6. DynamoDB 정책 목록에서 이전 스토리에서 생성한 DynamoDB FullAccess - -계정 내 정책-A를 선택합니다.

  7. 다음: 이름, 검토 및 생성을 선택합니다.

  8. 역할 이름에는 역할의 고유한 이름 (예: DynamoDB FullAccess - -in-Account-A) 을 입력하고 역할 설명 (선택 사항) 을 추가합니다.

  9. 모든 섹션을 검토하고 (선택적으로) 태그를 키-값 페어로 연결하여 메타데이터를 역할에 추가합니다.

  10. 역할 생성을 선택합니다.

이제 다음 에픽의 Lambda 함수에 이 역할을 연결할 수 있습니다.

역할 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오.

AWS DevOps
작업설명필요한 기술

DynamoDB에 데이터를 쓰기 위해 Lambda 함수를 생성합니다.

  1. https://<account-ID-for-Account-B>.signin.aws.amazon.com/console에서 계정 B에 로그인합니다.

  2. https://console.aws.amazon.com/lambda/에서 Lambda 콘솔을 엽니다.

  3. 콘솔의 탐색 창에서 함수를 선택한 후 함수 생성을 선택합니다.

  4. 이름lambda_write_function을 입력합니다.

  5. 런타임에서 Python 3.8 이상을 선택합니다.

  6. 권한에서 기본 실행 역할 변경, 기존 역할 사용을 선택합니다.

  7. 기존 역할의 경우 FullAccessDynamoDB - -인-어카운트-A를 선택합니다.

  8. 함수 생성을 선택합니다.

  9. 코드 탭에서 추가 정보 섹션에 제공된 Lambda 쓰기 함수 샘플 코드를 이 패턴으로 붙여넣습니다. RoleArn 필드에 올바른 역할 ARN(계정 A에서 역할 생성 에픽에서) 을 제공하고 계정 A에서 DynamoDB 테이블이 생성되는 위치(계정 A에서 DynamoDB 테이블 생성 에픽에서)로 region_name을 변경해야 합니다. 이렇게 하지 않으면 ResourceNotFoundException 오류가 발생합니다.

  10. 코드를 배포하려면 배포를 선택합니다.

  11. 함수를 실행하려면 테스트를 선택합니다. 그러면 테스트 이벤트를 구성하라는 메시지가 표시됩니다. 원하는 이름 (예:) 으로 새 이벤트를 생성하고 구성을 저장합니다. MyTestEventForWrite

  12. 함수를 다시 실행하려면 테스트를 선택합니다. 그러면 입력한 이벤트 이름으로 코드가 실행됩니다.

  13. 함수의 출력을 확인합니다. 추가 정보Lambda 쓰기 함수 섹션에 표시된 출력과 비슷해야 합니다. 이 출력은 함수가 계정 A의 DynamoDB 테이블에 액세스하여 데이터를 쓸 수 있었음을 나타냅니다.

Lambda 함수 생성에 대한 자세한 내용은 Lambda 설명서를 참조하십시오.

AWS DevOps

DynamoDB에서 데이터를 읽기 위해 Lambda 함수를 생성합니다.

  1. Lambda 콘솔의 탐색 창에서 함수를 선택한 후 함수 생성을 선택합니다.

  2. 이름lambda_read_function을 입력합니다.

  3. 런타임에서 Python 3.8 이상을 선택합니다.

  4. 권한에서 기본 실행 역할 변경, 기존 역할 사용을 선택합니다.

  5. 기존 역할의 경우 FullAccessDynamoDB - -인-어카운트-A를 선택합니다.

  6. 함수 생성을 선택합니다.

  7. 코드 탭에서 추가 정보 섹션에 제공된 Lambda 읽기 함수 샘플 코드를 이 패턴으로 붙여넣습니다. RoleArn 필드에 올바른 역할 ARN(계정 A에서 역할 생성 에픽에서)을 제공하고 계정 A에서 DynamoDB 테이블이 생성되는 위치(계정 A에서 DynamoDB 테이블 생성 에픽에서)로 region_name을 변경해야 합니다. 이렇게 하지 않으면 ResourceNotFoundException 오류가 발생합니다.

  8. 코드를 배포하려면 배포를 선택합니다.

  9. 함수를 실행하려면 테스트를 선택합니다. 그러면 테스트 이벤트를 구성하라는 메시지가 표시됩니다. 원하는 이름 (예:) 으로 새 이벤트를 생성하고 구성을 저장합니다. MyTestEventForRead

  10. 함수를 다시 실행하려면 테스트를 선택합니다. 그러면 입력한 이벤트 이름으로 코드가 실행됩니다.

  11. 함수의 출력을 확인합니다. 추가 정보Lambda 읽기 함수 섹션에 표시된 출력과 비슷해야 합니다. 이 출력은 함수가 계정 A의 DynamoDB 테이블에 액세스하여 테이블에 추가한 데이터를 읽을 수 있었음을 나타냅니다.

Lambda 함수 생성에 대한 자세한 내용은 Lambda 설명서를 참조하십시오.

AWS DevOps
작업설명필요한 기술

생성한 리소스를 삭제합니다.

테스트 또는 개념 증명(PoC) 환경에서 이 패턴을 실행하는 경우, 생성한 리소스를 삭제하여 비용이 발생하지 않도록 하십시오.

  1. 계정 B에서 DynamoDB에 연결하기 위해 생성한 Lambda 함수 2개와 기타 리소스를 삭제합니다.

  2. 계정 A에서 생성한 DynamoDB 테이블을 삭제합니다.

  3. IAM 정책은 비용이 들지 않으므로 그대로 유지할 수 있습니다. 그러나 보안을 위해 이 패턴에 대해 생성한 다음 역할 및 정책을 삭제하는 것이 좋습니다.

    • 계정 A: DymamoDB-Full-Access-for-Account-A 역할

    • 계정 B: DynamoDB- FullAccess -계정 내 역할

    • 계정 B: DynamoDB- -계정 내 FullAccess 정책-A 정책

AWS DevOps

관련 리소스

추가 정보

이 섹션의 코드는 설명 및 테스트 목적으로만 제공됩니다. 프로덕션 환경에서 이 패턴을 구현하는 경우 코드를 참조로 사용하고 사용자 환경에 맞게 사용자 정의하십시오.

Lambda 쓰기 함수

샘플 코드

import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): now = datetime.now() date_time = now.strftime("%m/%d/%Y, %H:%M:%S") data = dynamodb_client.put_item(TableName='Table-Acccount-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": date_time}}) return data

샘플 출력

Lambda 쓰기 함수의 샘플 출력

Lambda 읽기 함수

샘플 코드

import boto3 from datetime import datetime sts_client = boto3.client('sts') sts_session = sts_client.assume_role(RoleArn='arn:aws:iam::<Account-A ID>:role/DynamoDB-FullAccess-For-Account-B', RoleSessionName='test-dynamodb-session') KEY_ID = sts_session['Credentials']['AccessKeyId'] ACCESS_KEY = sts_session['Credentials']['SecretAccessKey'] TOKEN = sts_session['Credentials']['SessionToken'] dynamodb_client = boto3.client('dynamodb', region_name='<DynamoDB-table-region-in-account-A>', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY, aws_session_token=TOKEN) def lambda_handler(event, context): response = dynamodb_client.get_item(TableName='Table-Acccount-A', Key={'category':{'S':'Fruit'}, 'item':{'S':'Apple'}}) return response

샘플 출력

Lambda 읽기 함수의 샘플 출력