기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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 Lambda, Amazon EC2 및 DynamoDB는 모두 동일한 계정에 있습니다. 이 시나리오에서는 Lambda 함수와 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 DynamoDB에 액세스할 수 있습니다.
![동일한 계정에서 DynamoDB에 액세스](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/4cd75ed4-98d8-4398-abaf-20d982477ec4.png)
다른 AWS 계정의 리소스가 DynamoDB에 액세스하려는 경우 크로스 계정 액세스 및 신뢰 관계를 설정해야 합니다. 예를 들어, 다음 다이어그램에서 계정 A의 DynamoDB와 계정 B의 Lambda 함수 간에 액세스를 활성화하려면 에픽 섹션에 설명된 대로 계정 간에 신뢰 관계를 생성하고 Lambda 서비스와 사용자에게 적절한 액세스 권한을 부여해야 합니다.
![다른 계정에서 DynamoDB에 액세스](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/28331655-18a6-4da1-a5ad-9831e040b7f8.png)
도구
서비스
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 테이블을 생성합니다.
테이블 생성에 대한 자세한 내용은 DynamoDB 설명서를 참조하십시오. | AWS DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
계정 A에서 역할을 생성합니다. | 계정 B는 이 역할을 사용하여 계정 A에 액세스할 수 있는 권한을 얻습니다. 역할을 생성하려면:
역할 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오. | AWS DevOps |
계정 A에서 역할에 대한 ARN을 기록합니다. |
| AWS DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
계정 A에 액세스하기 위한 정책을 생성합니다. |
정책 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오. | AWS DevOps |
이 정책에 따라 역할을 생성합니다. | 이 역할은 계정 B의 Lambda 함수가 계정 A의 DynamoDB 테이블에서 읽고 쓰는 데 사용됩니다.
이제 다음 에픽의 Lambda 함수에 이 역할을 연결할 수 있습니다. 역할 생성에 대한 자세한 내용은 IAM 설명서를 참조하십시오. | AWS DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
DynamoDB에 데이터를 쓰기 위해 Lambda 함수를 생성합니다. |
Lambda 함수 생성에 대한 자세한 내용은 Lambda 설명서를 참조하십시오. | AWS DevOps |
DynamoDB에서 데이터를 읽기 위해 Lambda 함수를 생성합니다. |
Lambda 함수 생성에 대한 자세한 내용은 Lambda 설명서를 참조하십시오. | AWS DevOps |
작업 | 설명 | 필요한 기술 |
---|---|---|
생성한 리소스를 삭제합니다. | 테스트 또는 개념 증명(PoC) 환경에서 이 패턴을 실행하는 경우, 생성한 리소스를 삭제하여 비용이 발생하지 않도록 하십시오.
| AWS DevOps |
관련 리소스
AWS CLI 시작하기(AWS CLI 설명서)
AWS CLI 구성(AWS CLI 설명서)
DynamoDB 시작하기(DynamoDB 설명서)
Lambda 시작하기(AWS Lambda 설명서)
역할을 생성하여 IAM 사용자에게 권한 위임(IAM 설명서)
IAM 정책 생성(IAM 설명서)
크로스 계정 정책 평가 로직(IAM 설명서)
IAM JSON 정책 요소 참조(IAM 설명서)
추가 정보
이 섹션의 코드는 설명 및 테스트 목적으로만 제공됩니다. 프로덕션 환경에서 이 패턴을 구현하는 경우 코드를 참조로 사용하고 사용자 환경에 맞게 사용자 정의하십시오.
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 쓰기 함수의 샘플 출력](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/880a9f04-7e38-46dd-8ce3-91e562259420.png)
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 읽기 함수의 샘플 출력](images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/38ff890e-1d4c-4b14-9aa2-a2da4304a73b.png)