

# Amazon DynamoDB의 보안 및 규정 준수
<a name="security"></a>

AWS은 클라우드 보안을 가장 중요하게 생각합니다. AWS 고객으로서 여러분은 가장 높은 보안 요구 사항을 충족하기 위해 설계된 데이터 센터 및 네트워크 아키텍처의 혜택을 받게 됩니다.

보안은 AWS과 사용자의 공동 책임입니다. [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/)은 이 사항을 클라우드 *내* 보안 및 클라우드*의* 보안으로 설명합니다.
+ **클라우드의 보안** - AWS는 AWS 클라우드 내에서 AWS 서비스를 실행하는 인프라를 보호할 책임이 있습니다. AWS 또한 안전하게 사용할 수 있는 서비스를 제공합니다. 서드 파티 감사자는 정기적으로 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)의 일환으로 보안 효과를 테스트하고 검증합니다. DynamoDB에 적용되는 규정 준수 프로그램에 대한 자세한 내용은 [규정 준수 프로그램 제공 범위 내의 AWS 서비스](https://aws.amazon.com/compliance/services-in-scope/)를 참조하세요.
+ **클라우드 내 보안** – 사용자의 책임은 사용자가 사용하는 AWS 서비스에 의해 결정됩니다. 또한 데이터의 민감도, 조직의 요건 및 관련 법률 및 규정을 비롯한 기타 요소에 대해서도 책임이 있습니다.

이 설명서는 DynamoDB 사용 시 공동 책임 모델을 적용하는 방법을 이해하는 데 도움이 됩니다. 다음 항목에서는 보안 및 규정 준수 목표를 충족하도록 DynamoDB를 구성하는 방법을 보여줍니다. 또한 DynamoDB 리소스를 모니터링하고 보호하는 데 도움이 되는 다른 AWS 서비스를 사용하는 방법도 알아봅니다.

**Topics**
+ [Amazon DynamoDB의 AWS 관리형 정책](ddb-security-iam.awsmanpol.md)
+ [DynamoDB에서 리소스 기반 정책 사용](access-control-resource-based.md)
+ [DynamoDB의 속성 기반 액세스 제어 사용](attribute-based-access-control.md)
+ [DynamoDB의 데이터 보호](data-protection.md)
+ [AWS Identity and Access Management(IAM) 및 DynamoDB](identity-and-access-mgmt.md)
+ [DynamoDB에 대한 업종별 규정 준수 확인](Compliance.md)
+ [Amazon DynamoDB의 복원성 및 재해 복구](disaster-recovery-resiliency.md)
+ [Amazon DynamoDB의 인프라 보안](network-isolation.md)
+ [AWS PrivateLink for DynamoDB](privatelink-interface-endpoints.md)
+ [Amazon DynamoDB의 구성 및 취약성 분석](configuration-vulnerability.md)
+ [Amazon DynamoDB 보안 모범 사례](best-practices-security.md)

# Amazon DynamoDB의 AWS 관리형 정책
<a name="ddb-security-iam.awsmanpol"></a>

DynamoDB는 AWS 관리형 정책을 사용하여 서비스가 특정 작업을 수행하는 데 필요한 권한 집합을 정의합니다. DynamoDB는 AWS 관리형 정책을 유지 관리하고 업데이트합니다. AWS 관리형 정책에서는 권한을 변경할 수 없습니다. AWS 관리형 정책에 대한 자세한 정보는 IAM 사용 설명서에서 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)을 참조하세요.

DynamoDB는 때때로 추가 권한을 AWS 관리형 정책에 추가하여 새로운 기능을 지원합니다. 이 유형의 업데이트는 정책이 연결된 모든 ID(사용자, 그룹 및 역할)에 적용됩니다. 새로운 기능이 출시되거나 새 작업을 사용할 수 있게 되면 AWS 관리형 정책이 업데이트될 가능성이 높습니다. DynamoDB는 AWS 관리형 정책에서 권한을 제거하지 않기 때문에 정책 업데이트로 인해 기존 권한이 손상되지 않습니다. AWS 관리형 정책의 전체 목록은 [AWS managed policies](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/policy-list.html)를 참조하세요.

## AWS 관리형 정책: DynamoDBReplicationServiceRolePolicy
<a name="ddb-security-iam.awsmanpol.policy"></a>

`DynamoDBReplicationServiceRolePolicy` 정책을 IAM 엔터티에 연결할 수 없습니다. 이 정책은 DynamoDB가 사용자를 대신하여 작업을 수행할 수 있도록 서비스 연결 역할에 연결됩니다. 자세한 내용은 [글로벌 테이블에 IAM 사용](globaltables-security.md)을 참조하세요.

이 정책은 서비스 연결 역할이 글로벌 테이블 복제본 간에 데이터 복제를 수행할 수 있도록 하는 권한을 부여합니다. 또한 사용자 대신 글로벌 테이블 복제본을 관리할 수 있는 관리 권한도 부여합니다.

**권한 세부 정보**

이 정책은 다음을 수행할 수 있는 권한을 부여합니다.
+ `dynamodb` - 데이터 복제를 수행하고 테이블 복제본을 관리합니다.
+ `application-autoscaling` - 테이블 Auto Scaling 설정을 검색하고 관리합니다.
+ `account` - 복제본 접근성을 평가하기 위해 리전 상태를 검색합니다.
+ `iam` - 서비스 연결 역할이 아직 없는 경우 애플리케이션 Auto Scaling을 위한 서비스 연결 역할을 생성합니다.

이 관리형 정책의 정의는 [여기](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/DynamoDBReplicationServiceRolePolicy.html)에서 확인할 수 있습니다.

## AWS 관리형 정책: AmazonDynamoDBFullAccess\$1v2
<a name="ddb-security-iam.awsmanpol.fullaccesspolicy-v2"></a>

범위 축소 `AmazonDynamoDBFullAccess_v2` 정책은 사용자에게 특정 액세스 권한을 부여합니다. `AmazonDynamoDBFullAccess_v2` 정책을 IAM ID에 연결할 수 있습니다. 이 정책은 Amazon DynamoDB 리소스에 대한 관리 액세스 권한을 부여하고, 모든 DynamoDB 기능을 사용하기 위해 DynamoDB와 통합되는 AWS 서비스에 대한 액세스 권한을 IAM ID(예: 사용자, 그룹 또는 역할)에 부여합니다. 이 정책을 사용하면 AWS Management Console에서 사용할 수 있는 모든 DynamoDB 기능에 액세스할 수 있습니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `Amazon DynamoDB`
+ `DynamoDB Accelerator`
+ `AWS KMS`
+ `AWS Resource Groups Tagging`
+ `Lambda`
+ `Application Auto Scaling`
+ `CloudWatch`
+ `Amazon Kinesis`
+ `Amazon EC2`
+ `IAM`

`JSON` 형식으로 정책을 검토하려면 [AmazonDynamoDBFullAccess\$1v2](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess_v2.html)를 참조하세요.

## AWS 관리형 정책: AmazonDynamoDBReadOnlyAccess
<a name="ddb-security-iam.awsmanpol.readonlypolicy"></a>

`AmazonDynamoDBReadOnlyAccess` 정책을 IAM ID에 연결할 수 있습니다.

이 정책은 Amazon DynamoDB에 대한 읽기 전용 액세스 권한을 부여합니다.

**권한 세부 정보**

이 정책에는 다음 권한이 포함되어 있습니다.
+ `Amazon DynamoDB` - Amazon DynamoDB에 대한 읽기 전용 액세스 권한을 제공합니다.
+ `Amazon DynamoDB Accelerator (DAX)` - Amazon DynamoDB Accelerator(DAX)에 대한 읽기 전용 액세스 권한을 제공합니다.
+ `Application Auto Scaling` - 보안 주체가 Application Auto Scaling의 구성을 볼 수 있도록 허용합니다. 이는 사용자가 테이블에 첨부된 자동 조정 정책을 볼 수 있도록 하기 위해 필요합니다.
+ `CloudWatch` – 보안 주체가 CloudWatch에서 구성된 지표 데이터와 경보를 볼 수 있도록 허용합니다. 이는 사용자가 청구 가능한 테이블 크기 및 테이블에 구성된 CloudWatch 경보를 볼 수 있도록 하기 위해 필요합니다.
+ `AWS Data Pipeline` - 보안 주체가 AWS Data Pipeline 및 관련 객체를 보도록 허용합니다.
+ `Amazon EC2` - 보안 주체가 Amazon EC2 VPC, 서브넷, 보안 그룹을 보도록 허용합니다.
+ `IAM` - 보안 주체가 IAM 역할을 보도록 허용합니다.
+ `AWS KMS` - 보안 주체가 AWS KMS에 구성된 키를 볼 수 있도록 허용합니다. 이는 사용자가 자신의 계정에서 생성하고 관리하는 AWS KMS keys를 볼 수 있도록 하기 위해 필요합니다.
+ `Amazon SNS` - 보안 주체가 Amazon SNS 주제 및 주제별 구독을 나열하도록 허용합니다.
+ `AWS Resource Groups` - 보안 주체가 리소스 그룹 및 해당 쿼리를 보도록 허용합니다.
+ `AWS Resource Groups Tagging` - 보안 주체가 한 리전에서 태그가 지정되어 있거나 이전에 태그가 지정되었던 리소스를 모두 나열하도록 허용합니다.
+ `Kinesis` - 보안 주체가 Kinesis 데이터 스트림 설명을 보도록 허용합니다.
+ `Amazon CloudWatch Contributor Insights` - 보안 주체가 Contributor Insights 규칙이 수집한 시계열 데이터를 보도록 허용합니다.

정책을 `JSON` 형식으로 검토하려면 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html)를 참조하세요.

## AWS 관리형 정책으로 DynamoDB 업데이트
<a name="ddb-security-iam.awsmanpol.updates"></a>

이 표는 DynamoDB의 AWS 액세스 관리 정책에 대한 업데이트를 보여 줍니다.


****  

| 변경 | 설명 | 변경 날짜 | 
| --- | --- | --- | 
| AmazonDynamoDBFullAccess - 사용 중단됨 | 이 정책은 범위가 축소된 `AmazonDynamoDBFullAccess_v2`라는 정책으로 대체되었습니다. **2025년 4월** 이후에는 새 사용자, 그룹 또는 역할에 `AmazonDynamoDBFullAccess` 정책을 연결할 수 없습니다. 자세한 내용은 [AWS 관리형 정책: AmazonDynamoDBFullAccess\$1v2](#ddb-security-iam.awsmanpol.fullaccesspolicy-v2) 섹션을 참조하세요.  | 2025년 4월 28일 | 
| AmazonDynamoDBReadOnlyAccess기존 정책에 대한  업데이트 | AmazonDynamoDBReadOnlyAccess가 dynamodb:GetAbacStatus 및 dynamodb:UpdateAbacStatus 권한을 추가했습니다. 이러한 권한을 통해 ABAC 상태를 보고 현재 리전의 AWS 계정에 ABAC를 활성화할 수 있습니다. | 2024년 11월 18일 | 
| AmazonDynamoDBReadOnlyAccess기존 정책에 대한  업데이트 | AmazonDynamoDBReadOnlyAccess가  권한을 추가했습니다.dynamodb:GetResourcePolicy 이 권한은 DynamoDB 리소스에 연결된 리소스 기반 정책을 읽을 수 있는 액세스를 제공합니다. | 2024년 3월 20일 | 
| 기존 정책에 대한 DynamoDBReplicationServiceRolePolicy 업데이트 | DynamoDBReplicationServiceRolePolicy가  권한을 추가했습니다.dynamodb:GetResourcePolicy 이 권한을 사용하면 서비스 연결 역할이 DynamoDB 리소스에 연결된 리소스 기반 정책을 읽을 수 있습니다. | 2023년 12월 15일 | 
| 기존 정책에 대한 DynamoDBReplicationServiceRolePolicy 업데이트 | DynamoDBReplicationServiceRolePolicy가 account:ListRegions 권한을 추가했습니다. 이 권한을 사용하면 서비스 연결 역할이 복제본 접근성을 평가할 수 있습니다. | 2023년 5월 10일 | 
| 관리형 정책 목록에 DynamoDBReplicationServiceRolePolicy 추가됨 | DynamoDB 글로벌 테이블 서비스 연결 역할에서 사용하는 관리형 정책 DynamoDBReplicationServiceRolePolicy에 대한 정보가 추가되었습니다. | 2023년 5월 10일 | 
| DynamoDB 글로벌 테이블 변경 사항 추적 시작 | DynamoDB 글로벌 테이블이 AWS 관리형 정책에 대한 변경 사항 추적을 시작했습니다. | 2023년 5월 10일 | 

# DynamoDB에서 리소스 기반 정책 사용
<a name="access-control-resource-based"></a>

DynamoDB는 테이블, 인덱스 및 스트림에 리소스 기반 정책을 지원합니다. 리소스 기반 정책을 사용하면 각 리소스에 액세스할 수 있는 사람과 각 리소스에서 수행할 수 있는 작업을 지정하여 액세스 권한을 정의할 수 있습니다.

리소스 기반 정책을 테이블 또는 스트림과 같은 DynamoDB 리소스에 연결할 수 있습니다. 이 정책에서는 이러한 DynamoDB 리소스에서 특정 작업을 수행할 수 있는 Identity and Access Management(IAM) [보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/intro-structure.html#intro-structure-principal)에 대한 권한을 지정합니다. 예를 들어, 테이블에 연결된 정책에는 테이블과 해당 인덱스에 대한 액세스 권한이 포함됩니다. 따라서 리소스 기반 정책은 리소스 수준에서 권한을 정의하여 DynamoDB 테이블, 인덱스 및 스트림에 대한 액세스 제어를 간소화하는 데 도움이 될 수 있습니다. DynamoDB 리소스에 연결할 수 있는 정책의 최대 크기는 20KB입니다.

리소스 기반 정책을 사용하면 얻을 수 있는 중요한 이점은 크로스 계정 액세스 제어를 간소화하여 서로 다른 AWS 계정의 IAM 보안 주체에 크로스 계정 액세스 권한을 제공할 수 있다는 것입니다. 자세한 내용은 [크로스 게정 액세스에 대한 리소스 기반 정책](rbac-examples.md#rbac-examples-cross-account) 섹션을 참조하세요.

또한 리소스 기반 정책은 [IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html) 외부 액세스 분석기 및 [퍼블릭 액세스 차단(BPA)](rbac-bpa-rbp.md) 기능과의 통합을 지원합니다. IAM Access Analyzer는 리소스 기반 정책에 지정된 외부 엔터티에 대한 크로스 계정 액세스를 보고합니다. 또한 권한을 세분화하고 최소 권한 원칙을 준수하는 데 도움이 되는 가시성을 제공합니다. BPA는 DynamoDB 테이블, 인덱스 및 스트림에 대한 퍼블릭 액세스를 방지하는 데 도움이 되며 리소스 기반 정책 생성 및 수정 워크플로에서 자동으로 활성화됩니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/q9sBxrVgq4U?si=0cR4TJIlKvH9Wlu5)


**Topics**
+ [리소스 기반 정책을 포함한 테이블 생성](rbac-create-table.md)
+ [DynamoDB 기존 테이블에 정책 연결](rbac-attach-resource-based-policy.md)
+ [DynamoDB 스트림에 리소스 기반 정책 연결](rbac-attach-resource-policy-streams.md)
+ [DynamoDB 테이블에서 리소스 기반 정책 제거](rbac-delete-resource-based-policy.md)
+ [DynamoDB에서 리소스 기반 정책을 사용하는 교차 계정 액세스](rbac-cross-account-access.md)
+ [DynamoDB의 리소스 기반 정책으로 퍼블릭 액세스 차단](rbac-bpa-rbp.md)
+ [리소스 기반 정책이 지원하는 DynamoDB API 작업](rbac-iam-actions.md)
+ [IAM 자격 증명 기반 정책 및 DynamoDB 리소스 기반 정책을 사용한 권한 부여](rbac-auth-iam-id-based-policies-DDB.md)
+ [DynamoDB 리소스 기반 정책 예제](rbac-examples.md)
+ [DynamoDB 리소스 기반 정책 고려 사항](rbac-considerations.md)
+ [DynamoDB 리소스 기반 정책 모범 사례](rbac-best-practices.md)

# 리소스 기반 정책을 포함한 테이블 생성
<a name="rbac-create-table"></a>

DynamoDB 콘솔, [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API, AWS CLI, [AWS SDK](rbac-attach-resource-based-policy.md#rbac-attach-policy-java-sdk) 또는 CloudFormation 템플릿을 사용하여 테이블을 생성하는 동안 리소스 기반 정책을 추가할 수 있습니다.

## AWS CLI
<a name="rbac-create-table-CLI"></a>

다음 예시에서는 `create-table` AWS CLI 명령을 사용하여 *MusicCollection*이라는 테이블을 생성합니다. 이 명령에는 테이블에 리소스 기반 정책을 추가하는 `resource-policy` 파라미터도 포함되어 있습니다. 이 정책을 통해 사용자 *John*은 테이블에서 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html), [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 및 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 작업을 수행할 수 있습니다.

*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

```
aws dynamodb create-table \
    --table-name MusicCollection \
    --attribute-definitions AttributeName=Artist,AttributeType=S AttributeName=SongTitle,AttributeType=S \
    --key-schema AttributeName=Artist,KeyType=HASH AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --resource-policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::123456789012:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:RestoreTableToPointInTime\",
                        \"dynamodb:GetItem\",
                        \"dynamodb:DescribeTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS Management Console
<a name="rbac-create-table-console"></a>

1. AWS Management Console에 로그인하고 DynamoDB 콘솔([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/))을 엽니다.

1. 대시보드에서 **테이블 생성**을 선택합니다.

1. **테이블 세부 정보**에 테이블 이름, 파티션 키 및 정렬 키 세부 정보를 입력합니다.

1. **테이블 설정**에서 **설정 사용자 지정**을 선택합니다.

1. (선택 사항) **테이블 클래스**, **용량 계산기**, **읽기/쓰기 용량 설정**, **보조 인덱스**, **저장 중 암호화** 및 **삭제 방지**에 대한 옵션을 지정합니다.

1. **리소스 기반 정책**에서 테이블 및 해당 인덱스에 대한 액세스 권한을 정의하는 정책을 추가합니다. 이 정책에서는 이러한 리소스에 액세스할 수 있는 사용자와 각 리소스에서 해당 사용자가 수행할 수 있는 작업을 지정합니다. 정책을 추가하려면 다음 중 하나를 수행합니다.
   + JSON 정책 문서를 입력하거나 붙여 넣습니다. IAM 정책 언어에 대한 자세한 내용은 **IAM 사용 설명서의 [JSON 편집기를 사용하여 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)을 참조하세요.
**작은 정보**  
Amazon DynamoDB 개발자 안내서에서 리소스 기반 정책의 예를 보려면 **정책 예시**를 선택하세요.
   + 새 문을 추가하려면 **새 문 추가**를 선택하고 제공된 필드에 정보를 입력합니다. 문을 추가하려는 만큼 이 단계를 반복합니다.
**중요**  
정책을 저장하기 전에 보안 경고, 오류 및 제안 사항을 해결해야 합니다.

   다음 IAM 정책 예시는 사용자 *John*이 *MusicCollection* 테이블에서 [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html), [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 및 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API 작업을 수행할 수 있도록 허용합니다.

   *기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::123456789012:user/username"
         },
         "Action": [
           "dynamodb:RestoreTableToPointInTime",
           "dynamodb:GetItem",
           "dynamodb:PutItem"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

1. (선택 사항) 오른쪽 하단 **외부 액세스 미리 보기**를 선택하면 새 정책이 리소스의 퍼블릭 및 크로스 계정 액세스에 미치는 영향을 미리 확인할 수 있습니다. 정책을 저장하기 전에 새로운 IAM Access Analyzer 검색 결과가 나오는지, 기존 결과가 해결되는지 여부를 확인할 수 있습니다. 활성 분석기가 표시되지 않으면 **Access Analyzer로 이동**을 선택하여 IAM Access Analyzer에서 [계정 분석기를 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)합니다. 자세한 내용은 [액세스 미리 보기](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)를 잠조하세요

1. **테이블 생성**을 선택합니다.

## AWS CloudFormation 템플릿
<a name="rbac-create-table-cfn"></a>

------
#### [ Using the AWS::DynamoDB::Table resource ]

다음 CloudFormation 템플릿은 [AWS::DynamoDB::Table](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html) 리소스를 사용하여 스트림이 포함된 테이블을 생성합니다. 이 템플릿에는 테이블과 스트림 모두에 연결된 리소스 기반 정책도 포함되어 있습니다.

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "MusicCollectionTable": {
            "Type": "AWS::DynamoDB::Table",
            "Properties": {
                "AttributeDefinitions": [
                    {
                        "AttributeName": "Artist",
                        "AttributeType": "S"
                    }
                ],
                "KeySchema": [
                    {
                        "AttributeName": "Artist",
                        "KeyType": "HASH"
                    }
                ],
                "BillingMode": "PROVISIONED",
                "ProvisionedThroughput": {
                    "ReadCapacityUnits": 5,
                    "WriteCapacityUnits": 5
                },
                "StreamSpecification": {
                  "StreamViewType": "OLD_IMAGE",
                  "ResourcePolicy": {
                    "PolicyDocument": {
                      "Version": "2012-10-17",		 	 	 
                      "Statement": [
                        {
                            "Principal": {
                                "AWS": "arn:aws:iam::111122223333:user/John"
                            },
                            "Effect": "Allow",
                            "Action": [
                                "dynamodb:GetRecords",
                                "dynamodb:GetShardIterator",
                                "dynamodb:DescribeStream"
                            ],
                            "Resource": "*"
                        }
                      ]
                    }
                  }
                },
                "TableName": "MusicCollection",
                "ResourcePolicy": {
                    "PolicyDocument": {
                        "Version": "2012-10-17",		 	 	 
                        "Statement": [
                            {
                                "Principal": {
                                    "AWS": [
                                        "arn:aws:iam::111122223333:user/John"
                                    ]
                                },
                                "Effect": "Allow",
                                "Action": "dynamodb:GetItem",
                                "Resource": "*"
                            }
                        ]
                    }
                }
            }
           
        }
    }
}
```

------
#### [ Using the AWS::DynamoDB::GlobalTable resource ]

다음 CloudFormation 템플릿은 [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 리소스로 테이블을 생성하고 테이블과 해당 스트림에 리소스 기반 정책을 연결합니다.

```
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "GlobalMusicCollection": {
            "Type": "AWS::DynamoDB::GlobalTable",
            "Properties": {
                "TableName": "MusicCollection",
                "AttributeDefinitions": [{
                    "AttributeName": "Artist",
                    "AttributeType": "S"
                }],
                "KeySchema": [{
                    "AttributeName": "Artist",
                    "KeyType": "HASH"
                }],
                "BillingMode": "PAY_PER_REQUEST",
                "StreamSpecification": {
                    "StreamViewType": "NEW_AND_OLD_IMAGES"
                },
                "Replicas": [
                    {
                        "Region": "us-east-1",
                        "ResourcePolicy": {
                            "PolicyDocument": {
                                "Version": "2012-10-17",		 	 	 
                                "Statement": [{
                                    "Principal": {
                                        "AWS": [
                                            "arn:aws:iam::111122223333:user/John"
                                        ]
                                    },
                                    "Effect": "Allow",
                                    "Action": "dynamodb:GetItem",
                                    "Resource": "*"
                                }]
                            }
                        },
                        "ReplicaStreamSpecification": {
                            "ResourcePolicy": {
                                "PolicyDocument": {
                                    "Version": "2012-10-17",		 	 	 
                                    "Statement": [{
                                        "Principal": {
                                            "AWS": "arn:aws:iam::111122223333:user/John"
                                        },
                                        "Effect": "Allow",
                                        "Action": [
                                            "dynamodb:GetRecords",
                                            "dynamodb:GetShardIterator",
                                            "dynamodb:DescribeStream"
                                        ],
                                        "Resource": "*"
                                    }]
                                }
                            }
                        }
                    }
                ]
            }
        }
    }
}
```

------

# DynamoDB 기존 테이블에 정책 연결
<a name="rbac-attach-resource-based-policy"></a>

DynamoDB 콘솔, [PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API, AWS CLI, AWS SDK 또는 [CloudFormation 템플릿](rbac-create-table.md#rbac-create-table-cfn)을 사용하여 기존 테이블에 리소스 기반 정책을 연결하거나 기존 정책을 수정할 수 있습니다.

## 새 정책을 연결하는 AWS CLI 예시
<a name="rbac-attach-policy-CLI"></a>

다음 IAM 정책 예시에서는 `put-resource-policy` AWS CLI 명령을 사용하여 기존 테이블에 리소스 기반 정책을 연결합니다. 이 예시를 사용하면 사용자 *John*이 *MusicCollection*이라는 기존 테이블에서 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html), [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html), [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html), [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 작업을 수행할 수 있습니다.

*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:PutItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## 기존 정책을 조건부로 업데이트하는 AWS CLI 예시
<a name="rbac-update-policy-CLI"></a>

테이블의 기존 리소스 기반 정책을 조건부로 업데이트하려면 선택적인 `expected-revision-id` 파라미터를 사용할 수 있습니다. 다음 예시는 정책이 DynamoDB에 존재하고 현재 수정 ID가 제공된 `expected-revision-id` 파라미터와 일치하는 경우에만 정책을 업데이트합니다.

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --expected-revision-id 1709841168699 \ 
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetItem\",
                        \"dynamodb:UpdateItem\",
                        \"dynamodb:UpdateTable\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection\"
                }
            ]
        }"
```

## AWS Management Console
<a name="rbac-attach-policy-console"></a>

1. AWS Management Console에 로그인하고 DynamoDB 콘솔([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/))을 엽니다.

1. 대시보드에서 기존 테이블을 선택합니다.

1. **권한** 탭으로 이동한 다음 **테이블 정책 생성**을 선택합니다.

1. 리소스 기반 정책 편집기에서 연결하려는 정책을 추가하고 **정책 생성**을 선택합니다.

   다음 IAM 정책 예시를 사용하면 사용자 *John*이 *MusicCollection*이라는 기존 테이블에서 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html), [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html), [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html), [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API 작업을 수행할 수 있습니다.

   *기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::111122223333:user/username"
         },
         "Action": [
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:UpdateItem",
           "dynamodb:UpdateTable"
         ],
         "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
       }
     ]
   }
   ```

------

## AWS SDK for Java 2.x
<a name="rbac-attach-policy-java-sdk"></a>

다음 IAM 정책 예시에서는 `putResourcePolicy` 메서드를 사용하여 기존 테이블에 리소스 기반 정책을 연결합니다. 이 정책을 통해 사용자는 기존 테이블에서 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API 작업을 수행할 수 있습니다.

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.PutResourcePolicyRequest;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * [Get started with the AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html)
 */
public class PutResourcePolicy {

    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <tableArn> <allowedAWSPrincipal>

                Where:
                    tableArn - The Amazon DynamoDB table ARN to attach the policy to. For example, arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection.
                    allowedAWSPrincipal - Allowed AWS principal ARN that the example policy will give access to. For example, arn:aws:iam::123456789012:user/John.
                """;

        if (args.length != 2) {
            System.out.println(usage);
            System.exit(1);
        }

        String tableArn = args[0];
        String allowedAWSPrincipal = args[1];
        System.out.println("Attaching a resource-based policy to the Amazon DynamoDB table with ARN " +
                tableArn);
        Region region = Region.US_WEST_2;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        String result = putResourcePolicy(ddb, tableArn, allowedAWSPrincipal);
        System.out.println("Revision ID for the attached policy is " + result);
        ddb.close();
    }

    public static String putResourcePolicy(DynamoDbClient ddb, String tableArn, String allowedAWSPrincipal) {
        String policy = generatePolicy(tableArn, allowedAWSPrincipal);
        PutResourcePolicyRequest request = PutResourcePolicyRequest.builder()
                .policy(policy)
                .resourceArn(tableArn)
                .build();

        try {
            return ddb.putResourcePolicy(request).revisionId();
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }

        return "";
    }

    private static String generatePolicy(String tableArn, String allowedAWSPrincipal) {
        return "{\n" +
                "    \"Version\": \"2012-10-17\",\n" +,		 	 	 
                "    \"Statement\": [\n" +
                "        {\n" +
                "            \"Effect\": \"Allow\",\n" +
                "            \"Principal\": {\"AWS\":\"" + allowedAWSPrincipal + "\"},\n" +
                "            \"Action\": [\n" +
                "                \"dynamodb:GetItem\"\n" +
                "            ],\n" +
                "            \"Resource\": \"" + tableArn + "\"\n" +
                "        }\n" +
                "    ]\n" +
                "}";
    }
}
```

# DynamoDB 스트림에 리소스 기반 정책 연결
<a name="rbac-attach-resource-policy-streams"></a>

DynamoDB 콘솔, [PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html) API, AWS CLI, AWS SDK 또는 [CloudFormation 템플릿](rbac-create-table.md#rbac-create-table-cfn)을 사용하여 기존 테이블의 스트림에 리소스 기반 정책을 연결하거나 기존 정책을 수정할 수 있습니다.

**참고**  
[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 또는 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) API를 사용하여 스트림을 생성하는 동안에는 정책을 스트림에 연결할 수 없습니다. 하지만 테이블을 삭제한 후에는 정책을 수정하거나 삭제할 수 있습니다. 비활성화된 스트림의 정책을 수정하거나 삭제할 수도 있습니다.



## AWS CLI
<a name="rbac-attach-policy-stream-CLI"></a>

다음 IAM 정책 예시에서는 `put-resource-policy` AWS CLI 명령을 사용하여 *MusicCollection*이라는 테이블의 스트림에 리소스 기반 정책을 연결합니다. 이 예시를 통해 사용자 *John*은 스트림에서 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html), [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html), [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 작업을 수행할 수 있습니다.

*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

```
aws dynamodb put-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492 \
    --policy \
        "{
            \"Version\": \"2012-10-17\",		 	 	 
            \"Statement\": [
              {
                    \"Effect\": \"Allow\",
                    \"Principal\": {
                        \"AWS\": \"arn:aws:iam::111122223333:user/John\"
                    },
                    \"Action\": [
                        \"dynamodb:GetRecords\",
                        \"dynamodb:GetShardIterator\",
                        \"dynamodb:DescribeStream\"
                    ],
                    \"Resource\": \"arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492\"
                }
            ]
        }"
```

## AWS Management Console
<a name="rbac-attach-policy-stream-console"></a>

1. AWS Management Console에 로그인하고 DynamoDB 콘솔([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/))을 엽니다.

1. DynamoDB 콘솔 대시보드에서 **테이블**을 선택한 다음, 기존 테이블을 선택합니다.

   선택한 테이블에 스트림이 켜져 있는지 확인하세요. 테이블의 스트림 활성화에 대한 정보는 [스트림 활성화](Streams.md#Streams.Enabling) 섹션을 참조하세요.

1. **권한** 탭을 선택합니다.

1. **활성 스트림용 리소스 기반 정책**에서 **스트림 정책 생성**을 선택합니다.

1. **리소스 기반 정책** 편집기에서 스트림에 대한 액세스 권한을 정의하는 정책을 추가합니다. 이 정책에서는 해당 스트림에 액세스할 수 있는 사용자와 스트림에서 해당 사용자가 수행할 수 있는 작업을 지정합니다. 정책을 추가하려면 다음 중 하나를 수행합니다.
   + JSON 정책 문서를 입력하거나 붙여 넣습니다. IAM 정책 언어에 대한 자세한 내용은 **IAM 사용 설명서의 [JSON 편집기를 사용하여 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor)을 참조하세요.
**작은 정보**  
Amazon DynamoDB 개발자 안내서에서 리소스 기반 정책의 예를 보려면 **정책 예시**를 선택하세요.
   + 새 문을 추가하려면 **새 문 추가**를 선택하고 제공된 필드에 정보를 입력합니다. 문을 추가하려는 만큼 이 단계를 반복합니다.
**중요**  
정책을 저장하기 전에 보안 경고, 오류 및 제안 사항을 해결해야 합니다.

1. (선택 사항) 오른쪽 하단 **외부 액세스 미리 보기**를 선택하면 새 정책이 리소스의 퍼블릭 및 크로스 계정 액세스에 미치는 영향을 미리 확인할 수 있습니다. 정책을 저장하기 전에 새로운 IAM Access Analyzer 검색 결과가 나오는지, 기존 결과가 해결되는지 여부를 확인할 수 있습니다. 활성 분석기가 표시되지 않으면 **Access Analyzer로 이동**을 선택하여 IAM Access Analyzer에서 [계정 분석기를 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)합니다. 자세한 내용은 [액세스 미리 보기](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)를 잠조하세요

1. **정책 생성**을 선택합니다.

다음 IAM 정책 예시에서는 리소스 기반 정책을 *MusicCollection*이라는 테이블의 스트림에 연결합니다. 이 예시를 통해 사용자 *John*은 스트림에서 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html), [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html), [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 작업을 수행할 수 있습니다.

*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/username"
      },
      "Action": [
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator",
        "dynamodb:DescribeStream"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

# DynamoDB 테이블에서 리소스 기반 정책 제거
<a name="rbac-delete-resource-based-policy"></a>

DynamoDB 콘솔, [DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html) API, AWS CLI, AWS SDK 또는 CloudFormation 템플릿을 사용하여 기존 테이블에서 리소스 기반 정책을 삭제할 수 있습니다.

## AWS CLI
<a name="rbac-delete-policy-CLI"></a>

다음 예시에서는 `delete-resource-policy` AWS CLI 명령을 사용하여 *MusicCollection*이라는 테이블에서 리소스 기반 정책을 제거합니다.

*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

```
aws dynamodb delete-resource-policy \
    --resource-arn arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection
```

## AWS Management Console
<a name="rbac-delete-policy-console"></a>

1. AWS Management Console에 로그인하고 DynamoDB 콘솔([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/))을 엽니다.

1. DynamoDB 콘솔 대시보드에서 **테이블**을 선택한 다음, 기존 테이블을 선택합니다.

1. **권한**을 선택합니다.

1. **정책 관리** 드롭다운에서 **정책 삭제**를 선택합니다.

1. **테이블에 대한 리소스 기반 정책 삭제** 대화 상자에서 **confirm**을 입력하여 삭제 작업을 확인합니다.

1. **삭제**를 선택합니다.

# DynamoDB에서 리소스 기반 정책을 사용하는 교차 계정 액세스
<a name="rbac-cross-account-access"></a>

리소스 기반 정책을 사용하여 서로 다른 AWS 계정에서 사용 가능한 리소스에 대한 크로스 계정 액세스 권한을 제공할 수 있습니다. 리소스 기반 정책에서 허용하는 모든 크로스 계정 액세스는 리소스와 동일한 AWS 리전에 분석기가 있는 경우 IAM Access Analyzer 외부 액세스 조사 결과를 통해 보고됩니다. IAM Access Analyzer는 정책 확인은 실행하여 IAM [정책 문법](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html) 및 [모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)에 대해 정책을 검증합니다. 이러한 확인은 결과를 생성하고 보안 모범 사례를 준수하고 작동하는 정책을 작성하는 데 도움이 되는 실행 가능한 권장 사항을 제공합니다. [DynamoDB 콘솔](https://console.aws.amazon.com/dynamodb/)의 **권한** 탭에서 IAM Access Analyzer의 활성 조사 결과를 볼 수 있습니다.

IAM Access Analyzer를 사용한 정책 검증에 대한 자세한 내용은 **IAM 사용 설명서의 [IAM Access Analyzer 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요. IAM Access Analyzer에서 반환된 경고, 오류 및 제안 사항 목록을 보려면 [IAM Access Analyzer 정책 확인 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-reference-policy-checks.html)를 참조하십시오.

계정 A의 사용자 A에게 계정 B의 테이블 B에 액세스할 수 있는 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 권한을 부여하려면 다음 단계를 수행하세요.

1. 사용자 A에게 `GetItem` 작업 수행 권한을 부여하는 리소스 기반 정책을 테이블 B에 연결합니다.

1. 사용자 A에게 테이블 B에 대한 `GetItem` 작업 수행 권한을 부여하는 자격 증명 기반 정책을 연결합니다.

[DynamoDB](https://console.aws.amazon.com/dynamodb/) 콘솔에서 제공되는 **외부 액세스 미리 보기** 옵션을 사용하여 새 정책이 리소스에 대한 퍼블릭 및 크로스 계정 액세스에 미치는 영향을 미리 볼 수 있습니다. 정책을 저장하기 전에 새로운 IAM Access Analyzer 검색 결과가 나오는지, 기존 결과가 해결되는지 여부를 확인할 수 있습니다. 활성 분석기가 표시되지 않으면 **Access Analyzer로 이동**을 선택하여 IAM Access Analyzer에서 [계정 분석기를 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-getting-started.html#access-analyzer-enabling)합니다. 자세한 내용은 [액세스 미리 보기](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-access-preview.html)를 잠조하세요

DynamoDB 데이터 영역 및 컨트롤 플레인 API의 테이블 이름 파라미터는 테이블의 완전한 Amazon 리소스 이름(ARN)을 수락하여 크로스 계정 작업을 지원합니다. 전체 ARN 대신 테이블 이름 파라미터만 제공하는 경우 요청자가 속한 계정의 테이블에서 API 작업이 수행됩니다. 크로스 계정 액세스 권한을 사용하는 정책 예시는 [크로스 게정 액세스에 대한 리소스 기반 정책](rbac-examples.md#rbac-examples-cross-account) 섹션을 참조하세요.

다른 계정의 보안 주체가 소유자 계정의 DynamoDB 테이블을 읽거나 해당 테이블에 데이터를 쓰는 경우에도 리소스 소유자 계정에 요금이 부과됩니다. 테이블에 프로비저닝된 처리량이 있는 경우 소유자 계정과 다른 계정의 요청자로부터 받은 모든 요청의 합계에 따라 요청의 제한(Auto Scaling이 비활성화된 경우) 또는 스케일 업/다운(Auto Scaling이 활성화된 경우) 여부가 결정됩니다.

요청은 소유자 및 요청자 계정 모두의 CloudTrail 로그에 로깅되므로 두 계정 각각은 어떤 계정이 어떤 데이터에 액세스했는지 추적할 수 있습니다.

## 교차 계정 AWS Lambda 함수를 사용하여 액세스 공유
<a name="rbac-analyze-cross-account-lambda-access"></a>

**계정 A의 Lambda 함수**

1. [IAM 콘솔](https://console.aws.amazon.com/iam/)로 이동하여 계정 A에서 AWS Lambda 함수의 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)로 사용할 IAM 역할을 생성합니다. 필요한 DynamoDB Streams 및 Lambda 간접 호출 권한이 포함된 관리형 IAM 정책 `AWSLambdaDynamoDBExecutionRole`을 추가합니다. 또한 이 정책은 계정 A에서 액세스할 수 있는 모든 잠재적 DynamoDB Streams 리소스에 대한 액세스 권한을 부여합니다.

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda/)에서 DynamoDB 스트림의 레코드를 처리하는 AWS Lambda 함수를 생성하고 실행 역할 설정 중에 이전 단계에서 생성한 역할을 선택합니다.

1. Lambda 함수 실행 역할을 DynamoDB Streams의 계정 B 소유자에게 제공하여 교차 계정 읽기 액세스를 위한 리소스 기반 정책을 구성합니다.

1. Lambda 함수 설정을 마칩니다.

**계정 B의 DynamoDB 스트림**

1. Lambda 함수를 간접적으로 호출할 계정 A의 교차 계정 Lambda 실행 역할을 가져옵니다.

1. 계정 B의 Amazon DynamoDB 콘솔에서 Lambda 교차 계정 트리거에 사용할 테이블을 선택합니다. **내보내기 및 스트림** 탭에서 DynamoDB 스트림 ARN을 찾습니다. DynamoDB 스트림 상태가 켜짐인지 확인하고 리소스 정책에 필요한 전체 스트림 ARN을 기록해 둡니다.

1. **권한** 탭에서 **스트림 정책 생성** 버튼을 클릭하여 시각적 정책 편집기를 시작합니다. **새 문 추가** 버튼을 클릭하거나, 정책이 이미 있는 경우 정책을 편집합니다.

1. 계정 A의 Lambda 실행 역할을 위탁자로 지정하는 정책을 생성하고 필요한 DynamoDB 스트림 작업을 부여합니다. `dynamodb:DescribeStream`, `dynamodb:GetRecords`, `dynamodb:GetShardIterator`, `dynamodb:ListShards` 작업도 포함해야 합니다. DynamoDB Streams의 리소스 정책 예에 대한 자세한 내용은 [ DynamoDB 리소스 기반 정책 예제](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-examples.html)를 참조하세요.

**참고**  
[컨트롤 플레인 API](HowItWorks.API.md#HowItWorks.API.ControlPlane)의 크로스 계정 액세스는 초당 트랜잭션 수(TPS) 한도가 500개로 더 낮습니다.

# DynamoDB의 리소스 기반 정책으로 퍼블릭 액세스 차단
<a name="rbac-bpa-rbp"></a>

[퍼블릭 액세스 차단(BPA)](#rbac-bpa-rbp)은 [Amazon Web Services(AWS)](https://aws.amazon.com/) 계정의 DynamoDB 테이블, 인덱스 또는 스트림에 대한 퍼블릭 액세스를 허용하는 리소스 기반 정책의 연결을 식별하고 이를 방지하는 기능입니다. BPA를 사용하면 DynamoDB 리소스에 대한 퍼블릭 액세스를 차단할 수 있습니다. BPA는 리소스 기반 정책을 만들거나 수정하는 동안 검사를 수행하며 DynamoDB의 보안 태세를 개선하는 데 도움이 됩니다.

BPA는 [자동 추론](https://aws.amazon.com/what-is/automated-reasoning/)을 사용하여 리소스 기반 정책에 의해 부여된 액세스를 분석하고 리소스 기반 정책을 관리할 때 해당 권한이 발견되면 알려줍니다. 분석을 통해 정책에 사용되는 모든 리소스 기반 정책 문, 작업 및 조건 키 집합에 대한 액세스를 확인합니다.

**중요**  
BPA는 테이블, 인덱스, 스트림과 같은 DynamoDB 리소스에 직접 연결된 리소스 기반 정책을 통해 퍼블릭 액세스가 허용되지 않도록 함으로써 리소스를 보호합니다. BPA를 사용하는 것 외에도 다음 정책을 주의 깊게 검토하여 퍼블릭 액세스를 허용하지 않는지 확인하세요.  
관련 AWS 보안 주체(예: IAM 역할)에 연결된 자격 증명 기반 정책
관련 AWS 리소스(예: AWS Key Management Service(KMS) 키)에 연결된 리소스 기반 정책

[보안 주체](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)에 `*` 항목이 포함되지 않도록 하거나 지정된 조건 키 중 하나가 보안 주체의 리소스 액세스를 제한하는지 확인해야 합니다. AWS 계정 전반에서 리소스 기반 정책이 테이블, 인덱스 또는 스트림에 대한 퍼블릭 액세스를 허용하는 경우 DynamoDB는 정책 내의 사양이 수정되어 퍼블릭이 아닌 것으로 간주될 때까지 정책을 생성하거나 수정하지 못하도록 차단합니다.

`Principal` 블록 내에 하나 이상의 보안 주체를 지정하여 정책을 퍼블릭이 아닌 상태로 만들 수 있습니다. 다음 리소스 기반 정책 예시는 두 개의 보안 주체를 지정하여 퍼블릭 액세스를 차단합니다.

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "123456789012",
      "111122223333"
    ]
  },
  "Action": "dynamodb:*",
  "Resource": "*"
}
```

특정 조건 키를 지정하여 액세스를 제한하는 정책도 퍼블릭으로 간주되지 않습니다. 리소스 기반 정책에 지정된 보안 주체 평가와 함께 다음과 같은 [신뢰할 수 있는 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 사용하여 퍼블릭이 아닌 액세스에 대한 리소스 기반 정책의 평가를 완료합니다.
+ `aws:PrincipalAccount`
+ `aws:PrincipalArn`
+ `aws:PrincipalOrgID`
+ `aws:PrincipalOrgPaths`
+ `aws:SourceAccount`
+ `aws:SourceArn`
+ `aws:SourceVpc`
+ `aws:SourceVpce`
+ `aws:UserId`
+ `aws:PrincipalServiceName`
+ `aws:PrincipalServiceNamesList`
+ `aws:PrincipalIsAWSService`
+ `aws:Ec2InstanceSourceVpc`
+ `aws:SourceOrgID`
+ `aws:SourceOrgPaths`

또한 리소스 기반 정책을 퍼블릭이 아닌 상태로 설정하려면 Amazon 리소스 이름(ARN) 및 문자열 키의 값에 와일드카드나 변수가 포함되어서는 안 됩니다. 리소스 기반 정책에서 `aws:PrincipalIsAWSService` 키를 사용하는 경우 키 값을 true로 설정했는지 확인해야 합니다.

다음 정책은 지정된 계정의 `John` 사용자에 액세스 권한을 제한합니다. 이 조건에 따라 `Principal`이 제한되며 퍼블릭으로 간주되지 않습니다.

```
{
  "Effect": "Allow",
  "Principal": {
    "AWS": "*"
  },
  "Action": "dynamodb:*",
  "Resource": "*",
  "Condition": {
    "StringEquals": {
      "aws:PrincipalArn": "arn:aws:iam::123456789012:user/John"
    }
  }
}
```

다음은 `StringEquals` 연산자를 사용하는 퍼블릭이 아닌 리소스 기반 정책 제약 `sourceVPC`의 예입니다. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "dynamodb:*",
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
      "Condition": {
        "StringEquals": {
          "aws:SourceVpc": [
            "vpc-91237329"
          ]
        }
      }
    }
  ]
}
```

------

# 리소스 기반 정책이 지원하는 DynamoDB API 작업
<a name="rbac-iam-actions"></a>

이 주제에서는 리소스 기반 정책이 지원하는 API 작업을 설명합니다. 그러나 크로스 계정 액세스의 경우 리소스 기반 정책을 통해 특정 DynamoDB API 집합만 사용할 수 있습니다. 리소스 기반 정책을 리소스 유형(예: 백업 및 가져오기)에 연결할 수 없습니다. 이러한 리소스 유형에서 작동하는 API와 부합하는 IAM 작업은 리소스 기반 정책에서 지원되는 IAM 작업에서 제외됩니다. 테이블 관리자가 동일한 계정 내에서 내부 테이블 설정을 구성하기 때문에 [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html) 및 [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html)과 같은 API는 리소스 기반 정책을 통한 크로스 계정 액세스를 지원하지 않습니다.

크로스 계정 액세스를 지원하는 DynamoDB 데이터 영역 및 컨트롤 플레인 API는 테이블 이름 오버로딩도 지원하므로 테이블 이름 대신 테이블 ARN을 지정할 수 있습니다. 이러한 API의 `TableName` 파라미터에 테이블 ARN을 지정할 수 있습니다. 하지만 이러한 API가 모두 크로스 계정 액세스를 지원하는 것은 아닙니다.

**Topics**
+ [데이터 영역 API 작업](#rbac-data-plane-actions)
+ [PartiQL API 작업](#rbac-partiql-actions)
+ [컨트롤 플레인 API 작업](#rbac-control-plane-actions)
+ [버전 2019.11.21(현재) 글로벌 테이블 API 작업](#rbac-current-global-table-actions)
+ [버전 2017.11.29(레거시) 글로벌 테이블 API 작업](#rbac-legacy-global-table-actions)
+ [태그 API 작업](#rbac-tags-actions)
+ [백업 및 복원 API 작업](#rbac-backup-restore-actions)
+ [연속 백업/복원(PITR) API 작업](#rbac-continuous-backup-restore-actions)
+ [Contributor Insights API 작업](#rbac-contributor-insights-actions)
+ [API 내보내기 작업](#rbac-export-actions)
+ [API 가져오기 작업](#rbac-import-actions)
+ [Amazon Kinesis Data Streams API 작업](#rbac-kinesis-actions)
+ [리소스 기반 정책 API 작업](#rbac-rbp-actions)
+ [TTL API 작업](#rbac-ttl-actions)
+ [기타 API 작업](#rbac-other-actions)
+ [DynamoDB Streams API 작업](#rbac-ds-actions)

## 데이터 영역 API 작업
<a name="rbac-data-plane-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [데이터 영역](HowItWorks.API.md#HowItWorks.API.DataPlane) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 데이터 영역 - 테이블/인덱스 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DeleteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html)   | 예 | 예 | 
|   [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)   | 예 | 예 | 
|   [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)   | 예 | 예 | 
|   [Query](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html)   | 예 | 예 | 
|   [스캔](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html)   | 예 | 예 | 
|   [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)   | 예 | 예 | 
|   [TransactGetItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html)   | 예 | 예 | 
|   [TransactWriteItems](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html)   | 예 | 예 | 
|   [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html)   | 예 | 예 | 
|   [BatchWriteItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html)   | 예 | 예 | 

## PartiQL API 작업
<a name="rbac-partiql-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [PartiQL](HowItWorks.API.md#HowItWorks.API.DataPlane.partiql) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| PartiQL API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [BatchExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchExecuteStatement.html)   | 예 | 아니요 | 
|   [ExecuteStatement](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteStatement.html)   | 예 | 아니요 | 
|   [ExecuteTransaction](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExecuteTransaction.html)   | 예 | 아니요 | 

## 컨트롤 플레인 API 작업
<a name="rbac-control-plane-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [컨트롤 플레인](HowItWorks.API.md#HowItWorks.API.ControlPlane) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 컨트롤 플레인 - 테이블 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)   | 아니요 | 아니요 | 
|   [DeleteTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html)   | 예 | 예 | 
|   [DescribeTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html)   | 예 | 예 | 
|   [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html)   | 예 | 예 | 

## 버전 2019.11.21(현재) 글로벌 테이블 API 작업
<a name="rbac-current-global-table-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [버전 2019.11.21(현재) 글로벌 테이블](GlobalTables.md) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 버전 2019.11.21(현재) 글로벌 테이블 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTableReplicaAutoScaling.html)   | 예 | 아니요 | 
|   [UpdateTableReplicaAutoScaling](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTableReplicaAutoScaling.html)   | 예 | 아니요 | 

## 버전 2017.11.29(레거시) 글로벌 테이블 API 작업
<a name="rbac-legacy-global-table-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [버전 2017.11.29(레거시) 글로벌 테이블](globaltables.V1.md) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 버전 2017.11.29(레거시) 글로벌 테이블 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [CreateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateGlobalTable.html)   | 아니요 | 아니요 | 
|   [DescribeGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTable.html)   | 아니요 | 아니요 | 
|   [DescribeGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeGlobalTableSettings.html)   | 아니요 | 아니요 | 
|   [ListGlobalTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListGlobalTables.html)   | 아니요 | 아니요 | 
|   [UpdateGlobalTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTable.html)   | 아니요 | 아니요 | 
|   [UpdateGlobalTableSettings](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateGlobalTableSettings.html)   | 아니요 | 아니요 | 

## 태그 API 작업
<a name="rbac-tags-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [태그](Tagging.Operations.md)와 관련하여 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 태그 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [ListTagsOfResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTagsOfResource.html)   | 예 | 예 | 
|   [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)   | 예 | 예 | 
|   [UntagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UntagResource.html)   | 예 | 예 | 

## 백업 및 복원 API 작업
<a name="rbac-backup-restore-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [백업 및 복원](Backup-and-Restore.md)과 관련하여 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 백업 및 복원 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [CreateBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateBackup.html)   | 예 | 아니요 | 
|   [DescribeBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeBackup.html)   | 아니요 | 아니요 | 
|   [DeleteBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteBackup.html)   | 아니요 | 아니요 | 
|  [RestoreTableFromBackup](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableFromBackup.html)  | 아니요 | 아니요 | 

## 연속 백업/복원(PITR) API 작업
<a name="rbac-continuous-backup-restore-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [연속 백업/복원(PITR)](Point-in-time-recovery.md)과 관련하여 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 연속 백업/복원(PITR) API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContinuousBackups.html)   | 예 | 아니요 | 
|   [RestoreTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_RestoreTableToPointInTime.html)   | 예 | 아니요 | 
|   [UpdateContinuousBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContinuousBackups.html)   | 예 | 아니요 | 

## Contributor Insights API 작업
<a name="rbac-contributor-insights-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 [연속 백업/복원(PITR)](Point-in-time-recovery.md)과 관련하여 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| Contributor Insights API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeContributorInsights.html)   | 예 | 아니요 | 
|   [ListContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListContributorInsights.html)   | 아니요 | 아니요 | 
|   [UpdateContributorInsights](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateContributorInsights.html)   | 예 | 아니요 | 

## API 내보내기 작업
<a name="rbac-export-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 API 내보내기 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| API 내보내기 | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeExport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeExport.html)   | 아니요 | 아니요 | 
|   [ExportTableToPointInTime](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExportTableToPointInTime.html)   | 예 | 아니요 | 
|   [ListExports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListExports.html)   | 아니요 | 아니요 | 

## API 가져오기 작업
<a name="rbac-import-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 API 가져오기 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| API 가져오기 | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeImport](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeImport.html)   | 아니요 | 아니요 | 
|   [ImportTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ImportTable.html)   | 아니요 | 아니요 | 
|   [ListImports](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListImports.html)   | 아니요 | 아니요 | 

## Amazon Kinesis Data Streams API 작업
<a name="rbac-kinesis-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 Kinesis Data Streams API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| Kinesis API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeKinesisStreamingDestination.html)   | 예 | 아니요 | 
|   [DisableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DisableKinesisStreamingDestination.html)   | 예 | 아니요 | 
|   [EnableKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_EnableKinesisStreamingDestination.html)   | 예 | 아니요 | 
|   [UpdateKinesisStreamingDestination](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateKinesisStreamingDestination.html)   | 예 | 아니요 | 

## 리소스 기반 정책 API 작업
<a name="rbac-rbp-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 리소스 기반 정책 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 리소스 기반 정책 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [GetResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetResourcePolicy.html)   | 예 | 아니요 | 
|   [PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html)   | 예 | 아니요 | 
|   [DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html)   | 예 | 아니요 | 

## TTL API 작업
<a name="rbac-ttl-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 TTL([Time-to-Live](TTL.md)) API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| TTL API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTimeToLive.html)   | 예 | 아니요 | 
|   [UpdateTimeToLive](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTimeToLive.html)   | 예 | 아니요 | 

## 기타 API 작업
<a name="rbac-other-actions"></a>

다음 표에는 리소스 기반 정책 및 크로스 계정 액세스에 대해 기타 API 작업에서 제공하는 API 수준 지원이 나와 있습니다.


| 기타 API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeLimits](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeLimits.html)   | 아니요 | 아니요 | 
|   [DescribeEndpoints](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html)   | 아니요 | 아니요 | 
|   [ListBackups](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListBackups.html)   | 아니요 | 아니요 | 
|   [ListTables](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ListTables.html)   | 아니요 | 아니요 | 

## DynamoDB Streams API 작업
<a name="rbac-ds-actions"></a>

다음 테이블에는 리소스 기반 정책 및 크로스 계정 액세스에 대한 DynamoDB Streams API의 API 수준 지원이 나열되어 있습니다.


| DynamoDB Streams API | 리소스 기반 정책 지원 | 크로스 계정 지원 | 
| --- | --- | --- | 
|   [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html)   | 예 | 예 | 
|   [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html)   | 예 | 예 | 
|   [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html)   | 예 | 예 | 
|   [ListStreams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_ListStreams.html)   | 아니요 | 아니요 | 

# IAM 자격 증명 기반 정책 및 DynamoDB 리소스 기반 정책을 사용한 권한 부여
<a name="rbac-auth-iam-id-based-policies-DDB"></a>

**자격 증명 기반 정책**은 IAM 사용자, 사용자 그룹, 역할과 같은 자격 증명에 연결됩니다. 이는 자격 증명이 수행할 수 있는 작업, 대상 리소스 및 이에 관한 조건을 제어하는 IAM 정책 문서입니다. 자격 증명 기반 정책은 [관리형](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html) 정책 또는 [인라인](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) 정책이 될 수 있습니다.

**리소스 기반 정책**은 DynamoDB 테이블과 같은 리소스에 연결하는 IAM 정책 문서입니다. 이 정책은 지정된 보안 주체에 해당 리소스에 대한 특정 작업을 수행할 수 있는 권한을 부여하고 이 권한이 적용되는 조건을 정의합니다. 예를 들어, DynamoDB 테이블의 리소스 기반 정책에는 테이블과 연결된 인덱스도 포함됩니다. 리소스 기반 정책은 인라인 정책입니다. 관리형 리소스 기반 정책은 없습니다.

이러한 정책의 차이점에 대한 자세한 내용은 **IAM 사용 설명서의 [자격 증명 기반 정책 및 리소스 기반 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html)을 참조하세요.

IAM 보안 주체가 리소스 소유자와 동일한 계정의 사용자인 경우 리소스 기반 정책만으로도 리소스에 대한 액세스 권한을 지정하기에 충분합니다. 여전히 리소스 기반 정책과 함께 IAM 자격 증명 기반 정책을 사용할 수도 있습니다. 크로스 계정 액세스의 경우 [DynamoDB에서 리소스 기반 정책을 사용하는 교차 계정 액세스](rbac-cross-account-access.md)에 지정된 대로 자격 증명 및 리소스 정책 모두에서 액세스를 명시적으로 허용해야 합니다. 두 정책 유형을 모두 사용하는 경우 정책은 [계정 내에서 요청 허용 여부 결정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)에 설명된 대로 평가됩니다.

**중요**  
자격 증명 기반 정책이 DynamoDB 테이블에 대한 무조건 액세스 권한을 부여하는 경우(예: 조건 없는 `dynamodb:GetItem`), `dynamodb:Attributes`의 조건으로 액세스를 허용하는 리소스 기반 정책은 해당 액세스를 제한하지 않습니다. 자격 증명 기반 정책의 무조건적 허용이 우선하며 리소스 기반 정책의 조건은 제한으로 적용되지 않습니다. 특정 속성에 대한 액세스를 제한하려면 리소스 기반 정책의 조건적 `Allow` 문에만 의존하는 대신 명시적 `Deny` 문을 사용합니다.

# DynamoDB 리소스 기반 정책 예제
<a name="rbac-examples"></a>

리소스 기반 정책의 `Resource` 필드에 ARN을 지정하는 경우, 지정된 ARN이 연결된 DynamoDB 리소스의 ARN과 일치하는 경우에만 정책이 적용됩니다.

**참고**  
*기울임꼴* 텍스트를 리소스별 정보로 바꿔야 합니다.

## 테이블에 대한 리소스 기반 정책
<a name="rbac-examples-get"></a>

*MusicCollection*이라는 DynamoDB 테이블에 연결된 다음 리소스 기반 정책은 IAM 사용자 *John*과 *Jane*에게 *MusicCollection* 리소스에서 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) 및 [BatchGetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html) 작업을 수행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::111122223333:user/username",
            "arn:aws:iam::111122223333:user/Jane"
          ]
        },
        "Action": [
          "dynamodb:GetItem",
          "dynamodb:BatchGetItem"
        ],
        "Resource": [
          "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
        ]
    }
  ]
}
```

------

## 스트림에 대한 리소스 기반 정책
<a name="rbac-examples-streams"></a>

`2024-02-12T18:57:26.492`라는 DynamoDB 스트림에 연결된 다음 리소스 기반 정책은 IAM 사용자 *John*과 *Jane*에게 `2024-02-12T18:57:26.492` 리소스에서 [GetRecords](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetRecords.html), [GetShardIterator](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_GetShardIterator.html), [DescribeStream](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_streams_DescribeStream.html) API 작업을 수행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:user/username",
          "arn:aws:iam::111122223333:user/Jane"
        ]
      },
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords",
        "dynamodb:GetShardIterator"
      ],
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/stream/2024-02-12T18:57:26.492"
      ]
    }
  ]
}
```

------

## 지정된 리소스에서 모든 작업을 수행할 수 있는 액세스에 대한 리소스 기반 정책
<a name="rbac-examples-wildcard"></a>

사용자가 테이블 및 테이블과 관련된 모든 인덱스에 대한 모든 작업을 수행할 수 있도록 하려면 와일드카드(\$1)를 사용하여 테이블과 관련된 작업 및 리소스를 나타낼 수 있습니다. 리소스에 와일드카드 문자를 사용하면 사용자가 DynamoDB 테이블 및 아직 생성되지 않은 인덱스를 비롯한 모든 관련 인덱스에 액세스할 수 있습니다. 예를 들어, 다음 정책은 사용자 *John*에게 *MusicCollection* 테이블 및 향후 생성될 인덱스를 포함한 모든 인덱스에서 모든 작업을 수행할 수 있는 권한을 부여합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:user/role-name"
      },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/index/index-name"
      ]
    }
  ]
}
```

------

## 크로스 게정 액세스에 대한 리소스 기반 정책
<a name="rbac-examples-cross-account"></a>

크로스 계정 IAM 자격 증명에 DynamoDB 리소스에 대한 액세스 권한을 지정할 수 있습니다. 예를 들어 신뢰할 수 있는 계정의 사용자가 테이블의 콘텐츠를 읽는 액세스 권한을 얻어야 할 수 있습니다. 단, 해당 사용자는 해당 항목의 특정 항목과 특정 속성에만 액세스해야 합니다. 다음 정책은 신뢰할 수 있는 AWS 계정 ID *111111111111*에서 사용자 *John*이 [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html) API를 사용하여 계정 *123456789012*에 있는 테이블의 데이터에 액세스할 수 있도록 허용합니다. 이 정책은 사용자가 프라이머리 키 *Jane*이 있는 항목에만 액세스할 수 있으며 속성 `Artist` 및 `SongTitle`만 검색할 수 있도록 하고 다른 속성은 검색할 수 없도록 합니다.

**중요**  
`SPECIFIC_ATTRIBUTES` 조건을 지정하지 않으면 반환된 항목의 모든 속성을 볼 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountTablePolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:user/John"
            },
            "Action": "dynamodb:GetItem",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

이전 리소스 기반 정책 외에도 사용자 *John*에게 연결된 자격 증명 기반 정책도 `GetItem` API 작업을 허용해야 크로스 계정 액세스가 가능합니다. 다음은 사용자 *John*에게 연결해야 하는 자격 증명 기반 정책 예시입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "CrossAccountIdentityBasedPolicy",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection"
            ],
            "Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": "Jane",
                    "dynamodb:Attributes": [
                        "Artist",
                        "SongTitle"
                    ]
                },
                "StringEquals": {
                    "dynamodb:Select": "SPECIFIC_ATTRIBUTES"
                }
            }
        }
    ]
}
```

------

사용자 John은 `table-name` 파라미터에 테이블 ARN을 지정하여 계정 *123456789012*의 *MusicCollection* 테이블에 액세스하기 위한 `GetItem` 요청을 수행할 수 있습니다.

```
aws dynamodb get-item \
    --table-name arn:aws:dynamodb:us-west-2:123456789012:table/MusicCollection \
    --key '{"Artist": {"S": "Jane"}' \
    --projection-expression 'Artist, SongTitle' \
    --return-consumed-capacity TOTAL
```

## IP 주소 조건이 포함된 리소스 기반 정책
<a name="rbac-examples-conditions"></a>

조건을 적용하여 소스 IP 주소, Virtual Private Cloud(VPC) 및 VPC 엔드포인트(VPCE)를 제한할 수 있습니다. 원래 요청의 소스 주소를 기반으로 권한을 지정할 수 있습니다. 예를 들어, 사용자가 기업 VPN 엔드포인트와 같은 특정 IP 소스에서 액세스하는 경우에만 DynamoDB 리소스에 액세스하도록 허용하고 싶을 수 있습니다. `Condition` 문에 이러한 IP 주소를 지정하세요.

다음 예시에서는 소스 IP가 `54.240.143.0/24` 및 `2001:DB8:1234:5678::/64`일 때 사용자 *John*이 모든 DynamoDB 리소스에 액세스할 수 있도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId2",
  "Version":"2012-10-17",		 	 	 
  "Statement":[
    {
      "Sid":"AllowIPmix",
      "Effect":"Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:user/username"
      },
      "Action":"dynamodb:*",
      "Resource":"*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "54.240.143.0/24",
            "2001:DB8:1234:5678::/64"
          ]
        }
      }
    }
  ]
}
```

------

소스가 특정 VPC 엔드포인트(예: *vpce-1a2b3c4d*)인 경우를 제외하고 DynamoDB 리소스에 대한 모든 액세스를 거부할 수도 있습니다.

**중요**  
IPv6 전용 환경에서 IP 기반 리소스 정책이 있는 DynamoDB 테이블과 함께 DAX를 사용하는 경우 추가 액세스 규칙을 구성해야 합니다. 리소스 정책이 테이블의 IPv4 주소 공간 `0.0.0.0/0`에 대한 액세스를 제한하는 경우 DAX 클러스터와 연결된 IAM 역할에 대한 액세스를 허용해야 합니다. 정책에 `ArnNotEquals` 조건을 추가하여 DAX가 DynamoDB 테이블에 대한 액세스를 유지하도록 합니다. 자세한 내용은 [DAX 및 IPv6](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.create-cluster.DAX_and_IPV6.html)를 참조하세요.

------
#### [ JSON ]

****  

```
{
  "Id":"PolicyId",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToSpecificVPCEOnly",
      "Principal": "*",
      "Action": "dynamodb:*",
      "Effect": "Deny",
      "Resource": "*",
      "Condition": {
        "StringNotEquals":{
          "aws:sourceVpce":"vpce-1a2b3c4d"
        }
      }
    }
  ]
}
```

------

## IAM 역할이 지정된 리소스 기반 정책
<a name="rbac-examples-iam"></a>

리소스 기반 정책에서 IAM 서비스 역할을 지정할 수도 있습니다. 이 역할을 수임하는 IAM 엔터티는 해당 역할에 지정된 허용 작업 및 리소스 기반 정책 내의 특정 리소스 세트로만 제한됩니다.

다음 예시는 IAM 엔터티가 *MusicCollection* 및 *MusicCollection* DynamoDB 리소스에서 모든 DynamoDB 작업을 수행할 수 있도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "1111",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/role-name" },
      "Action": "dynamodb:*",
      "Resource": [
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection",
        "arn:aws:dynamodb:us-east-1:123456789012:table/MusicCollection/*"
      ]
    }
  ]
}
```

------

# DynamoDB 리소스 기반 정책 고려 사항
<a name="rbac-considerations"></a>

DynamoDB 리소스의 리소스 기반 정책을 정의할 때는 다음 사항을 고려해야 합니다.

**일반적인 고려 사항**
+ 리소스 기반 정책 문서에 지원되는 최대 크기는 20KB입니다. DynamoDB는 이 한도를 기준으로 정책의 크기를 계산할 때 공백을 계산합니다.
+ 주어진 리소스에 대한 정책의 후속 업데이트는 동일한 리소스에 대한 정책이 성공적으로 업데이트된 후 15초 동안 차단됩니다.
+ 현재는 기존 스트림에만 리소스 기반 정책을 연결할 수 있습니다. 스트림을 생성하는 동안에는 정책을 스트림에 연결할 수 없습니다.

**글로벌 테이블 고려 사항**
+ 리소스 기반 정책은 [글로벌 테이블 버전 2017.11.29(레거시)](globaltables_HowItWorks.md) 복제본에 지원되지 않습니다.
+ 리소스 기반 정책 내에서 글로벌 테이블의 데이터를 복제하기 위한 DynamoDB 서비스 연결 역할(SLR)에 대한 작업이 거부되면 복제본 추가 또는 삭제가 실패하고 오류가 발생합니다.
+ [AWS::DynamoDB::GlobalTable](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-globaltable.html) 리소스는 스택 업데이트를 배포하는 리전 이외의 리전에서 동일한 스택 업데이트에서 복제본을 생성하고 해당 복제본에 리소스 기반 정책을 추가하는 것을 지원하지 않습니다.

**크로스 계정 고려 사항**
+ 리소스 기반 정책을 사용하는 크로스 계정 액세스는 AWS 관리형 KMS 정책에 크로스 계정 액세스 권한을 부여할 수 없기 때문에 AWS 관리형 키를 사용한 암호화된 테이블을 지원하지 않습니다.

**CloudFormation 고려 사항**
+ 리소스 기반 정책은 [드리프트 감지](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html#)를 지원하지 않습니다. AWS CloudFormation 스택 템플릿 외부에서 리소스 기반 정책을 업데이트하는 경우 CloudFormation 스택에 변경 사항을 업데이트해야 합니다.
+ 리소스 기반 정책은 대역 외 변경을 지원하지 않습니다. CloudFormation 템플릿 외부에서 정책을 추가, 업데이트 또는 삭제하는 경우 템플릿 내에 정책이 변경되지 않으면 변경 내용을 덮어쓰지 않습니다.

  예를 들어 템플릿에 리소스 기반 정책이 포함되어 있으며 나중에 템플릿 외부에서 업데이트한다고 가정해 보겠습니다. 템플릿 내에서 정책을 변경하지 않으면 DynamoDB의 업데이트된 정책이 템플릿 내의 정책과 동기화되지 않습니다.

  반대로 템플릿에 리소스 기반 정책이 포함되어 있지 않지만 템플릿 외부에서 정책을 추가한다고 가정해 보겠습니다. 이 정책은 템플릿에 추가하지 않는 한 DynamoDB에서 제거되지 않습니다. 템플릿에 정책을 추가하고 스택을 업데이트하면 DynamoDB의 기존 정책이 템플릿에 정의된 것과 일치하도록 업데이트됩니다.

# DynamoDB 리소스 기반 정책 모범 사례
<a name="rbac-best-practices"></a>

이 주제에서는 DynamoDB 리소스에 대한 액세스 권한을 정의하는 모범 사례와 이러한 리소스에 허용되는 작업을 설명합니다.

## DynamoDB 리소스에 대한 액세스 제어 간소화
<a name="rbac-simplify-access-control"></a>

DynamoDB 리소스에 액세스해야 하는 AWS Identity and Access Management 보안 주체가 리소스 소유자와 동일한 AWS 계정에 속한 경우 각 보안 주체에 대해 IAM 자격 증명 기반 정책이 필요하지 않습니다. 주어진 리소스에 연결된 리소스 기반 정책이면 충분합니다. 이러한 유형의 구성은 액세스 제어를 간소화합니다.

## 리소스 기반 정책으로 DynamoDB 리소스 보호
<a name="rbac-protect"></a>

 모든 DynamoDB 테이블 및 스트림에 대해 리소스 기반 정책을 생성하여 이러한 리소스에 대한 액세스 제어를 적용합니다. 리소스 기반 정책을 사용하면 리소스 수준에서 권한을 중앙 집중화하고, DynamoDB 테이블, 인덱스 및 스트림에 대한 액세스 제어를 간소화하고, 관리 오버헤드를 줄일 수 있습니다. 테이블이나 스트림에 리소스 기반 정책이 지정되지 않은 경우, IAM 보안 주체와 연결된 자격 증명 기반 정책에서 액세스를 허용하지 않는 한 테이블 또는 스트림에 대한 액세스는 암시적으로 거부됩니다.

## 최소 권한 적용
<a name="rbac-least-privilege"></a>

DynamoDB 리소스에 대한 리소스 기반 정책과 함께 권한을 설정하는 경우 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 최소 권한으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. 워크로드 또는 사용 사례에 필요한 권한을 탐색하는 동안 광범위한 권한으로 시작할 수 있습니다. 사용 사례가 발전함에 따라 최소 권한을 향해 나아가도록 부여하는 권한을 줄이기 위해 노력할 수 있습니다.

## 최소 권한 정책을 생성하기 위해 크로스 계정 액세스 활동 분석
<a name="rbac-analyze-cross-account-access"></a>

IAM Access Analyzer는 리소스 기반 정책에 지정된 외부 엔터티에 대한 크로스 계정 액세스를 보고하고, 권한을 세분화하고 최소 권한을 준수하는 데 도움이 되는 가시성을 제공합니다. 정책 생성에 대한 자세한 내용은 [IAM Access Analyzer 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-generation.html)을 참조하세요.

## IAM Access Analyzer를 사용하여 최소 권한 정책 생성
<a name="rbac-iam-access-analyzer"></a>

작업을 수행하는 데 필요한 권한만 부여하기 위해 AWS CloudTrail에 로깅된 액세스 활동에 따라 정책을 생성할 수 있습니다. IAM Access Analyzer는 정책에서 사용하는 서비스와 작업을 분석합니다.

# DynamoDB의 속성 기반 액세스 제어 사용
<a name="attribute-based-access-control"></a>

[속성 기반 액세스 제어(ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)는 ID 기반 정책 또는 기타 AWS 정책(예: 리소스 기반 정책 및 조직 IAM 정책)의 [태그 조건](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)을 기반으로 액세스 권한을 정의하는 권한 부여 전략입니다. DynamoDB 테이블에 태그를 연결하면 태그 기반 조건을 기준으로 평가됩니다. 테이블과 연결된 인덱스는 테이블에 추가하는 태그를 상속합니다. 각 DynamoDB 테이블에 최대 50개의 태그를 추가할 수 있습니다. 테이블의 모든 태그에 지원되는 최대 크기는 10KB입니다. DynamoDB 리소스 태그 지정 및 태그 지정 제한에 대한 자세한 내용은 [DynamoDB에서 리소스 태그 지정](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html) 및 [DynamoDB의 태그 지정 제한 사항](Tagging.md#TaggingRestrictions) 섹션을 참조하세요.

태그를 사용한 AWS 리소스에 대한 액세스 제어에 대한 자세한 내용은 IAM 사용 설명서의 다음 항목을 참조하세요.
+ [용 ABAC란 무엇인가요?AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [태그를 사용한 AWS 리소스 액세스 제어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

ABAC를 사용하면 팀과 애플리케이션에 서로 다른 액세스 수준을 적용하여 더 적은 수의 정책으로 DynamoDB 테이블에 작업을 수행할 수 있습니다. IAM 정책 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에서 태그를 지정하여 DynamoDB 테이블 또는 인덱스에 대한 액세스를 제어할 수 있습니다. 이러한 조건은 DynamoDB 테이블 및 인덱스에 대해 IAM 위탁자, 사용자 또는 역할이 가진 액세스 수준을 결정합니다. IAM 위탁자가 DynamoDB에 액세스 요청을 하면 리소스 및 ID의 태그가 IAM 정책의 태그 조건을 기준으로 평가됩니다. 그 이후에는 태그 조건이 충족되는 경우에만 정책이 적용됩니다. 이렇게 하면 다음 중 하나를 효과적으로 설명하는 IAM 정책을 만들 수 있습니다.
+ *사용자가 키가 `X`, 값이 `Y`인 태그가 있는 리소스만 관리하도록 허용합니다*.
+ * 키로 태그가 지정된 리소스에 대한 모든 사용자의 액세스를 거부합니다.`X`*

예를 들어 사용자가 태그 키-값 페어 `"environment": "staging"`이 있는 테이블만 업데이트하도록 허용하는 정책을 생성할 수 있습니다. [aws:ResourceTag](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 조건 키를 사용하여 해당 테이블에 연결된 태그를 기반으로 테이블에 대한 액세스를 허용하거나 거부할 수 있습니다.

AWS Management Console, AWS API, AWS Command Line Interface(AWS CLI), AWS SDK 또는 AWS CloudFormation을 사용하여 정책을 만드는 동안 속성 기반 조건을 포함할 수 있습니다.

다음 예제에서는 `MusicTable`이라는 테이블에 이름이 `environment`, 값이 `production`인 태그 키가 포함된 경우 [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html) 작업을 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "dynamodb:UpdateItem"
      ],
      "Resource": "arn:aws:dynamodb:*:*:table/MusicTable",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/environment": "production"
        }
      }
    }
  ]
}
```

------

**Topics**
+ [ABAC를 사용해야 하는 이유는 무엇입니까?](#why-use-abac)
+ [DynamoDB와 함께 ABAC를 구현하기 위한 조건 키](#condition-keys-implement-abac)
+ [DynamoDB와 함께 ABAC를 사용할 때의 고려 사항](#abac-considerations)
+ [DynamoDB에서 ABAC 활성화](abac-enable-ddb.md)
+ [DynamoDB 테이블 및 인덱스와 함께 ABAC 사용](abac-implementation-ddb-tables.md)
+ [DynamoDB 테이블 및 인덱스와 함께 ABAC를 사용하는 예제](abac-example-use-cases.md)
+ [DynamoDB 테이블 및 인덱스의 일반적인 ABAC 오류 해결](abac-troubleshooting.md)

## ABAC를 사용해야 하는 이유는 무엇입니까?
<a name="why-use-abac"></a>
+ **더 간단한 정책 관리:** 각 IAM 위탁자에 대한 액세스 수준을 정의하기 위해 서로 다른 정책을 만들 필요가 없으므로 더 적은 수의 정책을 사용합니다.
+ **규모 조정 가능한 액세스 제어:** ABAC를 사용하면 새 DynamoDB 리소스를 만들 때 정책을 업데이트할 필요가 없으므로 액세스 제어 규모 조정이 더 쉬워집니다. 태그를 사용하여 리소스 태그와 일치하는 태그가 포함된 IAM 위탁자에 대한 액세스를 승인할 수 있습니다. 새 IAM 위탁자 또는 DynamoDB 리소스를 온보딩하고 적절한 태그를 적용하여 정책을 변경할 필요 없이 필요한 권한을 자동으로 부여할 수 있습니다.
+ **세분화된 권한 관리:** 정책을 만들 때 [최소 권한을 부여](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)하는 것이 가장 좋습니다. ABAC를 사용하면 IAM 위탁자용 태그를 만들고 이를 사용하여 IAM 위탁자의 태그와 일치하는 특정 작업 및 리소스에 대한 액세스를 부여할 수 있습니다.
+ **회사 디렉터리와 맞춤:** 태그를 회사 디렉터리의 기존 직원 속성과 매핑하여 액세스 제어 정책을 조직 구조에 맞출 수 있습니다.

## DynamoDB와 함께 ABAC를 구현하기 위한 조건 키
<a name="condition-keys-implement-abac"></a>

AWS 정책에서 다음 조건 키를 사용하여 DynamoDB 테이블 및 인덱스에 대한 액세스 수준을 제어할 수 있습니다.
+ [aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag): DynamoDB 테이블 또는 인덱스의 태그 키-값 페어가 정책의 태그 키 및 값과 일치하는지 여부에 따라 액세스를 제어합니다. 이 조건 키는 기존 테이블 또는 인덱스에서 작동하는 모든 API와 관련이 있습니다.

  `dynamodb:ResourceTag` 조건은 리소스에 태그를 연결하지 않은 것처럼 평가됩니다.
+ [aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag): 요청에서 전달된 태그 키-값 페어를 정책에서 지정한 태그 페어와 비교하도록 허용합니다. 이 조건 키는 요청 페이로드의 일부로 태그가 포함된 API와 관련이 있습니다. 이러한 API에는 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) 및 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)가 포함됩니다.
+ [aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys): 요청의 태그 키를 정책에서 지정한 키와 비교합니다. 이 조건 키는 요청 페이로드의 일부로 태그가 포함된 API와 관련이 있습니다. 해당 API에는 `CreateTable`, `TagResource` 및 `UntagResource`가 포함됩니다.

## DynamoDB와 함께 ABAC를 사용할 때의 고려 사항
<a name="abac-considerations"></a>

ABAC를 DynamoDB 테이블 또는 인덱스와 함께 사용하는 경우 다음 고려 사항이 적용됩니다.
+ DynamoDB 스트림에는 태그 지정 및 ABAC가 지원되지 않습니다.
+ DynamoDB 백업에는 태그 지정 및 ABAC가 지원되지 않습니다. 백업과 함께 ABAC를 사용하려면 [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)을 사용하는 것이 좋습니다.
+ 태그는 복원된 테이블에 보존되지 않습니다. 정책에서 태그 기반 조건을 사용하려면 복원된 테이블에 태그를 추가해야 합니다.

# DynamoDB에서 ABAC 활성화
<a name="abac-enable-ddb"></a>

대부분의 AWS 계정에서는 ABAC가 기본적으로 활성화됩니다. [DynamoDB 콘솔](https://console.aws.amazon.com/dynamodb/)을 사용하여 계정에 ABAC가 활성화되어 있는지 확인할 수 있습니다. 이렇게 하려면 [dynamodb:GetAbacStatus](#required-permissions-abac) 권한이 있는 역할로 DynamoDB 콘솔을 열어야 합니다. 그런 다음 DynamoDB 콘솔의 **설정** 페이지를 엽니다.

**속성 기반 액세스 제어** 카드가 표시되지 않거나 카드에 **켜짐** 상태가 표시되면 계정에 ABAC가 활성화되었음을 의미합니다. 그러나 다음 이미지와 같이 **꺼짐** 상태의 **속성 기반 액세스 제어** 카드가 표시되면 계정에 ABAC가 활성화되지 않은 것입니다.

## 속성 기반 액세스 제어 - 활성화되지 않음
<a name="abac-disabled-image"></a>

![\[속성 기반 액세스 제어 카드를 보여주는 DynamoDB 콘솔의 설정 페이지.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


ID 기반 정책 또는 기타 정책에 지정된 태그 기반 조건을 여전히 감사해야 하는 AWS 계정에는 ABAC가 활성화되지 않습니다. 계정에 ABAC가 활성화되지 않은 경우 DynamoDB 테이블 또는 인덱스에 적용되도록 의도된 정책의 태그 기반 조건은 리소스 또는 API 요청에 태그가 없는 것처럼 평가됩니다. 계정에 ABAC가 활성화되면 테이블 또는 API 요청에 연결된 태그를 고려하여 계정 정책의 태그 기반 조건이 평가됩니다.

계정에 ABAC를 활성화하려면 먼저 [감사 정책](#policy-audit-for-abac) 섹션에 설명된 대로 정책을 감사하는 것이 좋습니다. 그런 다음 IAM 정책에 [ABAC에 필요한 권한](#required-permissions-abac)을 포함합니다. 마지막으로 [콘솔에서 ABAC 활성화](#abac-enable-console)에 설명된 단계를 수행하여 현재 리전의 계정에 ABAC를 활성화합니다. ABAC를 활성화하여 옵트인한 후 7일 이내에 옵트아웃할 수 있습니다.

**Topics**
+ [ABAC를 활성화하기 전에 정책 감사](#policy-audit-for-abac)
+ [ABAC를 활성화하는 데 필요한 IAM 권한](#required-permissions-abac)
+ [콘솔에서 ABAC 활성화](#abac-enable-console)

## ABAC를 활성화하기 전에 정책 감사
<a name="policy-audit-for-abac"></a>

계정에 ABAC를 활성화하기 전에 정책을 감사하여 계정 내 정책에 존재할 수 있는 태그 기반 조건이 의도한 대로 설정되었는지 확인합니다. 정책을 감사하면 ABAC를 활성화한 후 DynamoDB 워크플로의 권한 부여 변경으로 인한 예상치 못한 상황을 방지할 수 있습니다. 태그와 함께 속성 기반 조건을 사용하는 예제와 ABAC 구현 전후의 동작을 보려면 [DynamoDB 테이블 및 인덱스와 함께 ABAC를 사용하는 예제사용 사례 예제](abac-example-use-cases.md) 섹션을 참조하세요.

## ABAC를 활성화하는 데 필요한 IAM 권한
<a name="required-permissions-abac"></a>

현재 리전의 계정에 ABAC를 활성화하려면 `dynamodb:UpdateAbacStatus` 권한이 필요합니다. 계정에 ABAC가 활성화되어 있는지 확인하려면 `dynamodb:GetAbacStatus` 권한도 있어야 합니다. 이 권한을 사용하면 모든 리전의 계정에 대한 ABAC 상태를 볼 수 있습니다. 이러한 권한은 DynamoDB 콘솔에 액세스하는 데 필요한 권한에 더해 필요합니다.

다음 IAM 정책은 ABAC를 활성화하고 현재 리전의 계정에 대한 상태를 볼 수 있는 권한을 부여합니다.

```
{
"version": "2012-10-17", 		 	 	 &TCX5-2025-waiver;
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:UpdateAbacStatus",
                "dynamodb:GetAbacStatus"
             ],
            "Resource": "*"
        }
    ]
}
```

## 콘솔에서 ABAC 활성화
<a name="abac-enable-console"></a>

1. AWS Management Console에 로그인하고 DynamoDB 콘솔([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/))을 엽니다.

1. 상단 탐색 창에서 ABAC를 활성화할 리전을 선택합니다.

1. 왼쪽 탐색 창에서 **설정**을 선택합니다.

1. **설정** 페이지에서 다음 작업을 수행합니다.

   1. **속성 기반 액세스 제어** 카드에서 **활성화**를 선택합니다.

   1. **속성 기반 액세스 제어 설정 확인** 상자에서 **활성화**를 선택하여 선택을 확인합니다.

      이렇게 하면 현재 리전에 대한 ABAC가 활성화되고 **속성 기반 액세스 제어** 카드에 **켜짐** 상태가 표시됩니다.

      콘솔에서 ABAC를 활성화한 후 옵트아웃하려면 옵트인 후 7일 이내에 옵트아웃할 수 있습니다. 옵트아웃하려면 **설정** 페이지의 **속성 기반 액세스 제어** 카드에서 **비활성화**를 선택합니다.
**참고**  
ABAC의 상태를 업데이트하는 것은 비동기 작업입니다. 변경 사항 적용은 최종적으로 일관되므로 정책의 태그가 즉시 평가되지 않으면 얼마 동안 기다려야 할 수 있습니다.

# DynamoDB 테이블 및 인덱스와 함께 ABAC 사용
<a name="abac-implementation-ddb-tables"></a>

다음 단계에서는 ABAC를 사용하여 권한을 설정하는 방법을 보여줍니다. 이 예제 시나리오에서는 DynamoDB 테이블에 태그를 추가하고 태그 기반 조건을 포함하는 정책을 사용하여 IAM 역할을 생성합니다. 그런 다음 태그 조건을 일치시켜 DynamoDB 테이블에서 허용되는 권한을 테스트합니다.

**Topics**
+ [1단계: DynamoDB 테이블에 태그 추가](#abac-add-table-tags)
+ [2단계: 태그 기반 조건을 포함한 정책을 사용하여 IAM 역할 생성](#abac-create-iam-role)
+ [3단계: 허용된 권한 테스트](#abac-test-permissions)

## 1단계: DynamoDB 테이블에 태그 추가
<a name="abac-add-table-tags"></a>

AWS Management Console, AWS API, AWS Command Line Interface(AWS CLI), AWS SDK 또는 AWS CloudFormation을 사용하여 새 DynamoDB 테이블 또는 기존 DynamoDB 테이블에 태그를 추가할 수 있습니다. 예를 들어 다음 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) CLI 명령은 `MusicTable`이라는 테이블에 태그를 추가합니다.

```
aws dynamodb tag-resource —resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/MusicTable —tags Key=environment,Value=staging
```

## 2단계: 태그 기반 조건을 포함한 정책을 사용하여 IAM 역할 생성
<a name="abac-create-iam-role"></a>

[aws:ResourceTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) 조건 키로 [IAM 정책을 만들어](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) IAM 정책에 지정된 태그 키-값 페어를 테이블에 연결된 키-값 페어와 비교합니다. 다음 예제 정책은 사용자가 테이블에 태그 키-값 페어 `"environment": "staging"`이 포함된 경우 테이블에 항목을 입력하거나 업데이트할 수 있도록 허용합니다. 테이블에 지정된 태그 키-값 페어가 없는 경우 이러한 작업은 거부됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "staging"
                }
            }
        }
    ]
}
```

------

## 3단계: 허용된 권한 테스트
<a name="abac-test-permissions"></a>

1. AWS 계정의 테스트 사용자 또는 역할에 IAM 정책을 연결합니다. 사용하는 IAM 위탁자가 다른 정책을 통해 DynamoDB 테이블에 이미 액세스할 수 없는지 확인합니다.

1. DynamoDB 테이블에 값이 `"staging"`인 `"environment"` 태그 키가 포함되어 있는지 확인합니다.

1. 태그가 지정된 테이블에서 `dynamodb:PutItem` 및 `dynamodb:UpdateItem` 작업을 수행합니다. `"environment": "staging"` 태그 키-값 페어가 있는 경우 이러한 작업이 성공합니다.

   `"environment": "staging"` 태그 키-값 페어가 없는 테이블에서 이러한 작업을 수행하면 `AccessDeniedException`과 함께 요청이 실패합니다.

다음 섹션에 설명된 다른 [샘플 사용 사례](abac-example-use-cases.md)를 검토하여 ABAC를 구현하고 추가 테스트를 수행할 수도 있습니다.

# DynamoDB 테이블 및 인덱스와 함께 ABAC를 사용하는 예제
<a name="abac-example-use-cases"></a>

다음 예제에서는 태그를 사용하여 속성 기반 조건을 구현하는 몇 가지 사용 사례를 보여줍니다.

**Topics**
+ [예제 1: aws:ResourceTag를 사용하여 작업 허용](#abac-allow-example-resource-tag)
+ [예제 2: aws:RequestTag를 사용하여 작업 허용](#abac-allow-example-request-tag)
+ [예제 3: aws:TagKeys를 사용하여 작업 거부](#abac-deny-example-tag-key)

## 예제 1: aws:ResourceTag를 사용하여 작업 허용
<a name="abac-allow-example-resource-tag"></a>

`aws:ResourceTag/tag-key` 조건 키를 사용하여 IAM 정책에 지정된 태그 키-값 페어를 DynamoDB 테이블에 연결된 키-값 페어와 비교할 수 있습니다. 예를 들어 IAM 정책 및 테이블의 태그 조건이 일치하는 경우 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)과 같은 특정 작업을 허용할 수 있습니다. 이렇게 하려면 다음 단계를 수행하세요.

------
#### [ Using the AWS CLI ]

1. 테이블 만들기. 다음 예제에서는 [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) AWS CLI 명령을 사용하여 `myMusicTable`이라는 테이블을 생성합니다.

   ```
   aws dynamodb create-table \
     --table-name myMusicTable \
     --attribute-definitions AttributeName=id,AttributeType=S \
     --key-schema AttributeName=id,KeyType=HASH \
     --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
     --region us-east-1
   ```

1. 이 테이블에 태그를 추가합니다. 다음 [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) AWS CLI 명령 예제는 태그 키-값 페어 `Title: ProductManager`를 `myMusicTable`에 추가합니다.

   ```
   aws dynamodb tag-resource --region us-east-1 --resource-arn arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable --tags Key=Title,Value=ProductManager
   ```

1. 다음 예제와 같이 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)을 만들고 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 관리형 정책이 연결된 역할에 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   이 정책은 테이블에 연결된 태그 키와 값이 정책에 지정된 태그와 일치할 때 테이블에 대한 `PutItem` 작업을 허용합니다.

1. 3단계에 설명된 정책으로 역할을 수임합니다.

1. [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) AWS CLI 명령을 사용하여 항목을 `myMusicTable`에 입력합니다.

   ```
   aws dynamodb put-item \
       --table-name myMusicTable --region us-east-1 \
       --item '{
           "id": {"S": "2023"},
           "title": {"S": "Happy Day"},
           "info": {"M": {
               "rating": {"N": "9"},
               "Artists": {"L": [{"S": "Acme Band"}, {"S": "No One You Know"}]},
               "release_date": {"S": "2023-07-21"}
           }}
       }'
   ```

1. 테이블을 스캔하여 항목이 테이블에 추가되었는지 확인합니다.

   ```
   aws dynamodb scan --table-name myMusicTable  --region us-east-1
   ```

------
#### [ Using the AWS SDK for Java 2.x ]

1. 테이블 만들기. 다음 예제에서는 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API를 사용하여 `myMusicTable`이라는 테이블을 생성합니다.

   ```
   DynamoDbClient dynamoDB = DynamoDbClient.builder().region(region).build();
   CreateTableRequest createTableRequest = CreateTableRequest.builder()
       .attributeDefinitions(
           Arrays.asList(
               AttributeDefinition.builder()
               .attributeName("id")
               .attributeType(ScalarAttributeType.S)
               .build()
           )
       )
       .keySchema(
           Arrays.asList(
               KeySchemaElement.builder()
               .attributeName("id")
               .keyType(KeyType.HASH)
               .build()
           )
       )
       .provisionedThroughput(ProvisionedThroughput.builder()
           .readCapacityUnits(5L)
           .writeCapacityUnits(5L)
           .build()
       )
       .tableName("myMusicTable")
       .build();
   
   CreateTableResponse createTableResponse = dynamoDB.createTable(createTableRequest);
   String tableArn = createTableResponse.tableDescription().tableArn();
   String tableName = createTableResponse.tableDescription().tableName();
   ```

1. 이 테이블에 태그를 추가합니다. 다음 예제의 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API는 태그 키-값 페어 `Title: ProductManager`를 `myMusicTable`에 추가합니다.

   ```
   TagResourceRequest tagResourceRequest = TagResourceRequest.builder()
       .resourceArn(tableArn)
       .tags(
           Arrays.asList(
               Tag.builder()
               .key("Title")
               .value("ProductManager")
               .build()
           )
       )
       .build();
   dynamoDB.tagResource(tagResourceRequest);
   ```

1. 다음 예제와 같이 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)을 만들고 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 관리형 정책이 연결된 역할에 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "dynamodb:PutItem",
         "Resource": "arn:aws:dynamodb:*:*:table/*",
         "Condition": {
           "StringEquals": {
             "aws:ResourceTag/Title": "ProductManager"
           }
         }
       }
     ]
   }
   ```

------

   이 정책은 테이블에 연결된 태그 키와 값이 정책에 지정된 태그와 일치할 때 테이블에 대한 `PutItem` 작업을 허용합니다.

1. 3단계에 설명된 정책으로 역할을 수임합니다.

1. [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API를 사용하여 항목을 `myMusicTable`에 입력합니다.

   ```
   HashMap<String, AttributeValue> info = new HashMap<>();
   info.put("rating", AttributeValue.builder().s("9").build());
   info.put("artists", AttributeValue.builder().ss(List.of("Acme Band","No One You Know").build());
   info.put("release_date", AttributeValue.builder().s("2023-07-21").build());
   
   HashMap<String, AttributeValue> itemValues = new HashMap<>();
   itemValues.put("id", AttributeValue.builder().s("2023").build());
   itemValues.put("title", AttributeValue.builder().s("Happy Day").build());
   itemValues.put("info", AttributeValue.builder().m(info).build());
   
   
   PutItemRequest putItemRequest = PutItemRequest.builder()
                   .tableName(tableName)
                   .item(itemValues)
                   .build();
   dynamoDB.putItem(putItemRequest);
   ```

1. 테이블을 스캔하여 항목이 테이블에 추가되었는지 확인합니다.

   ```
   ScanRequest scanRequest = ScanRequest.builder()
                   .tableName(tableName)
                   .build();
                   
   ScanResponse scanResponse = dynamoDB.scan(scanRequest);
   ```

------
#### [ Using the AWS SDK for Python (Boto3) ]

1. 테이블 만들기. 다음 예제에서는 [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html) API를 사용하여 `myMusicTable`이라는 테이블을 생성합니다.

   ```
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 5,
           'WriteCapacityUnits': 5
       },
   )
   
   table_arn = create_table_response['TableDescription']['TableArn']
   ```

1. 이 테이블에 태그를 추가합니다. 다음 예제의 [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html) API는 태그 키-값 페어 `Title: ProductManager`를 `myMusicTable`에 추가합니다.

   ```
   tag_resouce_response = ddb_client.tag_resource(
       ResourceArn=table_arn,
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ]
   )
   ```

1. 다음 예제와 같이 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)을 만들고 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 관리형 정책이 연결된 역할에 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
           "Effect": "Allow",
           "Action": "dynamodb:PutItem",
           "Resource": "arn:aws:dynamodb:*:*:table/*",
           "Condition": {
               "StringEquals": {
               "aws:ResourceTag/Title": "ProductManager"
               }
           }
           }
       ]
       }
   ```

------

   이 정책은 테이블에 연결된 태그 키와 값이 정책에 지정된 태그와 일치할 때 테이블에 대한 `PutItem` 작업을 허용합니다.

1. 3단계에 설명된 정책으로 역할을 수임합니다.

1. [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) API를 사용하여 항목을 `myMusicTable`에 입력합니다.

   ```
   put_item_response = client.put_item(
       TableName = 'myMusicTable'
       Item = {
           'id': '2023',
           'title': 'Happy Day',
           'info': {
               'rating': '9',
               'artists': ['Acme Band','No One You Know'],
               'release_date': '2023-07-21'
           }
       }
   )
   ```

1. 테이블을 스캔하여 항목이 테이블에 추가되었는지 확인합니다.

   ```
   scan_response = client.scan(
       TableName='myMusicTable'
   )
   ```

------

**ABAC이 없는 경우**  
AWS 계정에 ABAC가 활성화되지 않은 경우 IAM 정책 및 DynamoDB 테이블의 태그 조건이 일치하지 않습니다. 따라서 이 `PutItem` 작업은 `AmazonDynamoDBReadOnlyAccess` 정책의 영향으로 인해 `AccessDeniedException`을 반환합니다.

```
An error occurred (AccessDeniedException) when calling the PutItem operation: User: arn:aws:sts::123456789012:assumed-role/DynamoDBReadOnlyAccess/Alice is not authorized to perform: dynamodb:PutItem on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:PutItem action.
```

**ABAC가 있는 경우**  
AWS 계정에 ABAC가 활성화된 경우 `put-item` 작업이 성공적으로 완료되고 테이블에 새 항목이 추가됩니다. 이는 테이블의 인라인 정책이 IAM 정책과 테이블의 태그 조건이 일치하는 경우 `PutItem` 작업을 허용하기 때문입니다.

## 예제 2: aws:RequestTag를 사용하여 작업 허용
<a name="abac-allow-example-request-tag"></a>

[aws:RequestTag/tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) 조건 키를 사용하여 요청에 전달된 태그 키-값 페어를 IAM 정책에 지정된 태그 페어와 비교할 수 있습니다. 예를 들어 태그 조건이 일치하지 않는 경우 `aws:RequestTag`를 사용하여와 `CreateTable`과 같은 특정 작업을 허용할 수 있습니다. 이렇게 하려면 다음 단계를 수행하세요.

------
#### [ Using the AWS CLI ]

1. 다음 예제와 같이 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)을 만들고 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) AWS 관리형 정책이 연결된 역할에 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. `"Owner": "John"`의 태그 키-값 페어가 포함된 테이블을 만듭니다.

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Owner,Value=John \
   --table-name myMusicTable
   ```

------
#### [ Using the AWS SDK for Python (Boto3) ]

1. 다음 예제와 같이 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)을 만들고 [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS 관리형 정책이 연결된 역할에 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "StringEquals": {
                       "aws:RequestTag/Owner": "John"
                   }
               }
           }
       ]
   }
   ```

------

1. `"Owner": "John"`의 태그 키-값 페어가 포함된 테이블을 만듭니다.

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Owner',
               'Value': 'John'
           },
       ],
   )
   ```

------

**ABAC이 없는 경우**  
AWS 계정에 ABAC가 활성화되지 않은 경우 인라인 정책 및 DynamoDB 테이블의 태그 조건이 일치하지 않습니다. 따라서 `CreateTable` 요청이 실패하고 테이블이 생성되지 않습니다.

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/Admin/John is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable because no identity-based policy allows the dynamodb:CreateTable action.
```

**ABAC가 있는 경우**  
AWS 계정에 ABAC가 활성화된 경우 테이블 만들기 요청이 성공적으로 완료됩니다. 태그 키-값 쌍 `"Owner": "John"`이 `CreateTable` 요청에 있으므로 인라인 정책을 통해 사용자 `John`이 `CreateTable` 작업을 수행할 수 있습니다.

## 예제 3: aws:TagKeys를 사용하여 작업 거부
<a name="abac-deny-example-tag-key"></a>

[aws:TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) 조건 키를 사용하여 요청의 태그 키를 IAM 정책에 지정된 키와 비교할 수 있습니다. 예를 들어 요청에 특정 태그 키가 *없는* 경우 `aws:TagKeys`를 사용하여 `CreateTable`과 같은 특정 작업을 거부할 수 있습니다. 이렇게 하려면 다음 단계를 수행하세요.

------
#### [ Using the AWS CLI ]

1. 다음 예제와 같이 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 관리형 정책이 연결된 역할에 [고객 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)을 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 정책이 연결된 역할을 수임하고 태그 키 `Title`로 테이블을 만듭니다.

   ```
   aws dynamodb create-table \
   --attribute-definitions AttributeName=ID,AttributeType=S \
   --key-schema AttributeName=ID,KeyType=HASH  \
   --provisioned-throughput ReadCapacityUnits=1000,WriteCapacityUnits=500 \
   --region us-east-1 \
   --tags Key=Title,Value=ProductManager \
   --table-name myMusicTable
   ```

------
#### [ Using the AWS SDK for Python (Boto3) ]

1. 다음 예제와 같이 [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) AWS 관리형 정책이 연결된 역할에 [고객 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)을 추가합니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "dynamodb:CreateTable",
                   "dynamodb:TagResource"
               ],
               "Resource": "arn:aws:dynamodb:*:*:table/*",
               "Condition": {
                   "Null": {
                       "aws:TagKeys": "false"
                   },
                   "ForAllValues:StringNotEquals": {
                       "aws:TagKeys": "CostCenter"
                   }
               }
           }
       ]
   }
   ```

------

1. 정책이 연결된 역할을 수임하고 태그 키 `Title`로 테이블을 만듭니다.

   ```
   ddb_client = boto3.client('dynamodb')
   
   create_table_response = ddb_client.create_table(
       AttributeDefinitions=[
           {
               'AttributeName': 'id',
               'AttributeType': 'S'
           },
       ],
       TableName='myMusicTable',
       KeySchema=[
           {
               'AttributeName': 'id',
               'KeyType': 'HASH'
           },
       ],
           ProvisionedThroughput={
           'ReadCapacityUnits': 1000,
           'WriteCapacityUnits': 500
       },
       Tags=[
           {
               'Key': 'Title',
               'Value': 'ProductManager'
           },
       ],
   )
   ```

------

**ABAC이 없는 경우**  
AWS 계정에 ABAC가 활성화되지 않은 경우 DynamoDB는 `create-table` 명령의 태그 키를 IAM으로 전송하지 않습니다. `Null` 조건은 요청에 태그 키가 없는 경우 조건이 `false`로 평가되도록 합니다. `Deny` 정책이 일치하지 않으므로 `create-table` 명령이 성공적으로 완료됩니다.

**ABAC가 있는 경우**  
AWS 계정에 ABAC가 활성화된 경우 `create-table` 명령에 전달된 태그 키가 IAM으로 전달됩니다. 태그 키 `Title`은 `Deny` 정책에 있는 조건 기반 태그 키 `CostCenter`를 기준으로 평가됩니다. `StringNotEquals` 연산자로 인해 태그 키 `Title`이 `Deny` 정책에 있는 태그 키와 일치하지 않습니다. 따라서 `CreateTable` 작업이 실패하고 테이블이 생성되지 않습니다. `create-table` 명령을 실행하면 `AccessDeniedException`이 반환됩니다.

```
An error occurred (AccessDeniedException) when calling the CreateTable operation: User: arn:aws:sts::123456789012:assumed-role/DynamoFullAccessRole/ProductManager is not authorized to perform: dynamodb:CreateTable on resource: arn:aws:dynamodb:us-east-1:123456789012:table/myMusicTable with an explicit deny in an identity-based policy.
```

# DynamoDB 테이블 및 인덱스의 일반적인 ABAC 오류 해결
<a name="abac-troubleshooting"></a>

이 주제에서는 DynamoDB 테이블 또는 인덱스에서 ABAC를 구현하는 동안 발생할 수 있는 일반적인 오류 및 문제에 대한 문제 해결 조언을 제공합니다.

## 정책의 서비스별 조건 키로 인해 오류 발생
<a name="abac-troubleshooting-service-specific-keys"></a>

서비스별 조건 키는 유효한 조건 키로 간주되지 않습니다. 정책에서 이러한 키를 사용한 경우 오류가 발생합니다. 이 문제를 해결하려면 서비스별 조건 키를 적절한 [조건 키로 바꾸어 DynamoDB에서 ABAC를 구현](attribute-based-access-control.md#condition-keys-implement-abac)해야 합니다.

예를 들어 [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) 요청을 수행하는 [인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)에서 `dynamodb:ResourceTag` 조건 키를 사용했다고 가정해 보겠습니다. `AccessDeniedException`에서 요청이 실패한다고 가정합니다. 다음 예제에서는 `dynamodb:ResourceTag` 조건 키가 있는 잘못된 인라인 정책을 보여줍니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "dynamodb:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

이 문제를 해결하려면 다음 예제와 같이 `dynamodb:ResourceTag` 조건 키를 `aws:ResourceTag`로 바꿉니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:PutItem"
            ],
            "Resource": "arn:aws:dynamodb:*:*:table/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Owner": "John"
                }
            }
        }
    ]
}
```

------

## ABAC를 옵트아웃할 수 없음
<a name="abac-troubleshooting-unable-opt-out"></a>

지원를 통해 계정에 대해 ABAC가 활성화된 경우 DynamoDB 콘솔을 통해 ABAC를 옵트아웃할 수 없습니다. 옵트아웃하려면 [지원](https://console.aws.amazon.com/support)에 문의하세요.

다음과 같은 *경우에만* ABAC를 직접 옵트아웃할 수 있습니다.
+ [DynamoDB 콘솔을 통해 옵트인](abac-enable-ddb.md#abac-enable-console)하는 셀프 서비스 방법을 사용했습니다.
+ 옵트인 후 7일 이내에 옵트아웃합니다.

# DynamoDB의 데이터 보호
<a name="data-protection"></a>

Amazon DynamoDB에서는 미션 크리티컬 및 기본 데이터 스토리지에 적합하게 설계된, 내구성이 뛰어난 스토리지 인프라를 제공합니다. 데이터는 Amazon DynamoDB 리전의 여러 시설에 걸쳐 여러 디바이스에 중복 저장됩니다.

DynamoDB는 저장된 유휴 사용자 데이터뿐 아니라 온프레미스 클라이언트와 DynamoDB 간, DynamoDB와 동일 AWS 리전의 기타 AWS 리소스 간에 전송 중인 데이터를 보호합니다.

**Topics**
+ [DynamoDB 저장 데이터 암호화](EncryptionAtRest.md)
+ [VPC 엔드포인트 및 IAM 정책을 사용하여 DynamoDB 연결 보호](inter-network-traffic-privacy.md)

# DynamoDB 저장 데이터 암호화
<a name="EncryptionAtRest"></a>

Amazon DynamoDB에 저장된 모든 사용자 데이터는 저장 중 완전히 암호화됩니다. DynamoDB 저장 데이터 암호화는 [AWS Key Management Service(AWS KMS)](https://aws.amazon.com/kms/)에 저장된 암호화 키를 사용하여 모든 저장 중 데이터를 암호화하여 향상된 보안을 제공합니다. 이 기능을 사용하면 중요한 데이터 보호와 관련된 운영 부담 및 복잡성을 줄일 수 있습니다. 저장 시 암호화를 사용하면 엄격한 암호화 규정 준수 및 규제 요구 사항이 필요한, 보안에 민감한 애플리케이션을 구축할 수 있습니다.

DynamoDB 유휴 시 암호화는 내구성이 뛰어난 미디어에 데이가 저장될 때마다 프라이머리 키, 로컬 및 글로벌 보조 인덱스, 스트림, 전역 테이블, 백업, DynamoDB Accelerator(DAX) 클러스터 등을 비롯한 데이터를 항상 암호화된 테이블에서 보호하여 추가 데이터 보호 계층을 제공합니다. 조직의 정책, 업계나 정부 규범 및 규정 준수 요건에 따라 유휴 시 암호화를 사용하여 애플리케이션의 데이터 보안을 강화해야 할 수 있습니다. 데이터베이스 애플리케이션의 암호화에 대한 자세한 내용은 [AWS Database Encryption SDK](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/what-is-database-encryption-sdk.html)를 참조하세요.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 암호화 키를 관리하기 위해 AWS KMS와 통합됩니다. 키 유형 및 상태에 대한 자세한 내용은 **AWS Key Management Service 개발자 안내서의 [AWS Key Management Service 개념](https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html#key-state-cmk-type)을 참조하세요.

새 테이블을 만들 때 다음 AWS KMS key 유형 중 하나를 선택하여 테이블을 암호화할 수 있습니다. 언제든지 이러한 키 유형 간에 전환할 수 있습니다.
+ **AWS 소유 키 –** 기본 암호화 유형. 키는 DynamoDB가 소유합니다(추가 비용 없음).
+ **AWS 관리형 키 –** 이 키는 사용자의 계정에 저장되고 AWS KMS에 의해 관리됩니다(AWS KMS 비용 적용).
+ **고객 관리형 키 -** 사용자의 계정에 키가 저장되며 사용자가 생성, 소유, 관리하는 유형입니다. 키에 대해 사용자가 모든 것을 제어합니다(AWS KMS 비용 적용).

키 유형에 대한 자세한 내용은 [고객 키 및 AWS 키](/kms/latest/developerguide/concepts.html#key-mgmt)를 참조하세요.

**참고**  
저장 중 데이터 암호화를 활성화하고 새 DAX 클러스터를 생성할 경우 AWS 관리형 키를 사용하여 클러스터에서 저장 중 데이터를 암호화합니다.
테이블에 정렬 키가 있는 경우 범위 경계를 표시하는 정렬 키 중 일부가 테이블 메타데이터에 일반 텍스트 형태로 저장됩니다.

암호화된 테이블에 액세스하면 DynamoDB가 테이블 데이터를 투명하게 해독합니다. 암호화된 테이블을 사용 또는 관리하기 위해 코드나 애플리케이션을 변경할 필요가 없습니다. DynamoDB는 사용자가 기대하는 한 자릿수 밀리초 지연 시간을 계속해서 제공하며 모든 DynamoDB 쿼리가 암호화된 데이터에 대해 원활하게 처리됩니다.

AWS Management Console, AWS Command Line Interface(AWS CLI) 또는 Amazon DynamoDB API를 사용하여 기존 테이블에서 새로운 테이블을 생성하거나 암호화 키를 전환할 때 암호화 키를 지정할 수 있습니다. 자세한 방법은 [DynamoDB의 암호화된 테이블 관리](encryption.tutorial.md) 단원을 참조하세요.

AWS 소유 키를 사용한 저장 데이터 암호화는 추가 비용 없이 제공됩니다. 그러나 AWS 관리형 키 및 고객 관리형 키에 대해서는 AWS KMS 비용이 부과됩니다. 요금에 대한 자세한 내용은 [AWS KMS 요금](https://aws.amazon.com/kms/pricing)을 참조하세요.

DynamoDB 저정 데이터 암호화는 AWS 중국(베이징), AWS 중국(닝샤), AWS GovCloud(미국)를 포함한 모든 AWS 리전에서 이용 가능합니다. 자세한 내용은 [저장 시 DynamoDB 암호화: 작동 방식](encryption.howitworks.md) 및 [DynamoDB 저장 데이터 암호화 사용 참고 사항](encryption.usagenotes.md)(을)를 참조하세요.

# 저장 시 DynamoDB 암호화: 작동 방식
<a name="encryption.howitworks"></a>

Amazon DynamoDB 저장 데이터 암호화는 256비트 고급 암호화 표준(AES-256)에 따라 데이터를 암호화하여 기본 스토리지에 대한 무단 액세스로부터 데이터를 보호할 수 있도록 지원합니다.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 암호화 키를 관리하기 위해 AWS Key Management Service(AWS KMS)와 통합됩니다.

**참고**  
2022년 5월, AWS KMS는 AWS 관리형 키에 대한 교체 일정을 3년(약 1,095일)에서 매년(약 365일)으로 변경했습니다.  
새 AWS 관리형 키는 생성된 후 1년이 지나면 자동으로 교체되고, 그 후에도 대략 매년 자동으로 교체됩니다.  
기존 AWS 관리형 키는 가장 최근 교체 후 1년이 지나면 자동으로 교체되고, 그 후에도 매년 자동으로 교체됩니다.

## AWS 소유 키
<a name="ddb-owned"></a>

 AWS 소유 키는 AWS 계정에 저장되지 않습니다. 이들은 AWS가 여러 AWS 계정에서 사용하기 위해 소유 및 관리하는 KMS 키 모음의 일부입니다. AWS 서비스는 AWS 소유 키를 사용하여 데이터를 보호할 수 있습니다. DynamoDB에서 사용하는 AWS 소유 키는 매년(약 365일) 교체됩니다.

사용자는 AWS 소유 키를 확인, 관리 또는 사용하거나 사용을 감사할 수 없습니다. 하지만 데이터를 암호화하는 키를 보호하기 위해 어떤 작업을 수행하거나 어떤 프로그램을 변경할 필요가 없습니다.

월별 요금 또는 AWS 소유 키의 사용량에 따른 요금이 부과되지 않으며, 계정의 AWS KMS 할당량에 포함되지 않습니다.

## AWS 관리형 키
<a name="managed-key-service-default-kms"></a>

AWS 관리형 키는 AWS KMS와 통합된 AWS 서비스가 고객의 계정에서 고객 대신 생성, 관리 및 사용하는 KMS 키입니다. 계정에서 AWS 관리형 키를 확인하고 키 정책을 확인하며, AWS CloudTrail 로그에서 사용을 감사할 수 있습니다. 하지만 이러한 KMS 키를 관리하거나 이들의 권한을 변경할 수는 없습니다.

유휴 시 암호화는 테이블을 암호화하는 데 사용되는 DynamoDB(`aws/dynamodb`)용 AWS 관리형 키를 관리하기 위해 AWS KMS와 자동으로 통합됩니다. 암호화된 DynamoDB 테이블을 생성할 때 AWS 관리형 키가 존재하지 않는 경우 AWS KMS에서 새 키를 자동으로 생성합니다. 이 키는 향후 생성되는 암호화된 테이블에 사용됩니다. AWS KMS는 클라우드에 맞게 조정된 키 관리 시스템을 제공하기 위해 안전하고 가용성이 높은 하드웨어 및 소프트웨어를 결합합니다.

AWS 관리형 키 권한 관리에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [AWS 관리형 키 사용 권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-authz)를 참조하세요.

## 고객 관리형 키
<a name="managed-key-customer-managed"></a>

고객 관리형 키는 사용자가 생성, 소유 및 관리하는 AWS 계정의 KMS 키입니다. 사용자는 키 정책 설정 및 관리, IAM 정책, 권한 부여, 활성화 및 비활성화, 암호화 구성 요소 교체, 태그 추가, CMK를 가리키는 별칭 생성 및 삭제를 위한 KMS 예약 등을 포함해 KMS 키에 대한 완전한 제어 권한을 가집니다. 고객 관리형 키의 권한 관리에 대한 자세한 내용은 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 참조하세요.

고객 관리형 키를 테이블 수준 암호화 키로 지정하면 DynamoDB 테이블, 로컬 및 글로벌 보조 인덱스, 스트림은 동일한 고객 관리형 키로 암호화됩니다. 온디맨드 백업은 백업이 생성되는 당시에 지정된 테이블 수준 암호화 키로 암호화됩니다. 테이블 수준 암호화 키를 업데이트하더라도 기존 온디맨드 백업과 연계된 암호화 키는 변경되지 않습니다.

고객 관리형 키의 상태를 비활성화로 설정하거나 삭제를 예약하면 모든 사용자와 DynamoDB 서비스가 데이터를 암호화 또는 암호 해독하고 테이블에서 읽고 쓰는 작업을 수행할 수 없습니다. DynamoDB는 사용자가 테이블에 지속적으로 액세스하고 데이터 유실을 방지하기 위해 암호화 키에 액세스할 수 있어야 합니다.

고객 관리형 키를 비활성화하거나 삭제를 예약한 경우에는 테이블 상태가 **Inaccessible(접근 불가)**로 바뀌게 됩니다. 테이블에서 작업을 계속하기 위해서는 7일 안에 DynamoDB 액세스를 지정된 암호화 키에 제공해야 합니다. 서비스에서 사용자의 암호화 키가 접근 불가 상태인 것을 탐지하면 바로 DynamoDB는 사용자에게 이를 알리기 위해 이메일 공지를 보냅니다.

**참고**  
7일 이상 고객 관리형 키가 DynamoDB 서비스에 접근 불가 상태가 되면 테이블은 아카이브 상태로 넘어가며 더 이상 액세스할 수 없게 됩니다. DynamoDB는 사용자의 테이블에 대해 온디맨드 백업을 생성하며 이에 대한 비용이 청구됩니다. 이 온디맨드 백업을 새로운 테이블에 데이터를 복원할 때 사용할 수 있습니다. 복원을 시작하려면 테이블에 대한 최종 고객 관리형 키가 활성화되어야 하며, DynamoDB는 이에 액세스할 수 있어야 합니다.
글로벌 테이블 복제본을 암호화하는 데 사용된 고객 관리형 키에 액세스할 수 없는 경우 DynamoDB는 복제 그룹에서 이 복제본을 제거합니다. 고객 관리형 키를 액세스할 수 없는 것으로 감지하고 20시간 후 복제본이 삭제되지 않고 이 리전에서와 이 리전으로의 복제가 중지됩니다.

자세한 내용은 [키 활성화](/kms/latest/developerguide/enabling-keys.html) 및 [키 삭제](/kms/latest/developerguide/deleting-keys.html)를 참조하세요.

## AWS 관리형 키 사용 시 참고 사항
<a name="managed-key-notes"></a>

Amazon DynamoDB는 AWS KMS 계정에 저장된 KMS 키에 대한 액세스 권한이 있어야 테이블 데이터를 읽을 수 있습니다. DynamoDB는 봉투 암호화 및 키 계층 구조를 사용하여 데이터를 암호화합니다. AWS KMS 암호화 키는 이 키 계층 구조의 루트 키를 암호화하는 데 사용됩니다. 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [봉투 암호화](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)를 참조하세요.

 DynamoDB는 모든 DynamoDB 작업에 대해 AWS KMS를 호출하지 않습니다. 활성 트래픽을 통한 호출자당 5분마다 키가 새로 고침됩니다.

연결을 재사용하도록 SDK를 구성했는지 확인합니다. 그렇게 되어 있지 않다면 각 DynamoDB 작업에 대해 새 AWS KMS 캐시 항목을 다시 설정해야 하므로 DynamoDB에서 지연 시간이 발생합니다. 뿐만 아니라 더 많은 AWS KMS 및 CloudTrail 비용이 발생할 수 있습니다. 예를 들어 Node.js SDK를 사용하여 이 작업을 수행하려면 `keepAlive`를 켠 상태에서 새 HTTPS 에이전트를 생성합니다. 자세한 내용은 **AWS SDK for JavaScript 개발자 안내서에서 [Node.js에서 keepAlive 구성](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/node-reusing-connections.html)을 참조하세요.

# DynamoDB 저장 데이터 암호화 사용 참고 사항
<a name="encryption.usagenotes"></a>

Amazon DynamoDB에서 저장 데이터 암호화를 사용할 때 다음을 고려하세요.

## 모든 테이블 데이터는 암호화됩니다.
<a name="encryption.usagenotes.tabledata"></a>

서버 측 저장 데이터 암호화는 모든 DynamoDB 테이블에서 활성화되며 비활성화할 수 없습니다. 테이블에서 항목의 하위 집합만 암호화할 수 없습니다.

저장 시 암호화는 영구 스토리지 미디어에서 정적(저장 시) 상태인 데이터만 암호화합니다. 전송 중인 데이터 또는 사용 중인 데이터에 대한 데이터 보안 문제가 있는 경우 추가 조치를 취해야 합니다.
+ 전송 중 데이터: DynamoDB의 모든 데이터는 전송 중에 암호화됩니다. 기본적으로 DynamoDB와의 통신은 보안 소켓 계층(SSL)/전송 계층 보안(TLS) 암호화를 사용하여 네트워크 트래픽을 보호하는 HTTPS 프로토콜을 사용합니다.
+ 사용 중인 데이터: DynamoDB에 보내기 전에 클라이언트 측 암호화를 사용하여 데이터를 보호합니다. 자세한 내용은 *Amazon DynamoDB Encryption Client 개발자 안내서*의 [클라이언트 측 및 서버 측 암호화](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/client-server-side.html)를 참조하세요.

암호화된 테이블에서 스트림을 사용할 수 있습니다. DynamoDB 스트림은 항상 테이블 수준 암호화 키로 암호화됩니다. 자세한 내용은 [DynamoDB Streams에 대한 변경 데이터 캡처](Streams.md) 섹션을 참조하세요.

DynamoDB 백업은 암호화되고 이 백업에서 복원되는 테이블도 암호화가 활성화되어 있습니다. 백업 데이터를 암호화하기 위해 AWS 소유 키, AWS 관리형 키 또는 고객 관리형 키를 사용할 수 있습니다. 자세한 내용은 [DynamoDB에 대한 백업 및 복원](Backup-and-Restore.md) 섹션을 참조하세요.

로컬 보조 인덱스와 글로벌 보조 인덱스는 베이스 테이블과 동일한 키를 사용해 암호화됩니다.

## 암호화 유형
<a name="encryption.usagenotes.encryptiontypes"></a>

**참고**  
고객 관리형 키는 글로벌 테이블 버전 2017에서 지원되지 않습니다. DynamoDB 글로벌 테이블에서 고객 관리형 키를 사용하려면 테이블을 글로벌 테이블 버전 2019로 업그레이드하고 사용 설정해야 합니다.

AWS Management Console에서 AWS 관리형 키 또는 고객 관리형 키를 사용하여 데이터를 암호화할 때 암호화 유형은 `KMS`입니다. AWS 소유 키를 사용할 경우 암호화 유형은 `DEFAULT`입니다. Amazon DynamoDB API에서 AWS 관리형 키 또는 고객 관리형 키를 사용하여 데이터를 암호화할 때 암호화 유형은 `KMS`입니다. 암호화 유형이 없을 경우 AWS 소유 키를 사용하여 데이터를 암호화합니다. 언제든지 AWS 소유 키, AWS 관리형 키 및 고객 관리형 키 간에 전환할 수 있습니다. 콘솔, AWS Command Line Interface(AWS CLI) 또는 Amazon DynamoDB API를 사용해 암호화 키를 전환할 수 있습니다.

고객 관리형 키를 사용할 때 다음과 같은 제한을 유의하세요.
+ DynamoDB Accelerator(DAX) 클러스터에 고객 관리형 키를 사용할 수 없습니다. 자세한 내용은 [DAX 저장 데이터 암호화](DAXEncryptionAtRest.md) 섹션을 참조하세요.
+ 트랜잭션을 사용하는 테이블을 암호화하기 위해 고객 관리형 키를 사용할 수 없습니다. 그러나 트랜잭션 전파의 내구성을 보장하기 위해 트랜잭션 요청의 복사본이 서비스에 의해 임시로 저장되고 AWS 소유 키를 사용하여 암호화됩니다. 테이블 및 보조 인덱스에서 커밋된 데이터는 항상 고객 관리형 키를 사용하여 저장 중 암호화됩니다.
+ Contributor Insights를 사용하는 테이블을 암호화하기 위해 고객 관리형 키를 사용할 수 있습니다. 그러나 Amazon CloudWatch로 전송되는 데이터는 AWS 소유 키로 암호화됩니다.
+ 새 고객 관리형 키로 전환하는 경우 프로세스가 완료될 때까지 원래 키를 사용하도록 설정해야 합니다. AWS에서 새 키로 암호화하기 전에 데이터를 해독하기 위해 원래 키가 필요합니다. 테이블의 SSEDescription 상태가 활성화되고 새 고객 관리형 키의 KMSMasterKeyArn이 표시되면 프로세스가 완료됩니다. 이 시점에서 원래 키를 비활성화하거나 삭제하도록 예약할 수 있습니다.
+ 새 고객 관리 키가 표시되면 테이블과 모든 새 온디맨드 백업이 새 키로 암호화됩니다.
+ 기존 온디맨드 백업은 백업이 생성될 때 사용된 고객 관리 키로 암호화된 상태로 유지됩니다. 이러한 백업을 복원하려면 동일한 키가 필요합니다. DescripbeBackup API를 사용하여 해당 백업의 SSEDescription을 확인하여 각 백업이 생성된 기간의 키를 식별할 수 있습니다.
+ 고객 관리형 키를 비활성화하거나 삭제를 예약하는 경우 DynamoDB Streams에 있는 모든 데이터는 24시간 수명이 적용됩니다. 24시간이 지날 경우 모든 회수되지 않은 데이터는 트리밍 권한이 주어집니다.
+ 고객 관리형 키를 비활성화하거나 삭제를 예약한 경우에는 유지 시간(TTL) 삭제가 30분간 진행됩니다. 이러한 TTL 삭제는 DynamoDB Streams로 계속 방출되며 표준 트리밍/보존 간격이 적용됩니다.

  자세한 내용은 [키 활성화](/kms/latest/developerguide/enabling-keys.html) 및 [키 삭제](/kms/latest/developerguide/deleting-keys.html)를 참조하세요.

## KMS 키 및 데이터 키 사용
<a name="dynamodb-kms"></a>

DynamoDB 암호화 기능은 AWS KMS key와 데이터 키 계층을 사용하여 테이블 데이터를 보호합니다. DynamoDB는 동일한 키 계층을 사용하여 내구성 있는 미디어에 기록되는 DynamoDB 스트림, 전역 테이블 및 백업을 보호합니다.

DynamoDB에서 테이블을 구현하기 전에 암호화 전략을 계획하는 것이 좋습니다. 민감한 데이터나 기밀 데이터를 DynamoDB에 저장하는 경우 계획에 클라이언트측 암호화를 포함하는 것을 고려해 보세요. 이렇게 하면 데이터를 원본에 최대한 가깝게 암호화하고 전체 수명 주기 동안 데이터를 보호할 수 있습니다. 자세한 내용은 [DynamoDB 암호화 클라이언트](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html) 설명서를 참조하세요.

**AWS KMS key**  
유휴 시 암호화는 AWS KMS key에서 DynamoDB 테이블을 보호합니다. 기본적으로 DynamoDB는 DynamoDB 서비스 계정에서 생성 및 관리되는 다중 테넌트 암호화 키인 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 사용합니다. 그러나 AWS 계정의 DynamoDB(`aws/dynamodb`)용 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)에서 DynamoDB 테이블을 암호화할 수 있습니다. 각 테이블마다 다른 KMS 키를 선택할 수 있습니다. 테이블에 대해 선택한 KMS 키는 로컬 및 전역 보조 인덱스, 스트림 및 백업을 암호화하는 데에도 사용됩니다.  
테이블을 생성 또는 업데이트할 때 테이블에 대해 KMS 키를 선택합니다. 언제든지 DynamoDB 콘솔에서 또는 [UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html) 작업을 사용하여 테이블에 대한 KMS 키를 변경할 수 있습니다. 키 전환 프로세스는 원활하며 가동 중지 시간 또는 서비스 저하가 발생하지 않습니다.  
DynamoDB는 [대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)만 지원합니다. [비대칭 KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks)를 사용하여 DynamoDB 테이블을 암호화할 수 없습니다. 
고객 관리형 키를 사용하여 다음과 같은 기능을 얻을 수 있습니다.  
+ KMS 키에 대한 액세스를 제어하기 위한 [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), [IAM 정책](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) 및 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html) 설정을 포함하여 KMS 키를 생성하고 관리합니다 KMS 키를 [활성화 및 비활성화](https://docs.aws.amazon.com/kms/latest/developerguide/enabling-keys.html)하고, [자동 키 교체](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html)를 활성화 및 비활성화하고, KMS 키가 더 이상 사용되지 않을 때 [KMS 키를 삭제](https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html)할 수 있습니다.
+ [가져온 키 구성 요소](https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html)가 있는 고객 관리형 키를 사용하거나 고객이 소유하고 관리하는 [사용자 지정 키 스토어](https://docs.aws.amazon.com/kms/latest/developerguide/custom-key-store-overview.html)에서 고객 관리형 키를 사용할 수 있습니다.
+ [AWS CloudTrail 로그](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)에서 AWS KMS에 대한 DynamoDB API 호출을 검사하여 DynamoDB 테이블의 암호화 및 복호화를 감사할 수 있습니다.
다음과 같은 기능이 필요한 경우 AWS 관리형 키를 사용합니다.  
+ [KMS 키](https://docs.aws.amazon.com/kms/latest/developerguide/viewing-keys.html) 및 [해당 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-viewing.html)을 볼 수 있습니다. 키 정책을 변경할 수 없습니다.
+ [AWS CloudTrail 로그](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-cmk-trail)에서 AWS KMS에 대한 DynamoDB API 호출을 검사하여 DynamoDB 테이블의 암호화 및 복호화를 감사할 수 있습니다.
그러나 AWS 소유 키는 무료이며 그 사용은 [AWS KMS 리소스 또는 요청 할당량](https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)에 포함되지 않습니다. 고객 관리형 키 및 AWS 관리형 키는 각 API 호출에 대해 [요금이 부과](https://aws.amazon.com/kms/pricing/)되며 이러한 KMS 키에 AWS KMS 할당량이 적용됩니다.

**테이블 키**  
DynamoDB는 테이블에 대해 KMS 키를 사용하여 *테이블 키*라고 하는 테이블에 대한 고유한 [데이터 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)를 [생성](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)하고 암호화합니다. 테이블 키는 암호화된 테이블의 수명 기간 동안 존속합니다.  
테이블 키는 키 암호화 키로 사용됩니다. DynamoDB는 이 테이블 키를 사용하여 테이블 데이터를 암호화하는 데 사용되는 데이터 암호화 키를 보호합니다. DynamoDB는 테이블에 있는 각 기본 구조의 고유한 데이터 암호화 키를 생성하지만, 동일한 데이터 암호화 키로 여러 테이블 항목을 보호할 수 없습니다.  

![\[영구 암호화로 DynamoDB 테이블 암호화\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/service-ddb-encrypt.png)

암호화된 테이블에 처음 액세스하면 DynamoDB가 KMS 키를 사용하여 테이블 키를 해제하도록 AWS KMS에 요청합니다. 그런 다음 일반 텍스트 테이블 키를 사용하여 데이터 암호화 키를 해독하고, 일반 텍스트 데이터 암호화 키를 사용하여 테이블 데이터를 해독합니다.  
DynamoDB는 AWS KMS 외부에 테이블 키와 데이터 암호화 키를 저장하고 사용합니다. [고급 암호화 표준](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard)(AES) 암호화 및 256비트 암호화 키로 모든 키를 보호합니다. 그런 다음 필요에 따라 테이블 데이터를 해독할 때 사용할 수 있도록 암호화된 데이터로 암호화된 키를 저장합니다.  
테이블의 KMS 키를 변경하면 DynamoDB가 새 테이블 키를 생성합니다. 그런 다음 새 테이블 키를 사용하여 데이터 암호화 키를 다시 암호화합니다.

**테이블 키 캐싱**  
각 DynamoDB 작업마다 AWS KMS 를 호출하지 않도록 DynamoDB는 메모리에 있는 각 호출자의 일반 텍스트 테이블 키를 캐싱합니다. 5분의 비활성 시간이 경과하여 DynamoDB가 캐싱된 테이블 키를 요청할 경우 테이블 키를 해독하라는 새로운 요청을 AWS KMS에 보냅니다. 이 호출은 마지막 테이블 키 해제 요청 이후 KMS 키의 액세스 정책에 적용된 모든 변경 사항을 AWS KMS 또는 AWS Identity and Access Management(IAM)에 캡처합니다.

## KMS 키 사용 권한 부여
<a name="dynamodb-kms-authz"></a>

계정에서 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호할 경우 해당 KMS 키에 대한 정책이 DynamoDB에 사용자 대신 키를 사용할 권한을 부여해야 합니다. DynamoDB용 AWS 관리형 키의 권한 부여 컨텍스트에는 그 사용 권한을 위임하는 키 정책과 권한 부여가 포함되어 있습니다.

고객 관리형 키에 대한 정책 및 권한 부여를 완전히 제어할 수 있습니다. AWS 관리형 키는 계정에 있으므로 해당 정책 및 권한 부여를 볼 수 있습니다. 하지만 정책은 AWS에 의해 관리되므로 사용자가 정책을 변경할 수는 없습니다.

DynamoDB는 기본 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys)를 사용하여 AWS 계정의 DynamoDB 테이블을 보호하기 위해 추가 인증이 필요하지 않습니다.

**Topics**
+ [AWS 관리형 키에 대한 키 정책](#dynamodb-policies)
+ [고객 관리형 키에 대한 키 정책](#dynamodb-customer-cmk-policy)
+ [권한 부여를 사용하여 DynamoDB 승인](#dynamodb-grants)

### AWS 관리형 키에 대한 키 정책
<a name="dynamodb-policies"></a>

DynamoDB가 암호화 작업에서 DynamoDB(`aws/dynamodb`)에 대해 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하는 경우 [DynamoDB 리소스](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-overview.html)에 액세스하는 사용자를 수행합니다. AWS 관리형 키에 대한 키 정책은 계정의 모든 사용자에게 지정된 작업에 대해 AWS 관리형 키를 사용할 권한을 부여합니다. 그러나 DynamoDB가 사용자 대신 요청할 때만 권한이 부여됩니다. 키 정책의 [ViaService 조건](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service)은 요청이 DynamoDB 서비스에서 이루어지지 않은 경우 어떤 사용자도 AWS 관리형 키를 사용하도록 허용하지 않습니다.

이 키 정책은 모든 AWS 관리형 키의 정책과 마찬가지로 AWS에 의해 설정됩니다. 변경은 할 수 없지만 언제든 보는 것은 가능합니다. 자세한 내용은 [키 정책 보기](https://docs.aws.amazon.com//kms/latest/developerguide/key-policy-viewing.html)를 참조하세요.

키 정책의 정책 설명문은 다음 효과를 갖습니다.
+ 계정 내 사용자가 DynamoDB에서 대신 요청이 올 때만 암호화 작업에서 DynamoDB에 AWS 관리형 키를 사용할 수 있도록 합니다. 이 정책은 사용자들이 KMS 키의 [권한 부여를 생성하는](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants) 것도 허용합니다.
+ 계정의 승인된 IAM 자격 증명이 DynamoDB용 AWS 관리형 키의 속성을 보고 DynamoDB가 KMS 키를 사용하도록 허용하는 [권한을 취소](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)할 수 있습니다. DynamoDB는 지속적인 유지 관리 작업에 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-grants)를 사용합니다.
+ DynamoDB가 읽기 전용 작업을 수행하여 계정의 DynamoDB용 AWS 관리형 키를 찾을 수 있게 합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id" : "auto-dynamodb-1",
  "Statement" : [ {
    "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "*"
    },
    "Action" : [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:CreateGrant", "kms:DescribeKey" ],
    "Resource" : "*",
    "Condition" : {
      "StringEquals" : {
        "kms:CallerAccount" : "111122223333",
        "kms:ViaService" : "dynamodb.us-west-2.amazonaws.com"
      }
    }
  }, {
    "Sid" : "Allow direct access to key metadata to the account",
    "Effect" : "Allow",
    "Principal" : {
      "AWS" : "arn:aws:iam::111122223333:root"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*", "kms:RevokeGrant" ],
    "Resource" : "*"
  }, {
    "Sid" : "Allow DynamoDB Service with service principal name dynamodb.amazonaws.com to describe the key directly",
    "Effect" : "Allow",
    "Principal" : {
      "Service" : "dynamodb.amazonaws.com"
    },
    "Action" : [ "kms:Describe*", "kms:Get*", "kms:List*" ],
    "Resource" : "*"
  } ]
}
```

------

### 고객 관리형 키에 대한 키 정책
<a name="dynamodb-customer-cmk-policy"></a>

DynamoDB 테이블을 보호하기 위해 [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 선택하면 DynamoDB는 선택하는 보안 주체를 대신하여 KMS 키를 사용할 수 있는 권한을 얻습니다. 해당 보안 주체, 즉 사용자 또는 역할은 DynamoDB가 필요한 KMS 키에 대한 권한이 있어야 합니다. [키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), [IAM 정책](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html) 또는 [권한 부여](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)에 이러한 권한을 제공할 수 있습니다.

DynamoDB는 고객 관리형 키에 대해 최소한 다음 권한이 있어야 합니다.
+ [kms:Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
+ [kms:ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html)\$1(kms:ReEncryptFrom and kms:ReEncryptTo용)
+ kms:GenerateDataKey\$1([kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 및 [kms:GenerateDataKeyWithoutPlaintext](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html)용)
+ [kms:DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [kms:CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)

예를 들어 다음 예제 키 정책은 필수 권한만 제공합니다. 이 정책에는 다음과 같은 효과가 있습니다.
+ DynamoDB가 암호화 작업에 KMS 키를 사용하고 권한 부여를 생성하도록 허용합니다. 단, DynamoDB를 사용할 권한이 있는 계정의 보안 주체를 대신해 동작하는 경우에 한합니다. 정책 문에 지정된 보안 주체가 DynamoDB를 사용할 권한이 없는 경우 DynamoDB 서비스에서 오는 경우에도 호출이 실패합니다.
+ [kms:ViaService](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html#conditions-kms-via-service) 조건 키는 정책 문에 나열된 보안 주체를 대신하여 DynamoDB로부터 요청이 오는 경우에만 사용 권한을 허용합니다. 이러한 보안 주체는 이러한 작업을 직접 호출 할 수 없습니다. 참고: `kms:ViaService` 값(`dynamodb.*.amazonaws.com`)은 리전 위치에 별표(\$1)가 있습니다. DynamoDB는 [DynamoDB 전역 테이블](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html)을 지원하기 위해 교차 리전 호출을 수행할 수 있도록 특정 AWS 리전과 독립적인 권한이 필요합니다.
+ KMS 키 관리자(`db-team` 역할을 수임할 수 있는 사용자)에게 KMS 키에 대한 읽기 전용 액세스와 테이블을 보호하기 위해 [DynamoDB가 필요로 하는](#dynamodb-grants) 권한 부여를 포함하여 권한 부여를 취소할 수 있는 권한을 제공합니다.

예제 키 정책을 사용하기 전에 예제 보안 주체를 AWS 계정의 실제 보안 주체로 바꿉니다.

------
#### [ JSON ]

****  

```
{
  "Id": "key-policy-dynamodb",
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid" : "Allow access through Amazon DynamoDB for all principals in the account that are authorized to use Amazon DynamoDB",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:user/db-lead"},
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey",
        "kms:CreateGrant"
      ],
      "Resource": "*",      
      "Condition": { 
         "StringLike": {
           "kms:ViaService" : "dynamodb.*.amazonaws.com"
         }
      }
    },
    {
      "Sid":  "Allow administrators to view the KMS key and revoke grants",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/db-team"
       },
      "Action": [
        "kms:Describe*",
        "kms:Get*",
        "kms:List*",
        "kms:RevokeGrant"
      ],
      "Resource": "*"
    }
  ]
}
```

------

### 권한 부여를 사용하여 DynamoDB 승인
<a name="dynamodb-grants"></a>

키 정책 이외에 DynamoDB는 권한 부여를 사용하여 DynamoDB용 AWS 관리형 키(`aws/dynamodb`) 또는 고객 관리형 키에 대한 권한을 설정합니다. 계정에서 KMS 키에 대한 권한 부여를 보려면 [ListGrants](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListGrants.html) 작업을 사용합니다. DynamoDB는 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 사용하여 테이블을 보호하는 데 권한 부여 또는 추가 권한이 필요하지 않습니다.

DynamoDB는 배경 시스템 유지 관리 및 연속 데이터 보호 태스크를 수행할 때 권한 부여 권한을 사용합니다. 권한 부여를 사용하여 [테이블 키](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html#dynamodb-encrypt)도 생성합니다.

각 권한 부여는 테이블마다 다릅니다. 계정에 동일한 KMS 키로 암호화되는 여러 테이블이 있는 경우 각 테이블 유형별 권한 부여가 있습니다. 권한 부여는 [DynamoDB 암호화 컨텍스트](#dynamodb-encryption-context)의 제한을 받는데, 여기에는 테이블 이름과 AWS 계정 ID가 포함되며, 더 이상 필요 없을 경우 [권한 부여 제거](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 권한도 포함됩니다.

권한 부여를 생성하려면 DynamoDB가 암호화된 테이블을 생성한 사용자를 대신하여 `CreateGrant`를 호출할 수 있는 권한이 있어야 합니다. AWS 관리형 키의 경우 DynamoDB 는 [키 정책](#dynamodb-policies)에서 `kms:CreateGrant` 권한을 얻습니다. 이를 통해 계정 사용자는 DynamoDB가 승인된 사용자를 대신하여 요청할 때만 KMS 키에서 [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html)를 호출할 수 있습니다.

이 키 정책은 계정이 KMS 키에 대한 [권한 부여를 취소](https://docs.aws.amazon.com/kms/latest/APIReference/API_RevokeGrant.html)하도록 허용할 수도 있습니다. 단, 활성 암호화 테이블에서 권한 부여를 취소할 경우에는 DynamoDB가 테이블을 보호하고 유지하지 못합니다.

## DynamoDB 암호화 컨텍스트
<a name="dynamodb-encryption-context"></a>

[암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)는 보안되지 않은 임의의 데이터를 포함하는 키-값 페어 세트입니다. 데이터 암호화 요청에 암호화 컨텍스트를 포함하는 경우 AWS KMS는 암호화된 데이터에 암호화 컨텍스트를 암호 방식으로 바인딩합니다. 따라서 동일한 암호화 컨텍스트로 전달해야 이 데이터를 해독할 수 있습니다.

DynamoDB는 모든 AWS KMS 암호화 작업에서 동일한 암호화 컨텍스트를 사용합니다. [고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk) 를 사용하여 DynamoDB 테이블을 보호할 경우 암호화 컨텍스트를 사용하여 감사 레코드 및 로그에서 KMS 키의 사용을 식별할 수 있습니다. [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 및 [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) 같은 로그에서 일반 텍스트에 나타나기도 합니다.

암호화 컨텍스트를 정책 및 권한 부여에서 승인 조건으로 사용할 수도 있습니다. DynamoDB는 암호화 컨텍스트를 사용하여 계정 및 리전에서 고객 관리형 키 또는 AWS 관리형 키에 대한 액세스를 허용하는 [권한](#dynamodb-grants)을 제한합니다.

AWS KMS에 요청할 때 DynamoDB 는 두 개의 키값 쌍이 있는 암호화 컨텍스트를 사용합니다.

```
"encryptionContextSubset": {
    "aws:dynamodb:tableName": "Books"
    "aws:dynamodb:subscriberId": "111122223333"
}
```
+ **테이블** – 첫 번째 키값 쌍은 DynamoDB가 암호화 중인 테이블을 나타냅니다. 키는 `aws:dynamodb:tableName`입니다. 값은 테이블의 이름입니다.

  ```
  "aws:dynamodb:tableName": "<table-name>"
  ```

  예:

  ```
  "aws:dynamodb:tableName": "Books"
  ```
+ **계정** – 두 번째 키값 쌍은 AWS 계정을 나타냅니다. 키는 `aws:dynamodb:subscriberId`입니다. 값은 계정 ID입니다.

  ```
  "aws:dynamodb:subscriberId": "<account-id>"
  ```

  예:

  ```
  "aws:dynamodb:subscriberId": "111122223333"
  ```

## AWS KMS와 DynamoDB 상호 작용 모니터링
<a name="dynamodb-cmk-trail"></a>

[고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호할 경우 AWS CloudTrail 로그를 사용하여 DynamoDB가 사용자 대신 AWS KMS로 전송하는 요청을 추적할 수 있습니다.

`GenerateDataKey`, `Decrypt` 및 `CreateGrant` 요청은 이 섹션에서 다룹니다. 그리고 DynamoDB는 [DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) 작업을 사용하여 사용자가 선택한 KMS 키가 계정과 리전에 있는지 확인합니다. 그리고 [RetireGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_RetireGrant.html) 작업을 사용하여 사용자가 테이블을 삭제할 때 권한 부여를 제거합니다.

**GenerateDataKey**  
사용자가 테이블에서 영구 암호화를 활성화하면 DynamoDB가 고유한 테이블 키를 생성합니다. 테이블에 대한 KMS 키를 지정하는 *[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)* 요청을 AWS KMS로 보냅니다.  
`GenerateDataKey` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 사용자는 DynamoDB 서비스 계정입니다. 파라미터에는 KMS 키의 Amazon 리소스 이름(ARN), 256비트 키가 필요한 키 지정자, 테이블과 AWS 계정를 식별하는 [암호화 컨텍스트](#dynamodb-encryption-context)가 포함됩니다.  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AWSService", 
        "invokedBy": "dynamodb.amazonaws.com" 
    },
    "eventTime": "2018-02-14T00:15:17Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "aws:dynamodb:tableName": "Services",
            "aws:dynamodb:subscriberId": "111122223333"
        }, 
        "keySpec": "AES_256", 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab"
    }, 
    "responseElements": null,
    "requestID": "229386c1-111c-11e8-9e21-c11ed5a52190",
    "eventID": "e3c436e9-ebca-494e-9457-8123a1f5e979",
    "readOnly": true,
    "resources": [
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333",
            "type": "AWS::KMS::Key" 
        } 
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333",
    "sharedEventID": "bf915fa6-6ceb-4659-8912-e36b69846aad"
}
```

**Decrypt**  
암호화된 DynamoDB 테이블에 액세스하면 DynamoDB가 테이블 키를 해독해야만 계층에서 그 아래에 있는 키를 해독할 수 있습니다. 이후 테이블에 있는 데이터를 해독합니다. 테이블 키를 복호화하려면 DynamoDB는 테이블에 대한 KMS 키를 지정하는 AWS KMS로 [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 요청을 보냅니다.  
`Decrypt` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 사용자는 테이블에 액세스 중인 AWS 계정에 있는 보안 주체입니다. 파라미터에는 암호화된 테이블 키(암호화 텍스트 blob)와, 테이블 및 AWS 계정를 식별하는 [암호화 컨텍스트](#dynamodb-encryption-context)가 포함됩니다. AWS KMS는 암호화 텍스트에서 KMS 키의 ID를 파생합니다.  

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAIGDTESTANDEXAMPLE:user01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T16:42:15Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAIGDT3HGFQZX4RY6RU",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin" 
            }
        },
        "invokedBy": "dynamodb.amazonaws.com"
    },
    "eventTime": "2018-02-14T16:42:39Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "dynamodb.amazonaws.com",
    "userAgent": "dynamodb.amazonaws.com",
    "requestParameters": 
    {
        "encryptionContext":
        {
            "aws:dynamodb:tableName": "Books",
            "aws:dynamodb:subscriberId": "111122223333" 
        }
    }, 
    "responseElements": null, 
    "requestID": "11cab293-11a6-11e8-8386-13160d3e5db5",
    "eventID": "b7d16574-e887-4b5b-a064-bf92f8ec9ad3", 
    "readOnly": true, 
    "resources": [ 
        {
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        }
    ],
    "eventType": "AwsApiCall", 
    "recipientAccountId": "111122223333"
}
```

**CreateGrant**  
[고객 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk) 또는 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하여 DynamoDB 테이블을 보호하면 DynamoDB는 [권한 부여](#dynamodb-grants)를 사용하여 서비스가 지속적 데이터 보호와 유지 관리 및 내구성 태스크를 수행하도록 허용합니다. 이러한 권한 부여가 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)에서는 필요하지 않습니다.  
DynamoDB가 생성하는 권한 부여는 테이블마다 다릅니다. [CreateGrant](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateGrant.html) 요청에 있는 주체는 테이블을 생성한 사용자입니다.  
`CreateGrant` 작업을 기록하는 이벤트는 다음 예시 이벤트와 유사합니다. 파라미터에는 테이블에 대한 KMS 키의 Amazon 리소스 이름(ARN), 피부여자 주체 및 삭제 주체(DynamoDB 서비스), 권한 부여가 적용되는 작업이 포함됩니다. 모든 암호화 작업에서 지정된 [암호화 컨텍스트](#dynamodb-encryption-context)를 사용할 것을 요구하는 제한도 포함됩니다.  

```
{ 
    "eventVersion": "1.05", 
    "userIdentity": 
    { 
        "type": "AssumedRole", 
        "principalId": "AROAIGDTESTANDEXAMPLE:user01", 
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/user01", 
        "accountId": "111122223333", 
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
        "sessionContext": { 
            "attributes": { 
                "mfaAuthenticated": "false", 
                "creationDate": "2018-02-14T00:12:02Z" 
            }, 
            "sessionIssuer": { 
                "type": "Role", 
                "principalId": "AROAIGDTESTANDEXAMPLE", 
                "arn": "arn:aws:iam::111122223333:role/Admin", 
                "accountId": "111122223333", 
                "userName": "Admin" 
            }
        }, 
        "invokedBy": "dynamodb.amazonaws.com" 
    }, 
    "eventTime": "2018-02-14T00:15:15Z", 
    "eventSource": "kms.amazonaws.com", 
    "eventName": "CreateGrant", 
    "awsRegion": "us-west-2", 
    "sourceIPAddress": "dynamodb.amazonaws.com", 
    "userAgent": "dynamodb.amazonaws.com", 
    "requestParameters": { 
        "keyId": "1234abcd-12ab-34cd-56ef-1234567890ab", 
        "retiringPrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "constraints": { 
            "encryptionContextSubset": {
                "aws:dynamodb:tableName": "Books",
                "aws:dynamodb:subscriberId": "111122223333" 
            } 
        }, 
        "granteePrincipal": "dynamodb.us-west-2.amazonaws.com", 
        "operations": [ 
            "DescribeKey", 
            "GenerateDataKey", 
            "Decrypt", 
            "Encrypt", 
            "ReEncryptFrom", 
            "ReEncryptTo", 
            "RetireGrant" 
        ] 
    }, 
    "responseElements": { 
        "grantId": "5c5cd4a3d68e65e77795f5ccc2516dff057308172b0cd107c85b5215c6e48bde" 
    }, 
    "requestID": "2192b82a-111c-11e8-a528-f398979205d8", 
    "eventID": "a03d65c3-9fee-4111-9816-8bf96b73df01", 
    "readOnly": false, 
    "resources": [ 
        { 
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab",
            "accountId": "111122223333", 
            "type": "AWS::KMS::Key" 
        } 
    ], 
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

# DynamoDB의 암호화된 테이블 관리
<a name="encryption.tutorial"></a>

AWS Management Console 또는 AWS Command Line Interface(AWS CLI)를 사용해 새로운 테이블에 암호화 키를 지정하고 Amazon DynamoDB에 있는 기존 테이블의 암호화 키를 업데이트할 수 있습니다.

**Topics**
+ [새 테이블에 대한 암호화 키 지정](#encryption.tutorial-creating)
+ [암호화 키 업데이트](#encryption.tutorial-update)

## 새 테이블에 대한 암호화 키 지정
<a name="encryption.tutorial-creating"></a>

Amazon DynamoDB 콘솔 또는 AWS CLI를 이용해 새로운 테이블에 암호화 키를 지정하기 위해 다음 단계를 따르세요.

### 암호화된 테이블 생성(콘솔)
<a name="encryption.tutorial-console"></a>

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1.  콘솔 왼쪽의 탐색 창에서 **테이블(Tables)**을 선택합니다.

1. **Create Table(테이블 생성)**을 선택합니다. **테이블 이름**에 **Music**을 입력합니다. 기본 키의 경우 **Artist**를, 정렬 키의 경우 **SongTitle**을 각각 문자열로 입력합니다.

1. **설정(Settings)**에서 **설정 사용자 지정(Customize settings)**이 선택되었는지 확인합니다.
**참고**  
**기본 설정 사용**을 선택한 경우 AWS 소유 키를 사용하여 무료로 테이블이 저장 중 암호화됩니다.

1. **Encryption at rest**(유휴 시 암호화)에서 암호화 유형 -AWS 소유 키, AWS 관리형 키, 또는 고객 관리 키를 선택합니다.
   +  **Owned by Amazon DynamoDB.**(Amazon DynamoDB가 소유.) AWS 소유 키로, 구체적으로는 DynamoDB가 소유하고 관리합니다. 이 키 사용에 대한 추가 요금은 부과되지 않습니다.
   + **AWS 관리형 키**. 키 별칭: `aws/dynamodb`. 이 키는 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
   +  **계정에 저장되며 본인이 소유하고 관리합니다.** 고객 관리형 키. 이 키는 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
**참고**  
자체 키 소유 및 관리를 선택하는 경우 KMS 키 정책이 적절하게 설정되었는지 확인합니다. 예를 포함한 자세한 내용은 [고객 관리형 키에 대한 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)을 참조하세요.

1. **테이블 생성(Create table)**을 선택하여 암호화된 테이블을 생성합니다. 암호화 유형을 확인하려면 **개요(Overview)** 탭의 테이블 세부 정보를 클릭하고 **추가 세부 정보(Additional details)** 섹션을 검토합니다.

### 암호화된 테이블 생성(AWS CLI)
<a name="encryption.tutorial-cli"></a>

AWS CLI를 사용해 Amazon DynamoDB용 기본 AWS 소유 키, AWS 관리형 키 또는 고객 관리형 키가 있는 테이블을 생성합니다.

**기본 AWS 소유 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5
  ```
**참고**  
이 테이블은 이제 DynamoDB 서비스 계정에서 기본 AWS 소유 키를 사용하여 암호화됩니다.

**DynamoDB용 AWS 관리형 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS
  ```

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**DynamoDB용 고객 관리형 키를 사용하여 암호화된 테이블을 생성하려면**
+ 다음과 같이 암호화된 `Music` 테이블을 생성합니다.

  ```
  aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=10,WriteCapacityUnits=5 \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**참고**  
`KMSMasterKeyId`의 경우 키 ID, 키 ARN 또는 키 별칭을 사용할 수 있습니다. 키 별칭(예: `alias/my-key`)을 사용하는 경우 DynamoDB는 별칭을 확인하고 기본 AWS KMS 키를 테이블과 연결합니다. 테이블 설명에서 `KMSMasterKeyArn`은 항상 별칭이 아닌 확인된 키의 키 ARN을 표시합니다. 키 식별자에 대한 자세한 내용은 *AWS Key Management Service 개발자 가이드*의 [키 식별자(KeyId)](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id)를 참조하세요.

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

## 암호화 키 업데이트
<a name="encryption.tutorial-update"></a>

또한 언제든지 DynamoDB 콘솔 또는 AWS CLI를 사용하여 AWS 소유 키, AWS 관리형 키, 고객 관리형 키 중에서 기존 테이블의 암호화 키를 업데이트할 수 있습니다.

### 암호화 키 업데이트(콘솔)
<a name="encryption.tutorial-update-console"></a>

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1.  콘솔 왼쪽의 탐색 창에서 **테이블(Tables)**을 선택합니다.

1. 업데이트할 테이블을 선택합니다.

1. **작업(Actions)** 드롭다운을 선택한 다음에 **설정 업데이트(Update settings)** 옵션을 선택합니다.

1. **추가 설정(Additional settings)** 탭으로 이동합니다.

1. **암호화(Encryption)**에서 **암호화 관리(Manage encryption)**를 선택합니다.

1. 다음과 같이 암호화 유형을 선택합니다.
   +  **Amazon DynamoDB 소유.** AWS KMS 키는 DynamoDB에서 소유하고 관리합니다. 이 키 사용에 대한 추가 요금은 부과되지 않습니다.
   + **AWS 관리형 키** 키 별칭: `aws/dynamodb`. 이 키는 사용자의 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
   +  **계정에 저장되며 본인이 소유하고 관리합니다.** 이 키는 사용자의 계정에 저장되고 AWS Key Management Service에서 관리합니다(AWS KMS). AWS KMS 비용이 적용됩니다.
**참고**  
자체 키 소유 및 관리를 선택하는 경우 KMS 키 정책이 적절하게 설정되었는지 확인합니다. 자세한 내용은 [ 고객 관리형 키에 대한 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)을 참조하세요.

   그런 다음 **저장**을 선택하여 암호화된 테이블을 업데이트합니다. 암호화 유형을 확인하려면 **개요** 탭에서 테이블 세부 정보를 확인하세요.

### 암호화 키 업데이트(AWS CLI)
<a name="encryption.tutorial-update-cli"></a>

다음 예에서는 AWS CLI를 사용해 암호화된 테이블을 업데이트하는 방법을 보여줍니다.

**기본 AWS 소유 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=false
  ```
**참고**  
이 테이블은 이제 DynamoDB 서비스 계정에서 기본 AWS 소유 키를 사용하여 암호화됩니다.

**DynamoDB용 AWS 관리형 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true
  ```

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

**DynamoDB용 고객 관리형 키를 사용하여 암호화된 테이블을 업데이트하려면**
+ 암호화된 `Music` 테이블을 다음 예와 같이 업데이트합니다.

  ```
  aws dynamodb update-table \
    --table-name Music \
    --sse-specification Enabled=true,SSEType=KMS,KMSMasterKeyId=abcd1234-abcd-1234-a123-ab1234a1b234
  ```
**참고**  
`KMSMasterKeyId`의 경우 키 ID, 키 ARN 또는 키 별칭을 사용할 수 있습니다. 키 별칭(예: `alias/my-key`)을 사용하는 경우 DynamoDB는 별칭을 확인하고 기본 AWS KMS 키를 테이블과 연결합니다. 테이블 설명에서 `KMSMasterKeyArn`은 항상 별칭이 아닌 확인된 키의 키 ARN을 표시합니다.

   테이블 설명의 `SSEDescription` 상태는 `ENABLED`로 설정되고 `SSEType`은 `KMS`입니다.

  ```
  "SSEDescription": {
    "SSEType": "KMS",
    "Status": "ENABLED",
    "KMSMasterKeyArn": "arn:aws:kms:us-east-1:123456789012:key/abcd1234-abcd-1234-a123-ab1234a1b234",
  }
  ```

# VPC 엔드포인트 및 IAM 정책을 사용하여 DynamoDB 연결 보호
<a name="inter-network-traffic-privacy"></a>

Amazon DynamoDB와 온프레미스 애플리케이션 사이 연결을 비롯해 DynamoDB와 동일한 AWS 리전의 다른 AWS 리소스 사이 연결이 보호를 받습니다.

## 엔드포인트에 필요한 정책
<a name="inter-network-traffic-DescribeEndpoints"></a>

Amazon DynamoDB는 리전 엔드포인트 정보를 열거하도록 해 주는 [DescribeEndpoints](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeEndpoints.html) API를 제공합니다. 퍼블릭 DynamoDB 엔드포인트에 대한 요청의 경우 IAM 또는 VPC 엔드포인트 정책에 명시적 거부 또는 암시적 거부가 있더라도 API는 구성된 DynamoDB IAM 정책에 관계없이 응답합니다. 이는 DynamoDB가 의도적으로 `DescribeEndpoints` API에 대한 권한을 건너뛰기 때문입니다.

VPC 엔드포인트에서 요청하려면 IAM 및 Virtual Private Cloud(VPC) 엔드포인트 정책이 모두 IAM `dynamodb:DescribeEndpoints` 작업을 사용하여 요청하는 Identity and Access Management(IAM) 보안 주체에 대한 `DescribeEndpoints` API 호출을 승인해야 합니다. 그렇지 않은 경우 `DescribeEndpoints` API에 대한 액세스가 거부됩니다.

다음은 엔드포인트 정책의 예입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "dynamodb:DescribeEndpoints",
            "Resource": "*"
        }
    ]
}
```

------

## 서비스와 온프레미스 클라이언트 및 애플리케이션 간의 트래픽
<a name="inter-network-traffic-privacy-on-prem"></a>

프라이빗 네트워크와 AWS 사이에 두 연결 옵션이 있습니다.
+ AWS Site-to-Site VPN 연결. 자세한 내용은 *AWS Site-to-Site VPN 사용 설명서*의 [AWS Site-to-Site VPN란 무엇입니까?](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하세요.
+ Direct Connect 연결. 자세한 내용은 *Direct Connect 사용 설명서*의 [Direct Connect란 무엇입니까?](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)를 참조하세요.

네트워크를 통한 DynamoDB 액세스는 AWS에서 게시한 API를 통해 이루어집니다. 클라이언트가 Transport Layer Security(TLS) 1.2를 지원해야 합니다. TLS 1.3을 권장합니다. 클라이언트는 DHE(Ephemeral Diffie-Hellman) 또는 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)와 같은 PFS(전달 완전 보안)가 포함된 암호 제품군도 지원해야 합니다. Java 7 이상의 최신 시스템은 대부분 이러한 모드를 지원합니다. 또한, 액세스 키 ID와 IAM 보안 주체와 관련된 비밀 액세스 키를 사용하여 요청에 서명하거나 [AWS Security Token Service(STS)](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)를 사용하여 요청에 서명할 수 있는 임시 보안 자격 증명을 생성할 수 있습니다.

## 같은 리전에 있는 AWS 리소스 사이의 트래픽
<a name="inter-network-traffic-privacy-within-region"></a>

DynamoDB용 Amazon Virtual Private Cloud(Amazon VPC) 엔드포인트는 VPC 내의 논리적 엔터티로서, DynamoDB에만 연결을 허용합니다. Amazon VPC는 DynamoDB로 요청을 라우팅하고, 응답을 다시 VPC로 라우팅합니다. 자세한 내용은 *Amazon VPC 사용 설명서*의 [VPC 엔드포인트](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)를 참조하세요. VPC 엔드포인트의 액세스 제어에 사용할 수 있는 정책의 예는 [IAM 정책을 사용하여 DynamoDB에 대한 액세스 제어](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-ddb.html)를 참조하세요.

**참고**  
Amazon VPC 엔드포인트는 AWS Site-to-Site VPN 또는 Direct Connect를 통해 액세스할 수 없습니다.

# AWS Identity and Access Management(IAM) 및 DynamoDB
<a name="identity-and-access-mgmt"></a>

 AWS Identity and Access Management는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있도록 지원하는 AWS 서비스입니다. 관리자는 Amazon DynamoDB 및 DynamoDB Accelerator 리소스를 사용하기 위해 인증되고(로그인되고) 권한을 부여받을 수 있는(권한 있는) 사용자를 제어합니다. IAM을 사용하여 Amazon DynamoDB 및 DynamoDB Accelerator 모두에 대한 액세스 권한을 관리하고 보안 정책을 구현할 수 있습니다. IAM은 추가 비용 없이 사용할 수 있는 AWS 서비스입니다.

 

**Topics**
+ [Amazon DynamoDB의 Identity and Access Management](security-iam.md)
+ [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)

# Amazon DynamoDB의 Identity and Access Management
<a name="security-iam"></a>





AWS Identity and Access Management(IAM)는 관리자가 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있도록 지원하는 AWS 서비스입니다. IAM 관리자는 누가 DynamoDB 리소스를 사용하도록 *인증*되고(로그인됨) *권한이 부여*되는지(권한 있음)를 제어합니다. IAM은 추가 비용 없이 사용할 수 있는 AWS 서비스입니다.

**Topics**
+ [고객](#security_iam_audience)
+ [ID를 통한 인증](#security_iam_authentication)
+ [정책을 사용하여 액세스 관리](#security_iam_access-manage)
+ [Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md)
+ [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md)
+ [Amazon DynamoDB 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md)
+ [DynamoDB 예약 용량 구매를 방지하는 IAM 정책](iam-policy-prevent-purchase-reserved-capacity.md)

## 고객
<a name="security_iam_audience"></a>

AWS Identity and Access Management(IAM)를 사용하는 방법은 역할에 따라 다릅니다.
+ **서비스 사용자** - 기능에 액세스할 수 없는 경우 관리자에게 권한 요청(참조[Amazon DynamoDB 자격 증명 및 액세스 문제 해결](security_iam_troubleshoot.md))
+ **서비스 관리자** - 사용자 액세스 결정 및 권한 요청 제출([Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 참조)
+ **IAM 관리자** - 액세스를 관리하기 위한 정책 작성([Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 참조)

## ID를 통한 인증
<a name="security_iam_authentication"></a>

인증은 ID 자격 증명을 사용하여 AWS에 로그인하는 방식입니다. AWS 계정 루트 사용자이나 IAM 사용자로, 또는 IAM 역할을 수임하여 인증(에 로그인)받아야 합니다.

AWS IAM Identity Center(IAM Identity Center), Single Sign-On 인증 또는 Google/Facebook 자격 증명과 같은 자격 증명 소스의 자격 증명을 사용하여 페더레이션 ID로 로그인할 수 있습니다. 로그인하는 방법에 대한 자세한 내용은 *AWS Sign-In사용 설명서*의 [AWS 계정에 로그인하는 방법](https://docs.aws.amazon.com/signin/latest/userguide/how-to-sign-in.html) 섹션을 참조하세요.

프로그래밍 방식 액세스를 위해 AWS는 요청에 암호화 방식으로 서명할 수 있는 SDK 및 CLI를 제공합니다. 자세한 내용은 *IAM 사용 설명서*의 [API 요청용 AWS Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html) 섹션을 참조하세요.

### AWS 계정 루트 사용자
<a name="security_iam_authentication-rootuser"></a>

 AWS 계정을 생성하는 경우에는 모든 AWS 서비스 서비스와 리소스에 대한 완전한 액세스 권한이 있는 AWS 계정 *루트 사용자*라는 단일 로그인 ID로 시작합니다. 일상적인 태스크에 루트 사용자를 사용하지 않을 것을 강력히 권장합니다. 루트 사용자 자격 증명이 필요한 작업은 *IAM 사용 설명서*의 [루트 사용자 자격 증명이 필요한 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks) 섹션을 참조하세요.

### 페더레이션 ID
<a name="security_iam_authentication-federated"></a>

가장 좋은 방법은 인간 사용자가 ID 공급자와의 페더레이션을 사용하여 임시 자격 증명으로 AWS 서비스에 액세스하도록 하는 것입니다.

*페더레이션 ID*는 엔터프라이즈 사용자 디렉터리, 웹 ID 제공업체 또는 Directory Service의 사용자로, ID의 자격 증명을 사용하여 AWS 서비스에 액세스합니다. 페더레이션 ID는 임시 자격 증명을 제공하는 역할을 수임합니다.

중앙 집중식 액세스 관리를 위해 AWS IAM Identity Center를 추천합니다. 자세한 정보는 *AWS IAM Identity Center사용 설명서*의 [What is IAM Identity Center?](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)를 참조하세요.

### IAM 사용자 및 그룹
<a name="security_iam_authentication-iamuser"></a>

*[IAM 사용자](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html)*는 단일 개인 또는 애플리케이션에 대한 특정 권한을 가진 ID입니다. 장기 자격 증명이 있는 IAM 사용자 대신 임시 자격 증명을 사용하는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*에서 [임시 자격 증명을 사용하여 AWS에 액세스하려면 인간 사용자가 ID 제공업체와의 페더레이션을 사용하도록 요구](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)를 참조하세요.

[https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups.html)은 IAM 사용자 모음을 지정하고 대규모 사용자 집합에 대한 관리 권한을 더 쉽게 만듭니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM 사용자 사용 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/gs-identities-iam-users.html) 섹션을 참조하세요.

### IAM 역할
<a name="security_iam_authentication-iamrole"></a>

*[IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)*은 임시 자격 증명을 제공하는 특정 권한이 있는 자격 증명입니다. [사용자에서 IAM 역할(콘솔)로 전환](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)하거나 AWS CLI 또는 AWS API 작업을 직접적으로 호출하여 역할을 수임할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [역할 수임 방법](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage-assume.html)을 참조하세요.

IAM 역할은 페더레이션 사용자 액세스, 임시 IAM 사용자 권한, 교차 계정 액세스, 교차 서비스 액세스 및 Amazon EC2에서 실행되는 애플리케이션에 유용합니다. 자세한 내용은 *IAM 사용 설명서*의 [교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## 정책을 사용하여 액세스 관리
<a name="security_iam_access-manage"></a>

정책을 생성하고 AWS ID 또는 리소스에 연결하여 AWS에서 내 액세스를 제어합니다. 정책은 자격 증명이나 리소스와 연결될 때 해당 권한을 정의합니다. AWS는 보안 주체가 요청을 보낼 때 이러한 정책을 평가합니다. 대부분의 정책은 AWS에 JSON 문서로 저장됩니다. JSON 정책 문서에 대한 자세한 내용은 *IAM 사용 설명서*의 [JSON 정책 개요](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policies-json) 섹션을 참조하세요.

정책을 사용하여 관리자는 어떤 **보안 주체**가 어떤 **리소스**에 대해 어떤 **조건**에서 **작업**을 수행할 수 있는지 정의하여 누가 무엇을 액세스할 수 있는지 지정합니다.

기본적으로 사용자 및 역할에는 어떠한 권한도 없습니다. IAM 관리자는 IAM 정책을 생성하고 사용자가 수임할 수 있는 역할에 추가합니다. IAM 정책은 작업을 수행하기 위해 사용하는 방법과 관계없이 작업에 대한 권한을 정의합니다.

### ID 기반 정책
<a name="security_iam_access-manage-id-based-policies"></a>

ID 기반 정책은 ID(사용자, 사용자 그룹 또는 역할)에 연결하는 JSON 권한 정책 문서입니다. 이러한 정책은 자격 증명이 수행할 수 있는 작업, 대상 리소스 및 이에 관한 조건을 제어합니다. ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

ID 기반 정책은 *인라인 정책*(단일 ID에 직접 포함) 또는 *관리형 정책*(여러 ID에 연결된 독립 실행형 정책)일 수 있습니다. 관리형 정책 또는 인라인 정책을 선택하는 방법을 알아보려면 *IAM 사용 설명서*의 [관리형 정책 및 인라인 정책 중에서 선택](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html) 섹션을 참조하세요.

### 리소스 기반 정책
<a name="security_iam_access-manage-resource-based-policies"></a>

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 예를 들어 IAM *역할 신뢰 정책* 및 Amazon S3 *버킷 정책*이 있습니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다.

리소스 기반 정책은 해당 서비스에 있는 인라인 정책입니다. 리소스 기반 정책에서는 IAM의 AWS관리형 정책을 사용할 수 없습니다.

### 기타 정책 유형
<a name="security_iam_access-manage-other-policies"></a>

AWS는 이러한 정책 타입이 부여하는 최대 권한을 설정할 수 있는 추가 정책 타입을 지지합니다.
+ **권한 경계** - ID 기반 정책에서 IAM 엔터티에 부여할 수 있는 최대 권한을 설정합니다. 자세한 정보는 *IAM 사용 설명서*의 [IAM 엔터티의 권한 범위](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)를 참조하세요.
+ **서비스 제어 정책(SCP)** - AWS Organizations내 조직 또는 조직 단위에 대한 최대 권한을 지정합니다. 자세한 내용은 AWS Organizations사용 설명서의 [서비스 제어 정책](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)을 참조하세요.**
+ **리소스 제어 정책(RCP)** – 계정의 리소스에 사용할 수 있는 최대 권한을 설정합니다. 자세한 내용은 *AWS Organizations사용 설명서*의 [리소스 제어 정책(RCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_rcps.html)을 참조하세요.
+ **세션 정책** – 역할 또는 페더레이션 사용자에 대해 임시 세션을 프로그래밍 방식으로 생성할 때 파라미터로 전달하는 고급 정책입니다. 자세한 내용은 *IAM 사용 설명서*의 [세션 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)을 참조하세요.

### 여러 정책 유형
<a name="security_iam_access-manage-multiple-policies"></a>

여러 정책 유형이 요청에 적용되는 경우, 결과 권한은 이해하기가 더 복잡합니다. 여러 정책 유형이 관련될 때 AWS가 요청을 허용할지 여부를 결정하는 방법을 알아보려면 *IAM 사용 설명서*의 [정책 평가 로직](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)을 참조하세요.

# Amazon DynamoDB에서 IAM을 사용하는 방법
<a name="security_iam_service-with-iam"></a>

IAM을 사용하여 DynamoDB에 대한 액세스를 관리하기 전에 DynamoDB와 함께 사용할 수 있는 IAM 기능을 알아보세요.






| IAM 특성 | DynamoDB 지원 | 
| --- | --- | 
|  [자격 증명 기반 정책](#security_iam_service-with-iam-id-based-policies)  |   예  | 
|  [리소스 기반 정책](#security_iam_service-with-iam-resource-based-policies)  |   예  | 
|  [정책 작업](#security_iam_service-with-iam-id-based-policies-actions)  |   예  | 
|  [정책 리소스](#security_iam_service-with-iam-id-based-policies-resources)  |   예  | 
|  [정책 조건 키](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   예  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   아니요   | 
|  [ABAC(정책의 태그)](#security_iam_service-with-iam-tags)  |   예  | 
|  [임시 보안 인증](#security_iam_service-with-iam-roles-tempcreds)  |   예  | 
|  [엔터티 권한](#security_iam_service-with-iam-principal-permissions)  |   예  | 
|  [서비스 역할](#security_iam_service-with-iam-roles-service)  |   예  | 
|  [서비스 연결 역할](#security_iam_service-with-iam-roles-service-linked)  |   예  | 

DynamoDB 및 기타 AWS 서비스가 대부분의 IAM 기능과 작동하는 방법을 개괄적으로 알아보려면 *IAM 사용 설명서*의 [IAM으로 작업하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)를 참조하세요.

## DynamoDB에 대한 자격 증명 기반 정책
<a name="security_iam_service-with-iam-id-based-policies"></a>

**ID 기반 정책 지원:** 예

ID 기반 정책은 IAM 사용자, 사용자 그룹 또는 역할과 같은 ID에 연결할 수 있는 JSON 권한 정책 문서입니다. 이러한 정책은 사용자 및 역할이 어떤 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 제어합니다. 자격 증명 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*에서 [고객 관리형 정책으로 사용자 지정 IAM 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)를 참조하세요.

IAM ID 기반 정책을 사용하면 허용되거나 거부되는 작업과 리소스뿐 아니라 작업이 허용되거나 거부되는 조건을 지정할 수 있습니다. JSON 정책에서 사용할 수 있는 모든 요소에 대해 알아보려면 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)를 참조하세요.

### DynamoDB 자격 증명 기반 정책 예제
<a name="security_iam_service-with-iam-id-based-policies-examples"></a>



DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB 내 리소스 기반 정책
<a name="security_iam_service-with-iam-resource-based-policies"></a>

**리소스 기반 정책 지원:** 예

리소스 기반 정책은 리소스에 연결하는 JSON 정책 설명서입니다. 리소스 기반 정책의 예제는 IAM *역할 신뢰 정책*과 Amazon S3 *버킷 정책*입니다. 리소스 기반 정책을 지원하는 서비스에서 서비스 관리자는 이러한 정책을 사용하여 특정 리소스에 대한 액세스를 통제할 수 있습니다. 정책이 연결된 리소스의 경우 정책은 지정된 보안 주체가 해당 리소스와 어떤 조건에서 어떤 작업을 수행할 수 있는지를 정의합니다. 리소스 기반 정책에서 [보안 주체를 지정](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html)해야 합니다. 위탁자에는 계정, 사용자, 역할, 페더레이션 사용자 또는 AWS 서비스가 포함될 수 있습니다.

교차 계정 액세스를 활성화하려는 경우, 전체 계정이나 다른 계정의 IAM 개체를 리소스 기반 정책의 보안 주체로 지정할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM에서 교차 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

## DynamoDB의 정책 작업
<a name="security_iam_service-with-iam-id-based-policies-actions"></a>

**정책 작업 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

JSON 정책의 `Action`요소는 정책에서 액세스를 허용하거나 거부하는 데 사용할 수 있는 작업을 설명합니다. 연결된 작업을 수행할 수 있는 권한을 부여하기 위한 정책에 작업을 포함하세요.



DynamoDB 작업 목록을 보려면 *서비스 권한 부여 참조*에서 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.

DynamoDB의 정책 작업은 작업 앞에 다음 접두사를 사용합니다.

```
aws
```

단일 문에서 여러 작업을 지정하려면 쉼표로 구분합니다.

```
"Action": [
      "aws:action1",
      "aws:action2"
         ]
```





DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 정책 리소스
<a name="security_iam_service-with-iam-id-based-policies-resources"></a>

**정책 리소스 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Resource` JSON 정책 요소는 작업이 적용되는 하나 이상의 객체를 지정합니다. 모범 사례에 따라 [Amazon 리소스 이름(ARN)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)을 사용하여 리소스를 지정합니다. 리소스 수준 권한을 지원하지 않는 작업의 경우, 와일드카드(\$1)를 사용하여 해당 문이 모든 리소스에 적용됨을 나타냅니다.

```
"Resource": "*"
```

DynamoDB 리소스 유형 및 해당 ARN 목록을 보려면 *서비스 승인 참조*에서 [Amazon DynamoDB에서 정의한 리소스](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-resources-for-iam-policies)를 참조하세요. 각 리소스의 ARN을 지정할 수 있는 작업을 알아보려면 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.





DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 정책 조건 키
<a name="security_iam_service-with-iam-id-based-policies-conditionkeys"></a>

**서비스별 정책 조건 키 지원:** 예

관리자는 AWS JSON 정책을 사용하여 누가 무엇에 액세스할 수 있는지를 지정할 수 있습니다. 즉, 어떤 **보안 주체**가 어떤 **리소스**와 어떤 **조건**에서 **작업**을 수행할 수 있는지를 지정할 수 있습니다.

`Condition` 요소는 정의된 기준에 따라 문이 실행되는 시기를 지정합니다. 같음(equals) 또는 미만(less than)과 같은 [조건 연산자](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)를 사용하여 정책의 조건을 요청의 값과 일치시키는 조건식을 생성할 수 있습니다. 모든 AWS 전역 조건 키를 보려면 *IAM 사용자 설명서*의 [AWS 전역 조건 컨텍스트 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)를 참조하세요.

DynamoDB 조건 키 목록을 보려면 *서비스 승인 참조*에서 [Amazon DynamoDB에 사용되는 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-policy-keys)를 참조하세요. 조건 키를 사용할 수 있는 작업과 리소스를 알아보려면 [Amazon DynamoDB에서 정의한 작업](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html#amazondynamodb-actions-as-permissions)을 참조하세요.

DynamoDB 자격 증명 기반 정책의 예를 보려면 [Amazon DynamoDB 자격 증명 기반 정책 예제](security_iam_id-based-policy-examples.md) 섹션을 참조하세요.

## DynamoDB의 액세스 제어 목록(ACL)
<a name="security_iam_service-with-iam-acls"></a>

**ACL 지원:** 아니요 

액세스 제어 목록(ACL)은 어떤 보안 주체(계정 멤버, 사용자 또는 역할)가 리소스에 액세스할 수 있는 권한을 가지고 있는지를 제어합니다. ACL은 JSON 정책 문서 형식을 사용하지 않지만 리소스 기반 정책과 유사합니다.

## DynamoDB의 ABAC(속성 기반 액세스 제어)
<a name="security_iam_service-with-iam-tags"></a>

**ABAC 지원(정책의 태그):** 예

속성 기반 액세스 제어(ABAC)는 태그라고 불리는 속성을 기반으로 권한을 정의하는 권한 부여 전략입니다. IAM 엔터티 및 AWS 리소스에 태그를 연결하면 보안 주체의 태그가 리소스 태그와 일치할 때 작업을 허용하도록 ABAC 정책을 설계할 수 있습니다.

태그에 근거하여 액세스를 제어하려면 `aws:ResourceTag/key-name`, `aws:RequestTag/key-name`또는 `aws:TagKeys`조건 키를 사용하여 정책의 [조건 요소](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)에 태그 정보를 제공합니다.

서비스가 모든 리소스 유형에 대해 세 가지 조건 키를 모두 지원하는 경우, 값은 서비스에 대해 **예**입니다. 서비스가 일부 리소스 유형에 대해서만 세 가지 조건 키를 모두 지원하는 경우, 값은 **부분적**입니다.

ABAC에 대한 자세한 내용은 *IAM 사용 설명서*의 [ABAC 권한 부여를 통한 권한 정의](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)를 참조하세요. ABAC 설정 단계가 포함된 자습서를 보려면 *IAM 사용 설명서*의 [속성 기반 액세스 제어(ABAC) 사용](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)을 참조하세요.

## DynamoDB에서 임시 보안 인증 정보 사용
<a name="security_iam_service-with-iam-roles-tempcreds"></a>

**임시 자격 증명 지원:** 예

임시 자격 증명은 AWS리소스에 대한 단기 액세스를 제공하며 페더레이션 또는 전환 역할을 사용할 때 자동으로 생성됩니다. AWS에서는 장기 액세스 키를 사용하는 대신 임시 자격 증명을 동적으로 생성할 것을 권장합니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM의 임시 보안 자격 증명](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html) 및 [IAM으로 작업하는 AWS 서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html) 섹션을 참조하세요.

## DynamoDB의 서비스 간 보안 주체 권한
<a name="security_iam_service-with-iam-principal-permissions"></a>

**전달 액세스 세션(FAS) 지원:** 예

 전달 액세스 세션(FAS)은 AWS 서비스를 직접 호출하는 보안 주체의 권한과 요청하는 AWS 서비스를 함께 사용하여 다운스트림 서비스에 대한 요청을 수행합니다. FAS 요청 시 정책 세부 정보는 [전달 액세스 세션](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_forward_access_sessions.html)을 참조하세요.

## DynamoDB의 서비스 역할
<a name="security_iam_service-with-iam-roles-service"></a>

**서비스 역할 지원:** 예

 서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하는 것으로 가정하는 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 서비스 AWS에 권한을 위임할 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)을 참조하세요.

**주의**  
서비스 역할에 대한 권한을 변경하면 DynamoDB 기능이 중단될 수 있습니다. DynamoDB에서 관련 지침을 제공하는 경우에만 서비스 역할을 편집하세요.

## DynamoDB에 대한 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked"></a>

**서비스 연결 역할 지원:** 예

 서비스 연결 역할은 AWS 서비스에 연결된 서비스 역할의 한 유형입니다. 서비스는 사용자를 대신하여 작업을 수행하기 위해 역할을 수임할 수 있습니다. 서비스 연결 역할은 AWS 계정에 나타나고, 서비스가 소유합니다. IAM 관리자는 서비스 연결 역할의 권한을 볼 수 있지만 편집은 할 수 없습니다.

서비스 연결 역할 생성 또는 관리에 대한 자세한 내용은 [IAM으로 작업하는 AWS서비스](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)를 참조하세요. **서비스 연결 역할** 열에서 `Yes`가 포함된 서비스를 테이블에서 찾습니다. 해당 서비스에 대한 서비스 연결 역할 설명서를 보려면 **예(Yes)** 링크를 선택합니다.

### DynamoDB에서 지원되는 서비스 연결 역할
<a name="security_iam_service-with-iam-roles-service-linked-supported-by-dynamodb"></a>

DynamoDB에서는 다음과 같은 서비스 연결 역할이 지원됩니다.
+ DynamoDB는 여러 AWS 리전 간의 글로벌 테이블 복제를 위해 서비스 연결 역할 **AWSServiceRoleForDynamoDBReplication**을 사용합니다. **AWSServiceRoleForDynamoDBReplication** 서비스 연결 역할에 대한 자세한 내용은 [DynamoDB 글로벌 테이블 보안](globaltables-security.md) 섹션을 참조하세요.
+ DynamoDB Accelerator(DAX)는 DAX 클러스터를 구성하고 유지 관리하기 위해 서비스 연결 역할 **AWSServiceRoleForDAX**를 사용합니다. **AWSServiceRoleForDAX** 서비스 연결 역할에 대한 자세한 내용은 [DAX에 대한 서비스 연결 IAM 역할 사용](using-service-linked-roles.md) 섹션을 참조하세요.

이러한 DynamoDB 서비스 연결 역할 외에도 DynamoDB는 프로비저닝된 용량 모드 테이블에서 처리량 설정을 자동으로 관리하기 위해 Application Auto Scaling 서비스를 사용합니다. Application Auto Scaling 서비스는 오토 스케일링이 활성화된 DynamoDB 테이블의 처리량 설정을 관리하기 위해 서비스 연결 역할 **AWSServiceRoleForApplicationAutoScaling\$1DynamoDBTable**을 사용합니다. 자세한 내용은 [Application Auto Scaling에 대한 서비스 연결 역할](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)을 참조하세요.

# Amazon DynamoDB 자격 증명 기반 정책 예제
<a name="security_iam_id-based-policy-examples"></a>

기본적으로 사용자 및 역할에는 DynamoDB 리소스를 생성하거나 수정할 수 있는 권한이 없습니다. 사용자에게 사용자가 필요한 리소스에서 작업을 수행할 권한을 부여하려면 IAM 관리자가 IAM 정책을 생성하면 됩니다.

이러한 예제 JSON 정책 문서를 사용하여 IAM ID 기반 정책을 생성하는 방법을 알아보려면 *IAM 사용 설명서*의 [IAM 정책 생성(콘솔)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html)을 참조하세요.

각 리소스 유형에 대한 ARN 형식을 포함하여 DynamoDB에서 정의한 작업 및 리소스 유형에 대한 자세한 내용은 *서비스 승인 참조*에서 [Amazon DynamoDB에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html)를 참조하세요.

**Topics**
+ [정책 모범 사례](#security_iam_service-with-iam-policy-best-practices)
+ [DynamoDB 콘솔 사용](#security_iam_id-based-policy-examples-console)
+ [사용자가 자신의 고유한 권한을 볼 수 있도록 허용](#security_iam_id-based-policy-examples-view-own-permissions)
+ [Amazon DynamoDB에서 자격 증명 기반 정책 사용](using-identity-based-policies.md)

## 정책 모범 사례
<a name="security_iam_service-with-iam-policy-best-practices"></a>

자격 증명 기반 정책에 따라 계정에서 사용자가 DynamoDB 리소스를 생성, 액세스 또는 삭제할 수 있는지 여부가 결정됩니다. 이 작업으로 인해 AWS 계정에 비용이 발생할 수 있습니다. ID 기반 정책을 생성하거나 편집할 때는 다음 지침과 권장 사항을 따르세요.
+ **AWS 관리형 정책으로 시작하고 최소 권한을 향해 나아가기** - 사용자 및 워크로드에 권한 부여를 시작하려면 많은 일반 사용 사례에 대한 권한을 부여하는 *AWS관리형 정책*을 사용합니다. AWS 계정에서 사용할 수 있습니다. 사용 사례에 고유한 AWS고객 관리형 정책을 정의하여 권한을 줄이는 것이 좋습니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies) 또는 [AWS직무에 대한 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)을 참조하세요.
+ **최소 권한 적용** – IAM 정책을 사용하여 권한을 설정하는 경우, 작업을 수행하는 데 필요한 권한만 부여합니다. 이렇게 하려면 *최소 권한*으로 알려진 특정 조건에서 특정 리소스에 대해 수행할 수 있는 작업을 정의합니다. IAM을 사용하여 권한을 적용하는 방법에 대한 자세한 정보는 *IAM 사용 설명서*에 있는 [IAM의 정책 및 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)을 참조하세요.
+ **IAM 정책의 조건을 사용하여 액세스 추가 제한** – 정책에 조건을 추가하여 작업 및 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어, SSL을 사용하여 모든 요청을 전송해야 한다고 지정하는 정책 조건을 작성할 수 있습니다. CloudFormation와 같이, 특정 AWS 서비스를 통해 사용되는 경우에만 서비스 작업에 대한 액세스 권한을 부여할 수도 있습니다. 자세한 내용은 *IAM 사용자 설명서*의 [IAM JSON 정책 요소: 조건](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html)을 참조하세요.
+ **IAM Access Analyzer를 통해 IAM 정책을 확인하여 안전하고 기능적인 권한 보장** - IAM Access Analyzer에서는 IAM 정책 언어(JSON)와 모범 사례가 정책에서 준수되도록 새로운 및 기존 정책을 확인합니다. IAM Access Analyzer는 100개 이상의 정책 확인 항목과 실행 가능한 추천을 제공하여 안전하고 기능적인 정책을 작성하도록 돕습니다. 자세한 내용은 *IAM 사용 설명서*의 [IAM Access Analyzer에서 정책 검증](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-policy-validation.html)을 참조하세요.
+ **다중 인증(MFA) 필요** – AWS 계정에 IAM 사용자 또는 루트 사용자가 필요한 시나리오가 있는 경우, 추가 보안을 위해 MFA를 설정합니다. API 작업을 직접적으로 호출할 때 MFA가 필요하면 정책에 MFA 조건을 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [MFA를 통한 보안 API 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)를 참조하세요.

IAM의 모범 사례에 대한 자세한 내용은 *IAM 사용 설명서*의 [IAM의 보안 모범 사례](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)를 참조하세요.

## DynamoDB 콘솔 사용
<a name="security_iam_id-based-policy-examples-console"></a>

Amazon DynamoDB 콘솔에 액세스하려면 최소한의 권한 집합이 있어야 합니다. 이러한 권한은 AWS 계정에서 DynamoDB 리소스에 대한 세부 정보를 나열하고 볼 수 있도록 허용해야 합니다. 최소 필수 권한보다 더 제한적인 ID 기반 정책을 생성하는 경우, 콘솔이 해당 정책에 연결된 엔티티(사용자 또는 역할)에 대해 의도대로 작동하지 않습니다.

AWS CLI 또는 AWS API만 직접적으로 호출하는 사용자에게 최소 콘솔 권한을 허용할 필요가 없습니다. 대신, 수행하려는 API 작업과 일치하는 작업에만 액세스할 수 있도록 합니다.

사용자와 역할이 DynamoDB 콘솔을 여전히 사용할 수 있도록 하려면 DynamoDB `ConsoleAccess` 또는 `ReadOnly` AWS 관리형 정책을 엔터티에 추가합니다. 자세한 내용은 *IAM 사용 설명서*의 [사용자에게 권한 추가](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)를 참조하세요.

## 사용자가 자신의 고유한 권한을 볼 수 있도록 허용
<a name="security_iam_id-based-policy-examples-view-own-permissions"></a>

이 예제는 IAM 사용자가 자신의 사용자 ID에 연결된 인라인 및 관리형 정책을 볼 수 있도록 허용하는 정책을 생성하는 방법을 보여줍니다. 이 정책에는 콘솔에서 또는 AWS CLI나 AWS API를 사용하여 프로그래밍 방식으로 이 작업을 완료할 수 있는 권한이 포함됩니다.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

# Amazon DynamoDB에서 자격 증명 기반 정책 사용
<a name="using-identity-based-policies"></a>

이 항목에서는 Amazon DynamoDB에서 AWS Identity and Access Management(IAM) 정책을 사용하는 방법을 설명하고 예시를 제공합니다. 이 예제에서는 계정 관리자가 IAM 자격 증명(사용자, 그룹, 역할)에 권한 정책을 연결함으로써 Amazon DynamoDB 리소스에 대한 작업을 수행할 권한을 부여하는 방법을 보여 줍니다.

이 주제의 섹션에서는 다음 내용을 학습합니다.
+ [Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한](#console-permissions)
+ [Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책](#access-policy-examples-aws-managed)
+ [고객 관리형 정책 예제](#access-policy-examples-for-sdk-cli)



다음은 권한 정책의 예제입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DescribeQueryScanBooksTable",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:Query",
                "dynamodb:Scan"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:111122223333:table/Books"
        }
    ]
}
```

------

 앞의 정책에는 `account-id`에 의해 지정된 AWS 계정이 소유하는 `us-west-2` AWS 리전 내 테이블에서 세 가지 DynamoDB 작업(`dynamodb:DescribeTable`, `dynamodb:Query`, 및 `dynamodb:Scan`)에 대한 권한을 부여하는 문이 하나 있습니다. `Resource` 값의 *Amazon 리소스 이름(ARN)*은 권한이 적용되는 테이블을 지정합니다.

## Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한
<a name="console-permissions"></a>

사용자가 DynamoDB 콘솔로 작업하려면 AWS 계정의 DynamoDB 리소스로 작업하도록 허용하는 최소 권한 집합이 있어야 합니다. 이 DynamoDB 권한 이외에 콘솔에는 다음 권한이 필요합니다.
+ 지표 및 그래프를 표시할 수 있는 Amazon CloudWatch 권한
+ AWS Data PipelineDynamoDB 데이터를 내보내고 가져오기 위한 권한 
+  AWS Identity and Access Management내보내기 및 가져오기 작업에 필요한 역할에 액세스할 수 있는 권한.
+ CloudWatch 경보가 트리거될 때마다 사용자에게 알릴 수 있는 Amazon Simple Notification Service 권한
+ AWS LambdaDynamoDB Streams 레코드를 처리할 수 있는 권한

최소 필수 권한보다 더 제한적인 IAM 정책을 만들면 콘솔은 해당 IAM 정책에 연결된 사용자에 대해 의도대로 작동하지 않습니다. 이 사용자가 DynamoDB 콘솔을 계속 사용할 수 있도록 하려면 `AmazonDynamoDBReadOnlyAccess` AWS 관리형 정책도 사용자에게 연결합니다([Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책](#access-policy-examples-aws-managed) 참조).

AWS CLI 또는 Amazon DynamoDB API만 호출하는 사용자에게는 최소 콘솔 권한을 허용할 필요가 없습니다.

**참고**  
 VPC 엔드포인트를 참조하는 경우 IAM 작업(dynamodb:DescribeEndpoints)을 사용하여 요청하는 IAM 보안 주체에 대한 DescribeEndpoints API 호출도 승인해야 합니다. 자세한 내용은 [엔드포인트에 필요한 정책](inter-network-traffic-privacy.md#inter-network-traffic-DescribeEndpoints)을 참조하세요.

## Amazon DynamoDB에 대한 AWS 관리형(미리 정의된) IAM 정책
<a name="access-policy-examples-aws-managed"></a>

AWS는 에서 생성하고 관리하는 독립형 IAM 정책을 제공하여 몇 가지 일반적인 사용 사례를 처리합니다.AWS 이러한 AWS 관리형 정책은 사용자가 필요한 권한을 조사할 필요가 없도록 일반 사용 사례에 필요한 권한을 부여합니다. 자세한 내용은 *IAM 사용 설명서*의 [AWS 관리형 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)을 참조하세요.

계정의 사용자에게 연결할 수 있는 다음 AWS 관리형 정책은 DynamoDB에 고유하며, 사용 사례 시나리오별로 그룹화되어 있습니다.
+ **AmazonDynamoDBReadOnlyAccess** - AWS Management Console을 통해 DynamoDB 리소스에 대한 읽기 전용 액세스 권한을 부여합니다.
+ **AmazonDynamoDBFullAccess** - AWS Management Console을 통해 DynamoDB 리소스에 대한 전체 액세스 권한을 부여합니다.

IAM 콘솔에 로그인하고 이 콘솔에서 특정 정책을 검색하여 이러한 AWS 관리형 권한 정책을 검토할 수 있습니다.

**중요**  
가장 좋은 방법은 필요한 사용자, 역할 또는 그룹에 [최소 권한](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)을 부여하는 사용자 지정 IAM 정책을 생성하는 것입니다.

## 고객 관리형 정책 예제
<a name="access-policy-examples-for-sdk-cli"></a>

이 단원에서는 다양한 DynamoDB 작업에 대한 권한을 부여하는 정책의 예를 제공합니다. 이러한 정책은 AWS SDK 또는 AWS CLI를 사용하는 경우에 유효합니다. 콘솔을 사용하는 경우 콘솔에 해당하는 추가 권한을 부여해야 합니다. 자세한 내용은 [Amazon DynamoDB 콘솔을 사용하는 데 필요한 IAM 권한](#console-permissions) 섹션을 참조하세요.

**참고**  
다음 정책 예시에서는 모두 AWS 리전 중 하나를 사용하고 가상의 계정 ID와 테이블 이름을 포함합니다.

예시:
+ [테이블에서 모든 DynamoDB 작업에 대한 권한을 부여하는 IAM 정책](grant-permissions-to-any-action-on-table.md)
+ [DynamoDB 테이블의 항목에 대한 읽기 전용 권한을 부여하는 IAM 정책](read-only-permissions-on-table-items.md)
+ [특정 DynamoDB 테이블과 관련 인덱스에 대한 액세스 권한을 부여하는 IAM 정책](iam-policy-specific-table-indexes.md)
+ [DynamoDB 테이블에서 읽기, 쓰기, 업데이트 및 삭제 액세스 권한에 대한 IAM 정책](iam-policy-example-data-crud.md)
+ [동일한 AWS 계정의 다른 DynamoDB 환경에 대한 IAM 정책](iam-policy-separate-environments.md)
+ [DynamoDB 예약 용량 구매를 방지하는 IAM 정책](iam-prevent-purchase-reserved-capacity.md)
+ [DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음)](iam-policy-read-stream-only.md)
+ [AWS Lambda 함수가 DynamoDB 스트림 레코드에 액세스하도록 허용하는 IAM 정책](iam-policy-example-lamda-process-dynamodb-streams.md)
+ [DynamoDB Accelerator(DAX) 클러스터에 대한 읽기 및 쓰기 액세스 권한을 위한 IAM 정책](iam-policy-example-read-write-dax-access.md)

 *IAM 사용 설명서*에는 다음 [세 가지 추가 DynamoDB 예시](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_examples.html)가 포함되어 있습니다.
+ [Amazon DynamoDB: 특정 테이블에 대한 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_specific-table.html)
+ [Amazon DynamoDB: 특정 열에 대한 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_columns.html)
+ [Amazon DynamoDB: Amazon Cognito ID를 기준으로 DynamoDB에 대한 행 수준 액세스 허용](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_dynamodb_rows.html)

# 테이블에서 모든 DynamoDB 작업에 대한 권한을 부여하는 IAM 정책
<a name="grant-permissions-to-any-action-on-table"></a>

다음 정책은 `Books`라는 테이블에서 *모든* DynamoDB 작업을 위한 권한을 부여합니다. `Resource`에 지정된 리소스 ARN은 특정 AWS 리전 내의 테이블을 식별합니다. `Resource` ARN에서 테이블 이름 `Books`를 와일드카드 문자(\$1)로 바꾸면 *모든* DynamoDB 작업이 계정의 *모든* 테이블에서 허용됩니다. 이 정책이나 IAM 정책에서 와일드카드 문자를 사용하려면 먼저 보안에 미칠 수 있는 영향을 신중히 고려하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": "dynamodb:*",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

**참고**  
이 예제에서는 와일드카드 문자(\$1)를 사용하여 관리, 데이터 작업, 모니터링, DynamoDB 예약 용량 구매 등의 *모든* 작업을 허용합니다. 대신 허용할 각 작업과 해당 사용자, 역할 또는 그룹에 필요한 작업만 명시적으로 지정하는 것이 좋습니다.

# DynamoDB 테이블의 항목에 대한 읽기 전용 권한을 부여하는 IAM 정책
<a name="read-only-permissions-on-table-items"></a>

다음 권한 정책은 `GetItem`, `BatchGetItem`, `Scan`, `Query` 및 `ConditionCheckItem` DynamoDB 작업에 대한 권한만 부여하며 결과적으로 `Books` 테이블에 대한 읽기 전용 액세스 권한을 설정합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ReadOnlyAPIActionsOnBooks",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        }
    ]
}
```

------

# 특정 DynamoDB 테이블과 관련 인덱스에 대한 액세스 권한을 부여하는 IAM 정책
<a name="iam-policy-specific-table-indexes"></a>

다음 정책은 `Books`라는 DynamoDB 테이블과 해당 테이블의 모든 인덱스에서 데이터 수정 작업에 대한 권한을 부여합니다. 인덱스 작동 방식에 대한 자세한 내용은 [DynamoDB에서 보조 인덱스를 사용하여 데이터 액세스 개선](SecondaryIndexes.md) 단원을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessTableAllIndexesOnBooks",
            "Effect": "Allow",
            "Action": [
              "dynamodb:PutItem",
              "dynamodb:UpdateItem",
              "dynamodb:DeleteItem",
              "dynamodb:BatchWriteItem",
              "dynamodb:GetItem",
              "dynamodb:BatchGetItem",
              "dynamodb:Scan",
              "dynamodb:Query",
              "dynamodb:ConditionCheckItem"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

# DynamoDB 테이블에서 읽기, 쓰기, 업데이트 및 삭제 액세스 권한에 대한 IAM 정책
<a name="iam-policy-example-data-crud"></a>

애플리케이션이 Amazon DynamoDB 테이블, 인덱스 및 스트림에서 데이터를 생성하고, 읽고, 업데이트하고, 삭제하도록 허용해야 하는 경우 이 정책을 사용합니다. AWS 리전 이름, 계정 ID, 계정 ID, 테이블 이름 또는 와일드카드 문자(\$1)는 적절하게 대체합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DynamoDBIndexAndStreamAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetShardIterator",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:ListStreams"
            ],
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/stream/*"
            ]
        },
        {
            "Sid": "DynamoDBTableAccess",
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:PutItem",
                "dynamodb:DescribeTable",
                "dynamodb:DeleteItem",
                "dynamodb:GetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Books"
        },
        {
            "Sid": "DynamoDBDescribeLimitsAccess",
            "Effect": "Allow",
            "Action": "dynamodb:DescribeLimits",
            "Resource": [
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books",
                "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*"
            ]
        }
    ]
}
```

------

모든 AWS 리전에서 이 계정의 모든 DynamoDB 테이블을 포함하도록 이 정책을 확장하려면 리전 및 테이블 이름에 와일드카드(\$1)를 사용합니다. 예:

```
"Resource":[
                "arn:aws:dynamodb:*:123456789012:table/*",
                "arn:aws:dynamodb:*:123456789012:table/*/index/*"
                ]
```

# 동일한 AWS 계정의 다른 DynamoDB 환경에 대한 IAM 정책
<a name="iam-policy-separate-environments"></a>

별도의 환경이 있고 각 환경에서 `ProductCatalog`라는 테이블의 자체 버전을 유지한다고 가정해 보겠습니다. 동일한 AWS 계정에서 2개의 `ProductCatalog` 테이블을 생성하는 경우 권한이 설정되는 방식 때문에 한 환경에서의 작업이 다른 환경에 영향을 줄 수 있습니다. 예를 들어 동시 제어 영역 작업(예:`CreateTable`)의 수에 대한 할당량은 AWS 계정 수준에서 설정됩니다.

따라서 한 환경에서 작업을 수행할 때마다 다른 환경에서 사용 가능한 작업의 수가 감소합니다. 또한 한 환경의 코드가 다른 환경의 테이블에 실수로 액세스할 수 있는 위험도 있습니다.

**참고**  
프로덕션 및 테스트 워크로드를 분리하여 이벤트의 잠재적 ‘영향 범위’를 제어할 수 있으려면 테스트 및 프로덕션 워크로드에 대해 별도의 AWS 계정을 생성하는 것이 좋습니다. 자세한 내용은 [AWS 계정 관리 및 분리](https://docs.aws.amazon.com//wellarchitected/latest/security-pillar/aws-account-management-and-separation.html) 단원을 참조하세요.

또한 Amit과 Alice라는 두 개발자가 `ProductCatalog` 테이블을 테스트 중이라고 가정해 보겠습니다. 개발자가 각각 별도의 AWS 계정을 요구하는 대신 동일한 테스트 AWS 계정을 공유할 수 있습니다. 이 테스트 계정에서 `Alice_ProductCatalog` 및 `Amit_ProductCatalog`와 같이 각 개발자가 작업할 수 있는 동일한 테이블의 복제본을 만들 수 있습니다. 이 경우 테스트 환경용으로 생성한 AWS 계정에서 사용자 Alice 및 Amit을 만들 수 있습니다. 그런 다음 이들 사용자에게 각자가 소유하는 테이블에 대해 DynamoDB 작업을 수행할 수 있는 권한을 부여할 수 있습니다.

이러한 IAM 사용자 권한을 부여하려면 다음 중 하나를 수행할 수 있습니다.
+ 사용자마다 개별 정책을 만들고 각 정책을 사용자에게 개별적으로 연결합니다. 예를 들면, 다음 정책을 사용자 Alice에 연결하여 이 사용자가 `Alice_ProductCatalog` 테이블에서 모든 DynamoDB 작업에 액세스하도록 허용할 수 있습니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "AllAPIActionsOnAliceTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:DeleteItem",
                "dynamodb:DescribeContributorInsights",
                "dynamodb:RestoreTableToPointInTime",
                "dynamodb:ListTagsOfResource",
                "dynamodb:CreateTableReplica",
                "dynamodb:UpdateContributorInsights",
                "dynamodb:CreateBackup",
                "dynamodb:DeleteTable",
                "dynamodb:UpdateTableReplicaAutoScaling",
                "dynamodb:UpdateContinuousBackups",
                "dynamodb:TagResource",
                "dynamodb:DescribeTable",
                "dynamodb:GetItem",
                "dynamodb:DescribeContinuousBackups",
                "dynamodb:BatchGetItem",
                "dynamodb:UpdateTimeToLive",
                "dynamodb:BatchWriteItem",
                "dynamodb:ConditionCheckItem",
                "dynamodb:UntagResource",
                "dynamodb:PutItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteTableReplica",
                "dynamodb:DescribeTimeToLive",
                "dynamodb:RestoreTableFromBackup",
                "dynamodb:UpdateTable",
                "dynamodb:DescribeTableReplicaAutoScaling",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:DescribeLimits",
                "dynamodb:ListStreams"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/Alice_ProductCatalog/*"
          }
      ]
  }
  ```

------

  그런 다음 사용자 Amit에 대해 다른 리소스(`Amit_ProductCatalog` 테이블)를 사용하여 유사한 정책을 만들 수 있습니다.
+ 정책을 개별 사용자에게 연결하는 대신, IAM 정책 변수를 사용하여 단일 정책을 작성하고 이 정책을 그룹에 연결할 수도 있습니다. 이 경우 그룹을 만들어야 하고, 여기서는 Alice와 Amit 두 사용자 모두 해당 그룹에 추가해야 합니다. 다음 예제에서는 `${aws:username}_ProductCatalog` 테이블에서 모든 DynamoDB 작업을 수행할 수 있는 권한을 부여합니다. 정책이 평가될 때 정책 변수 `${aws:username}`은 요청자의 사용자 이름으로 대체됩니다. 예를 들어 Alice가 항목을 추가하라는 요청을 보내는 경우 이 작업은 Alice가 항목을 `Alice_ProductCatalog` 테이블에 추가하는 경우에만 허용됩니다.

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ActionsOnUserSpecificTable",
              "Effect": "Allow",
              "Action": [
                "dynamodb:PutItem",
                "dynamodb:UpdateItem",
                "dynamodb:DeleteItem",
                "dynamodb:BatchWriteItem",
                "dynamodb:GetItem",
                "dynamodb:BatchGetItem",
                "dynamodb:Scan",
                "dynamodb:Query",
                "dynamodb:ConditionCheckItem"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_ProductCatalog"
          },
          {
              "Sid": "AdditionalPrivileges",
              "Effect": "Allow",
              "Action": [
                  "dynamodb:ListTables",
                  "dynamodb:DescribeTable",
                  "dynamodb:DescribeContributorInsights"
              ],
              "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/*"
          }
      ]
  }
  ```

------

**참고**  
IAM 정책 변수를 사용할 때는 정책에서 IAM 정책 언어의 `2012-10-17` 버전을 명시적으로 지정해야 합니다. IAM 정책 언어의 기본 버전(`2008-10-17`)은 정책 변수를 지원하지 않습니다.

평소대로 특정 테이블을 리소스로 식별하는 대신, 아래 예제와 같이 와일드카드 문자(\$1)를 사용하여 테이블 이름에 요청자의 사용자 이름이 접두사로 붙은 모든 테이블에 대한 권한을 부여할 수 있습니다.

```
"Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/${aws:username}_*"
```

# DynamoDB 예약 용량 구매를 방지하는 IAM 정책
<a name="iam-prevent-purchase-reserved-capacity"></a>

Amazon DynamoDB 예약 용량을 구입할 경우 선납금을 1회 지불하고 일정 기간에 대해 최소 사용량 수준에 맞춰 약정 요금을 지불하므로 상당한 비용 절감을 얻을 수 있습니다. AWS Management Console을 사용하여 예약 용량을 확인하고 구매할 수 있습니다. 하지만 조직의 모든 사용자가 예약 용량을 구매할 수 있도록 하고 싶지 않을 수 있습니다. 예약 용량에 대한 자세한 내용은 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing) 단원을 참조하세요.

DynamoDB는 예약 용량 관리에 대한 액세스 권한을 제어하기 위한 다음과 같은 API 작업을 제공합니다.
+ `dynamodb:DescribeReservedCapacity` - 현재 유효한 예약 용량 구매를 반환합니다.
+ `dynamodb:DescribeReservedCapacityOfferings` - 현재 에서 제공하는 예약 용량 계획에 대한 세부 정보를 반환합니다.AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 실제 예약 용량 구매를 수행합니다.

AWS Management Console은 이러한 API 작업을 사용하여 예약 용량 정보를 표시하고 예약 용량을 구매합니다. 이러한 작업은 콘솔을 통해서만 액세스할 수 있으므로 애플리케이션 프로그램에서는 호출할 수 없습니다. 하지만 IAM 권한 정책에서 이들 작업에 대한 액세스를 허용 또는 거부할 수 있습니다.

다음 정책을 사용하면 사용자가 AWS Management Console을 사용하여 예약 용량 구매 및 제품을 조회할 수는 있지만, 새로운 구매는 거부됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

이 정책에서는 와일드카드 문자(\$1)를 사용하여 모두에 대해 설명 권한을 허용하고, 모두에 대해 DynamoDB 예약 용량 구매를 거부합니다.

# DynamoDB 스트림에 대해서만 읽기 액세스 권한을 부여하는 IAM 정책(테이블은 부여하지 않음)
<a name="iam-policy-read-stream-only"></a>

테이블에서 DynamoDB Streams를 활성화하면 테이블 항목의 모든 수정에 대한 정보가 캡처됩니다. 자세한 내용은 [DynamoDB Streams에 대한 변경 데이터 캡처](Streams.md) 섹션을 참조하세요.

때로는 애플리케이션이 DynamoDB 테이블에서 데이터를 읽는 것은 금지하지만 테이블의 스트림에는 액세스하도록 허용하려는 경우도 있을 수 있습니다. 예를 들어, 항목 업데이트가 감지될 때 스트림을 폴링하고 Lambda 함수를 호출한 후 추가 처리를 수행하도록 AWS Lambda를 구성할 수 있습니다.

다음 작업은 DynamoDB Streams에 대한 액세스를 제어하는 데 사용할 수 있습니다.
+ `dynamodb:DescribeStream`
+ `dynamodb:GetRecords`
+ `dynamodb:GetShardIterator`
+ `dynamodb:ListStreams`

다음 예제 정책은 `GameScores`라는 테이블의 스트림에 액세스할 수 있는 권한을 사용자에게 부여합니다. ARN의 와일드카드 문자(\$1)는 해당 테이블과 연결된 모든 스트림과 일치합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessGameScoresStreamOnly",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeStream",
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

이 정책에서는 `GameScores` 테이블 자체가 아니라 해당 테이블의 스트림에 액세스하도록 허용합니다.

# AWS Lambda 함수가 DynamoDB 스트림 레코드에 액세스하도록 허용하는 IAM 정책
<a name="iam-policy-example-lamda-process-dynamodb-streams"></a>

DynamoDB 스트림의 새 이벤트를 기반으로 특정 작업이 수행되기를 원할 경우 이러한 새 이벤트를 통해 트리거되는 AWS Lambda 함수를 작성할 수 있습니다. 이러한 Lambda 함수는 DynamoDB 스트림에서 데이터를 읽을 수 있는 권한을 필요로 합니다. DynamoDB Streams와 Lambda를 함께 사용하는 방법에 대한 자세한 내용은 [DynamoDB Streams 및 AWS Lambda 트리거](Streams.Lambda.md) 단원을 참조하세요.

Lambda에 권한을 부여하려면 Lambda 함수의 IAM 역할(실행 역할이라고도 함)과 연결되는 권한 정책을 사용합니다. 이 정책은 Lambda 함수를 생성할 때 지정합니다.

예를 들어, 다음의 권한 정책을 실행 역할과 연결하여 나열된 DynamoDB Streams 작업을 수행할 수 있는 권한을 Lambda에 부여할 수 있습니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "APIAccessForDynamoDBStreams",
            "Effect": "Allow",
            "Action": [
                "dynamodb:GetRecords",
                "dynamodb:GetShardIterator",
                "dynamodb:DescribeStream",
                "dynamodb:ListStreams"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/stream/*"
        }
    ]
}
```

------

자세한 내용은 *AWS Lambda 개발자 안내서*의 [AWS Lambda 권한](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html) 단원을 참조하세요.

# DynamoDB Accelerator(DAX) 클러스터에 대한 읽기 및 쓰기 액세스 권한을 위한 IAM 정책
<a name="iam-policy-example-read-write-dax-access"></a>

다음 정책에서는 DynamoDB Accelerator(DAX)에 대한 읽기, 쓰기, 업데이트 및 삭제 액세스 권한을 허용하지만 연결된 DynamoDB 테이블에 대해서는 허용하지 않습니다. 이 정책을 사용하려면 AWS 리전 이름, 계정 ID, DAX 클러스터 이름을 대체합니다.

**참고**  
이 정책은 DAX 클러스터에 대한 액세스 권한은 부여하지만 연결된 DynamoDB 테이블에 대한 액세스 권한은 부여하지 않습니다. DAX 클러스터가 사용자를 대신해 DynamoDB 테이블에서 이와 같은 작업을 수행하려면 클러스터에 올바른 정책이 있어야 합니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AmazonDynamoDBDAXDataOperations",
            "Effect": "Allow",
            "Action": [
                "dax:GetItem",
                "dax:PutItem",
                "dax:ConditionCheckItem",
                "dax:BatchGetItem",
                "dax:BatchWriteItem",
                "dax:DeleteItem",
                "dax:Query",
                "dax:UpdateItem",
                "dax:Scan"
            ],
            "Resource": "arn:aws:dax:eu-west-1:123456789012:cache/MyDAXCluster"
        }
    ]
}
```

------

계정의 모든 AWS 리전에 대한 DAX 액세스 권한을 포함하도록 이 정책을 확장하려면 리전 이름에 와일드카드 문자(\$1)를 사용합니다.

```
"Resource": "arn:aws:dax:*:123456789012:cache/MyDAXCluster"
```







# Amazon DynamoDB 자격 증명 및 액세스 문제 해결
<a name="security_iam_troubleshoot"></a>

다음 정보를 사용하여 DynamoDB 및 IAM에서 발생할 수 있는 공통적인 문제를 진단하고 수정할 수 있습니다.

**Topics**
+ [DynamoDB에서 작업을 수행할 권한이 없음](#security_iam_troubleshoot-no-permissions)
+ [iam:PassRole을 수행하도록 인증되지 않음](#security_iam_troubleshoot-passrole)
+ [내 AWS 계정 외부의 사람이 내 DynamoDB 리소스에 액세스할 수 있게 허용하고 싶음](#security_iam_troubleshoot-cross-account-access)

## DynamoDB에서 작업을 수행할 권한이 없음
<a name="security_iam_troubleshoot-no-permissions"></a>

AWS Management Console에서 작업을 수행할 권한이 없다는 메시지가 나타나는 경우 관리자에게 문의하여 도움을 받아야 합니다. 관리자는 사용자 이름과 암호를 제공한 사람입니다.

다음 예제 오류는 `mateojackson` 사용자가 콘솔을 사용하여 가상 `my-example-widget` 리소스에 대한 세부 정보를 보려고 하지만 가상 `aws:GetWidget` 권한이 없을 때 발생합니다.

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: aws:GetWidget on resource: my-example-widget
```

이 경우 Mateo는 `my-example-widget` 작업을 사용하여 `aws:GetWidget` 리소스에 액세스하도록 허용하는 정책을 업데이트하라고 관리자에게 요청합니다.

## iam:PassRole을 수행하도록 인증되지 않음
<a name="security_iam_troubleshoot-passrole"></a>

`iam:PassRole` 작업을 수행할 수 있는 권한이 없다는 오류가 수신되면 DynamoDB에 역할을 전달할 수 있도록 정책을 업데이트해야 합니다.

일부 AWS 서비스에서는 새로운 서비스 역할 또는 서비스 연결 역할을 생성하는 대신 해당 서비스에 기존 역할을 전달할 수 있습니다. 이렇게 하려면 사용자가 서비스에 역할을 전달할 수 있는 권한을 가지고 있어야 합니다.

다음 예시 오류는 `marymajor`라는 IAM 사용자가 콘솔을 사용하여 DynamoDB에서 작업을 수행하려고 하는 경우에 발생합니다. 하지만 작업을 수행하려면 서비스 역할이 부여한 권한이 서비스에 있어야 합니다. Mary는 서비스에 역할을 전달할 수 있는 권한을 가지고 있지 않습니다.

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

이 경우, Mary가 `iam:PassRole`작업을 수행할 수 있도록 Mary의 정책을 업데이트해야 합니다.

도움이 필요한 경우 AWS 관리자에게 문의하세요. 관리자는 로그인 자격 증명을 제공한 사람입니다.

## 내 AWS 계정 외부의 사람이 내 DynamoDB 리소스에 액세스할 수 있게 허용하고 싶음
<a name="security_iam_troubleshoot-cross-account-access"></a>

다른 계정의 사용자 또는 조직 외부의 사람이 리소스에 액세스할 때 사용할 수 있는 역할을 생성할 수 있습니다. 역할을 수임할 신뢰할 수 있는 사람을 지정할 수 있습니다. 리소스 기반 정책 또는 액세스 제어 목록(ACL)을 지원하는 서비스의 경우, 이러한 정책을 사용하여 다른 사람에게 리소스에 대한 액세스 권한을 부여할 수 있습니다.

자세한 내용은 다음을 참조하세요.
+ DynamoDB에서 이러한 기능을 지원하는지 여부를 알아보려면 [Amazon DynamoDB에서 IAM을 사용하는 방법](security_iam_service-with-iam.md) 섹션을 참조하세요.
+ 소유하고 있는 AWS 계정의 리소스에 대한 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [자신이 소유한 다른 AWS 계정의 IAM 사용자에 대한 액세스 권한 제공](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)을 참조하세요.
+ 리소스에 대한 액세스 권한을 서드 파티 AWS 계정에게 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [서드 파티가 소유한 AWS 계정에 대한 액세스 제공](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)을 참조하세요.
+ ID 페더레이션을 통해 액세스 권한을 제공하는 방법을 알아보려면 *IAM 사용 설명서*의 [외부에서 인증된 사용자에게 액세스 권한 제공(ID 페더레이션)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)을 참조하세요.
+ 크로스 계정 액세스에 대한 역할과 리소스 기반 정책 사용의 차이점을 알아보려면 **IAM 사용 설명서의 [IAM의 크로스 계정 리소스 액세스](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)를 참조하세요.

# DynamoDB 예약 용량 구매를 방지하는 IAM 정책
<a name="iam-policy-prevent-purchase-reserved-capacity"></a>

Amazon DynamoDB 예약 용량을 구입할 경우 선납금을 1회 지불하고 일정 기간에 대해 최소 사용량 수준에 맞춰 약정 요금을 지불하므로 상당한 비용 절감을 얻을 수 있습니다. AWS Management Console을 사용하여 예약 용량을 확인하고 구매할 수 있습니다. 하지만 조직의 모든 사용자가 예약 용량을 구매할 수 있도록 하고 싶지 않을 수 있습니다. 예약 용량에 대한 자세한 내용은 [Amazon DynamoDB 요금](https://aws.amazon.com/dynamodb/pricing) 단원을 참조하세요.

DynamoDB는 예약 용량 관리에 대한 액세스 권한을 제어하기 위한 다음과 같은 API 작업을 제공합니다.
+ `dynamodb:DescribeReservedCapacity` - 현재 유효한 예약 용량 구매를 반환합니다.
+ `dynamodb:DescribeReservedCapacityOfferings` - 현재 에서 제공하는 예약 용량 계획에 대한 세부 정보를 반환합니다.AWS
+ `dynamodb:PurchaseReservedCapacityOfferings` - 실제 예약 용량 구매를 수행합니다.

AWS Management Console은 이러한 API 작업을 사용하여 예약 용량 정보를 표시하고 예약 용량을 구매합니다. 이러한 작업은 콘솔을 통해서만 액세스할 수 있으므로 애플리케이션 프로그램에서는 호출할 수 없습니다. 하지만 IAM 권한 정책에서 이들 작업에 대한 액세스를 허용 또는 거부할 수 있습니다.

다음 정책을 사용하면 사용자가 AWS Management Console을 사용하여 예약 용량 구매 및 제품을 조회할 수는 있지만, 새로운 구매는 거부됩니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowReservedCapacityDescriptions",
            "Effect": "Allow",
            "Action": [
                "dynamodb:DescribeReservedCapacity",
                "dynamodb:DescribeReservedCapacityOfferings"
            ],
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        },
        {
            "Sid": "DenyReservedCapacityPurchases",
            "Effect": "Deny",
            "Action": "dynamodb:PurchaseReservedCapacityOfferings",
            "Resource": "arn:aws:dynamodb:us-west-2:123456789012:*"
        }
    ]
}
```

------

이 정책에서는 와일드카드 문자(\$1)를 사용하여 모두에 대해 설명 권한을 허용하고, 모두에 대해 DynamoDB 예약 용량 구매를 거부합니다.

# IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현
<a name="specifying-conditions"></a>

DynamoDB에서 권한을 부여할 때 권한 정책이 적용되는 방식을 결정하는 조건을 지정할 수 있습니다.

## 개요
<a name="FGAC_DDB.Overview"></a>

DynamoDB에서는 IAM 정책을 사용하여 권한을 부여할 때 조건을 지정하는 옵션이 있습니다([Amazon DynamoDB의 Identity and Access Management](security-iam.md) 참조). 예를 들어, 다음을 수행할 수 있습니다.
+ 사용자에게 테이블 또는 보조 인덱스의 특정 항목 및 속성에 대한 읽기 전용 액세스를 허용하는 권한을 부여할 수 있습니다.
+ 사용자 ID를 기준으로 테이블의 특정 속성에 대한 쓰기 전용 액세스 권한을 해당 사용자에게 부여할 수 있습니다.

다음 단원의 사용 사례에서 설명되어 있듯이 DynamoDB에서는 조건 키를 사용하여 IAM 정책에서 조건을 지정할 수 있습니다.

### 권한 사용 사례
<a name="FGAC_DDB.OverviewUseCase"></a>

DynamoDB API 작업에 대한 액세스를 제어할 수 있을 뿐만 아니라, 개별 데이터 항목과 속성에 대한 액세스도 제어할 수 있습니다. 예를 들면, 다음을 수행할 수 있습니다.
+ 테이블에 대한 권한을 부여하되, 특정 기본 키 값을 기반으로 해당 테이블에서 특정 항목에 대한 액세스를 제한할 수 있습니다. 다음 그림과 같이, 모든 사용자가 저장한 게임 데이터가 단일 테이블에 저장되지만 어떤 사용자도 자신이 소유하지 않은 데이터 항목에 액세스할 수 없는 소셜 네트워크 게임 앱이 그 예입니다.  
![\[사용자에게 테이블 수준 액세스 권한을 부여하지만, 특정 데이터 항목에 대한 액세스는 제한하는 사용 사례입니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/info-hiding-horizontal.png)
+ 속성의 하위 집합만 사용자에게 표시되도록 정보를 숨길 수 있습니다. 사용자 위치에 따라 인근 공항의 항공편 데이터를 표시하는 앱이 그 예입니다. 항공사 이름, 도착 및 출발 시간, 항공편 번호가 모두 표시됩니다. 하지만 다음 그림과 같이, 기장 이름과 승객 수와 같은 속성은 숨겨집니다.  
![\[사용자에게 데이터의 하위 집합만 표시하고 데이터의 특정 속성을 숨기는 사용 사례입니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/info-hiding-vertical.png)

이러한 종류의 세분화된 액세스 제어를 구현하려면 보안 자격 증명에 액세스하기 위한 조건과 관련 권한을 지정하는 IAM 권한 정책을 작성합니다. 그런 다음 IAM 콘솔을 사용하여 만드는 사용자, 그룹 또는 역할에 이 정책을 적용할 수 있습니다. IAM 정책은 테이블의 개별 항목에 대한 액세스 또는 이러한 항목의 속성에 대한 액세스를 제한하거나 이러한 두 가지 액세스를 동시에 제한할 수 있습니다.

또는 웹 자격 증명 연동을 사용하여 Login with Amazon, Facebook 또는 Google에서 인증된 사용자의 액세스를 제어할 수도 있습니다. 자세한 내용은 [웹 아이덴티티 페더레이션 사용](WIF.md) 섹션을 참조하세요.

IAM `Condition` 요소를 사용하여 세분화된 액세스 제어 정책을 구현합니다. `Condition` 요소를 권한 정책에 추가하여 특정 비즈니스 요구 사항에 따라 DynamoDB 테이블 및 인덱스의 항목 및 속성에 대한 액세스를 허용하거나 거부할 수 있습니다.

아래 동영상에서는 IAM 정책 조건을 사용하는 DynamoDB의 세분화된 액세스 제어를 설명합니다.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/LbEmo_yulb0?si=VTSlNHVocAEYwhJi)


## DynamoDB의 세분화된 액세스 제어 이해
<a name="FGAC_DDB.UnderstandingFineGrainedAccess"></a>

DynamoDB의 세분화된 액세스 제어를 통해 여러 수준에서 정확한 권한 경계를 생성할 수 있습니다.

1. **항목 수준 액세스 제어:** 일반적으로 자격 증명 또는 권한 범위와 일치하는 특정 키 값이 포함된 항목에만 액세스하도록 사용자를 제한합니다.

1. **속성 수준 액세스 제어:** 사용자가 보거나 수정할 수 있는 속성(열)을 제한하여 동일한 항목 내에서 민감하지 않은 데이터에 대한 액세스를 허용하면서 민감한 정보를 보호할 수 있습니다.

1. **작업별 제어:** 수행 중인 작업 유형에 따라 다른 권한 규칙을 적용합니다.

이러한 제어는 DynamoDB별 조건 키를 사용하는 IAM 정책을 통해 구현됩니다.

## 조건 지정: 조건 키 사용
<a name="FGAC_DDB.ConditionKeys"></a>

AWS는 액세스 제어를 위해 IAM을 지원하는 모든 AWS 서비스에 대해 사전 정의된 조건 키(AWS 차원의 조건 키) 집합을 제공합니다. 예를 들어 `aws:SourceIp` 조건 키를 사용하여 요청자의 IP 주소를 확인한 후 작업을 수행하도록 허용할 수 있습니다. AWS 차원 키의 전체 목록은 IAM 사용 설명서의 [사용 가능한 조건 키](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)를 참조하세요.

다음은 DynamoDB에 적용되는 DynamoDB 서비스별 조건 키를 보여 줍니다.

**`dynamodb:LeadingKeys`**  
테이블의 첫 번째 키 속성, 즉 파티션 키를 나타냅니다. 키 이름 `LeadingKeys`는 단일 항목 작업에 사용되는 경우에도 복수형입니다. 또한 조건에서 `ForAllValues`를 사용할 때 `LeadingKeys` 변경자를 사용해야 합니다.

**`dynamodb:Select`**  
요청의 `Select` 파라미터를 나타냅니다. `Select`는 다음 값 중 하나일 수 있습니다.  
+ `ALL_ATTRIBUTES`
+ `ALL_PROJECTED_ATTRIBUTES`
+ `SPECIFIC_ATTRIBUTES`
+ `COUNT`
쿼리 및 스캔 작업과 자주 연관되지만 이 조건 키는 항목 속성을 반환하는 모든 DynamoDB 작업에 적용되며, 모든 API 작업에서 속성 액세스를 제어하는 데 필수적입니다. 이 조건 키에 StringEqualsIfExists 또는 유사한 제약 조건을 사용하면 이 조건 키가 적용되는 작업에 제약 조건이 적용되는 반면, 적용되지 않는 작업에는 제약 조건이 적용됩니다.

**`dynamodb:Attributes`**  
요청에서 액세스하는 *최상위* 속성 목록을 나타냅니다. 최상위 속성은 해당 속성 또는 해당 속성에 포함된 중첩 속성이 요청 파라미터에 지정된 경우 요청에 의해 액세스됩니다. 예를 들어 `"Name, Address.City"`의 `ProjectionExpression`을 지정하는 `GetItem` 요청의 `dynamodb:Attributes` 목록에는 ‘이름’과 ‘주소’가 포함됩니다. `Attributes` 파라미터가 세분화된 액세스 제어 정책에 열거되어 있는 경우 `GetItem`, `Query`, `Scan`과 같은 여러 API 작업에서 지정된 속성에 대한 액세스를 제한하기 위해 `ReturnValues` 및 `Select` 파라미터도 제한하는 것이 좋습니다.  
이 조건은 요청에 지정된 속성(예: ProjectionExpression)에서만 평가되며 응답의 속성에서는 평가되지 않습니다. 요청에 ProjectionExpression이 제공되지 않은 경우 정책의 속성 제한에 관계없이 모든 속성이 반환됩니다. 속성 액세스를 올바르게 보호하는 방법에 대한 자세한 내용은 아래 "속성 기반 제한이 적용되도록 보장" 섹션을 참조하세요.

**`dynamodb:ReturnValues`**  
요청의 `ReturnValues` 파라미터를 나타냅니다. API 작업에 따라 `ReturnValues`는 다음 값 중 하나일 수 있습니다.  
+ `ALL_OLD`
+ `UPDATED_OLD`
+ `ALL_NEW`
+ `UPDATED_NEW`
+ `NONE`

**`dynamodb:ReturnConsumedCapacity`**  
요청의 `ReturnConsumedCapacity` 파라미터를 나타냅니다. `ReturnConsumedCapacity`는 다음 값 중 하나일 수 있습니다.  
+ `TOTAL`
+ `NONE`

**`dynamodb:FirstPartitionKeyValues`**  
테이블의 첫 번째 키 속성, 즉 첫 번째 파티션 키를 나타냅니다. 키 이름 `FirstPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다. 또한 조건에서 `FirstPartitionKeyValues`를 사용할 때 `ForAllValues` 변경자를 사용해야 합니다. `FirstPartitionKeyValues` 및 `LeadingKeys`는 상호 교환하여 사용할 수 있습니다.

**`dynamodb:SecondPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 두 번째 파티션 키를 나타냅니다. 키 이름 `SecondPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

**`dynamodb:ThirdPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 세 번째 파티션 키를 나타냅니다. 키 이름 `ThirdPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

**`dynamodb:FourthPartitionKeyValues`**  
`dynamodb:FirstPartitionKeyValues`와 유사합니다. 리소스의 네 번째 파티션 키를 나타냅니다. 키 이름 `FourthPartitionKeyValues`는 단일 항목 작업에 사용되는 경우에도 복수형입니다.

### 속성 기반 제한이 적용되도록 보장
<a name="FGAC_DDB.EnsuringAttributeRestrictions"></a>

속성 기반 조건을 사용하여 특정 속성에 대한 액세스를 제한할 때는 이러한 조건을 평가하는 방법을 이해하는 것이 중요합니다.
+ **속성 조건은 요청에 지정된 속성에서만 평가되며**, 응답의 속성에서 평가되지 않습니다.
+ **ProjectionExpression(GetItem, Query, Scan 등)이 없는 읽기 작업의 경우** 정책의 속성 제한과 관계없이 모든 속성이 반환됩니다. 민감한 데이터의 이러한 잠재적 노출을 방지하려면 속성 조건(`dynamodb:Attributes`)과 특정 속성이 필요한 조건(`dynamodb:Select`)을 모두 구현해야 합니다.
+ **쓰기 작업**(PutItem, UpdateItem, DeleteItem)의 경우 ReturnValues 파라미터는 전체 항목을 반환하여 쓰기 작업 자체가 정책을 준수하더라도 제한된 속성을 노출할 수 있습니다. 이러한 노출을 방지하려면 정책에서 ReturnValues(`dynamodb:ReturnValues`)에 대한 속성 조건(`dynamodb:Attributes`)과 제한 사항을 모두 구현합니다.

### 사용자 액세스 제한
<a name="FGAC_DDB.LimitingAccess"></a>

여러 IAM 권한 정책을 사용하면 사용자가 테이블에서 해시 키 값이 사용자 식별자와 일치하는 항목만 액세스할 수 있습니다. 예를 들어 앞서 다룬 게임 앱은 이러한 방식으로 액세스를 제한하므로 사용자가 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. IAM 치환 변수인 `${www.amazon.com:user_id}`, `${graph.facebook.com:id}` 및 `${accounts.google.com:sub}`에는 Login with Amazon, Facebook 및 Google용 사용자 식별자가 포함되어 있습니다. 애플리케이션이 이러한 ID 공급자 중 하나에 로그인하는 방식에 대해 알아보려면 [웹 아이덴티티 페더레이션 사용](WIF.md) 단원을 참조하세요.

**중요**  
글로벌 테이블 복제를 제한하는 데는 세분화된 액세스 제어가 지원되지 않습니다. 글로벌 테이블 복제에 사용되는 DynamoDB [서비스 위탁자 또는 서비스 연결 역할](globaltables-security.md)에 세분화된 액세스 제어를 위한 정책 조건을 적용하면 글로벌 테이블 내에서 복제가 중단될 수 있습니다.

**참고**  
다음 단원의 각 예제에서는 `Effect` 절을 `Allow`로 설정하고 허용할 작업, 리소스 및 파라미터만 지정합니다. 액세스는 IAM 정책에 명시적으로 나열된 항목에만 허용됩니다.  
경우에 따라, `Effect` 절을 `Deny`로 설정하고 정책의 모든 논리를 반전시켜 거부 기반 정책이 되도록 이러한 정책을 다시 작성할 수도 있습니다. 하지만 허용 기반 정책에 비해 올바르게 작성하기가 어려우므로 DynamoDB에서는 거부 기반 정책을 사용하지 않는 것이 좋습니다. 또한, DynamoDB API에 대한 향후 변경(또는 기존 API 입력에 대한 변경)으로 인해 거부 기반 정책이 무효화될 수도 있습니다.

### 정책 예: 조건을 사용하여 세부적인 액세스 제어 구현
<a name="FGAC_DDB.Examples"></a>

이 단원에서는 DynamoDB 테이블 및 인덱스에 대한 세분화된 액세스 제어를 구현하기 위한 몇 가지 정책을 보여 줍니다.

**참고**  
모든 예는 us-west-2 리전을 사용하며 가상의 계정 ID를 포함합니다.

#### 예 1. 속성 제한이 있는 기본 파티션 키 기반 액세스 제어
<a name="FGAC_DDB.Examples.BasicPartitionKeyAccess"></a>

플레이어가 다양한 게임을 선택하고 플레이할 수 있는 모바일 게임 앱을 예로 들어 보겠습니다. 이 앱은 이름이 `GameScores`인 DynamoDB 테이블을 사용하여 높은 점수와 기타 사용자 데이터를 추적합니다. 테이블의 각 항목은 사용자 ID와 사용자가 플레이한 게임의 이름에 따라 고유하게 식별됩니다. `GameScores` 테이블은 파티션 키(`UserId`)와 정렬 키(`GameTitle`)로 구성된 기본 키를 갖습니다. 사용자는 자신의 사용자 ID와 연결된 게임 데이터에만 액세스할 수 있습니다. 게임을 플레이하려는 사용자는 보안 정책이 연결된 `GameRole`이라는 IAM 역할에 속해야 합니다.

이 앱에서 사용자 권한을 관리하기 위해 다음과 같은 권한 정책을 작성할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`GameScores` 테이블(`Resource` 요소)에서의 특정 DynamoDB 작업(`Action` 요소)에 대한 권한을 부여하는 이외에, `Condition` 요소는 다음의 DynamoDB 고유 조건 키를 사용하여 다음과 같이 권한을 제한합니다.
+ `dynamodb:LeadingKeys` - 이 조건 키는 사용자가 파티션 키 값이 자신의 사용자 ID와 일치하는 항목만 액세스하도록 허용합니다. 이 ID(`${www.amazon.com:user_id}`)는 치환 변수입니다. 치환 변수에 대한 자세한 내용은 [웹 아이덴티티 페더레이션 사용](WIF.md) 단원을 참조하세요.
+ `dynamodb:Attributes` - 이 조건 키는 권한 정책에 나열된 작업만 지정된 속성 값을 반환할 수 있도록 이러한 속성에 대한 액세스를 제한합니다. 또한 `StringEqualsIfExists` 절을 사용하면 앱에서 작업이 적용될 특정 속성 목록만 제공되고 모든 속성을 요청할 수는 없습니다.

IAM 정책을 평가하면 결과가 항상 true(액세스 허용됨)이거나 false(액세스 거부됨)입니다. `Condition` 요소 중 한 부분이라도 false이면 전체 정책이 false로 평가되어 액세스가 거부됩니다.

**중요**  
`dynamodb:Attributes`를 사용하는 경우 해당 정책에 나열된 테이블 및 보조 인덱스에 대한 모든 기본 키 및 인덱스 속성의 이름을 지정해야 합니다. 그렇지 않으면, DynamoDB에서 이러한 키 속성을 사용하여 요청된 작업을 수행할 수 없습니다.

IAM 정책 설명서에는 수평 탭(U\$10009), 라인 피드(U\$1000A), 캐리지 리턴(U\$1000D), 그리고 U\$10020 \$1 U\$100FF 범위의 문자 등 유니코드 문자만 넣을 수 있습니다.

#### 예제 2: 특정 파티션 키 값이 있는 항목에 대한 액세스를 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.PartitionKeyValue"></a>

다음 권한 정책은 `GamesScore` 테이블에서 DynamoDB 작업의 집합을 허용하는 권한을 부여합니다. 이 정책은 `dynamodb:LeadingKeys` 조건 키를 사용하여 사용자 작업을 `UserID` 파티션 키 값이 이 앱의 Login with Amazon 고유 사용자 ID와 일치하는 항목으로만 제한합니다.

**중요**  
작업 목록에는 `Scan` 권한이 포함되지 않는데, `Scan`이 주요 키와 상관없이 모든 항목을 반환하기 때문입니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"FullAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**참고**  
정책 변수를 사용하는 경우 정책에 명시적으로 버전 2012-10-17을 지정해야 합니다. 액세스 정책 언어의 기본 버전인 2008-10-17은 정책 변수를 지원하지 않습니다.

읽기 전용 액세스를 구현하려면 데이터를 수정할 수 있는 작업을 제거할 수 있습니다. 다음 정책에서는 읽기 전용 액세스를 제공하는 작업만 조건에 포함됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"ReadOnlyAccessToUserItems",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ]
            }
         }
      }
   ]
}
```

------

**중요**  
`dynamodb:Attributes`를 사용하는 경우 정책에 나열된 테이블 및 보조 인덱스에 대한 모든 기본 키 및 인덱스 키 속성의 이름을 지정해야 합니다. 그렇지 않으면, DynamoDB에서 이러한 키 속성을 사용하여 요청된 작업을 수행할 수 없습니다.

#### 예제 3: 테이블의 특정 속성에 대한 액세스를 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.SpecificAttributes"></a>

다음 권한 정책은 `dynamodb:Attributes` 조건 키를 추가하여 테이블에서 2개의 속성에만 액세스를 허용합니다. 이러한 속성은 조건부 쓰기 또는 스캔 필터에서 읽거나 쓰거나 평가할 수 있습니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToSpecificAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem",
            "dynamodb:Scan"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "UserId",
                  "TopScore"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

**참고**  
이 정책은 이름이 지정된 속성 집합에 대한 액세스를 허용하는 허용 목록 방식을 사용합니다. 또는 이에 상응하는 정책으로 다른 속성에 대한 액세스를 거부하는 정책을 작성할 수 있습니다. 이러한 거부 목록 방식은 사용하지 않는 것이 좋습니다. Wikipedia(http://en.wikipedia.org/wiki/Principle\$1of\$1least\$1privilege)에 설명된 대로 사용자가 최소 권한 원칙에 따라 이러한 거부되는 속성의 이름을 결정하고 허용 목록 방식을 사용하여 거부되는 속성을 지정하는 대신 허용되는 값을 모두 열거할 수 있습니다.

이 정책에서는 `PutItem`, `DeleteItem` 또는 `BatchWriteItem`을 허용하지 않습니다. 이들 작업은 항상 이전 항목 전체를 대체함으로써 사용자가 액세스할 수 없는 속성의 이전 값을 삭제할 수 있게 허용합니다.

이 권한 정책의 `StringEqualsIfExists` 절은 다음을 보장합니다.
+ 사용자가 `Select` 파라미터를 지정하는 경우 해당 값은 `SPECIFIC_ATTRIBUTES`이어야 합니다. 이렇게 하면 API 작업이 인덱스 프로젝션 등의 방법으로 허용되지 않는 속성을 반환할 수 없게 됩니다.
+ 사용자가 `ReturnValues` 파라미터를 지정하는 경우 해당 값은 `NONE`, `UPDATED_OLD` 또는 `UPDATED_NEW`이어야 합니다. 이는 `UpdateItem` 작업이 항목을 바꾸기 전에 항목이 존재하는지 여부를 확인하기 위해, 또한 요청한 경우 이전 속성 값을 반환할 수 있도록 암시적인 읽기 작업도 수행하기 때문에 필요합니다. 이 방식으로 `ReturnValues`를 제한하면 사용자가 허용된 속성만 읽거나 쓸 수 있습니다.
+ `StringEqualsIfExists` 절은 허용되는 작업의 컨텍스트에서 요청당 이러한 파라미터 중 하나만(`Select` 또는 `ReturnValues`) 사용할 수 있도록 합니다.

다음은 이 정책에 대한 몇 가지 변형 형태입니다.
+ 읽기 작업만 허용하려면 허용된 작업 목록에서 `UpdateItem`을 제거하면 됩니다. 나머지 작업 중 어떤 것도 `ReturnValues`를 허용하지 않으므로 조건에서 `ReturnValues`를 제거할 수 있습니다. 또한 `StringEqualsIfExists` 파라미터에는 항상 값(별도로 지정하지 않는 경우 `StringEquals`)이 있으므로 `Select`를 `ALL_ATTRIBUTES`로 변경할 수도 있습니다.
+ 쓰기 작업만 허용하려면 허용된 작업 목록에서 `UpdateItem`을 제외한 모든 작업을 제거하면 됩니다. `UpdateItem`에서는 `Select` 파라미터를 사용하지 않으므로 조건에서 `Select`를 제거할 수 있습니다. 또한 `StringEqualsIfExists` 파라미터에는 항상 값(별도로 지정하지 않는 경우 `StringEquals`)이 있으므로 `ReturnValues`를 `NONE`로 변경해야 합니다.
+ 이름이 패턴과 일치하는 모든 속성을 허용하려면 `StringLike` 대신에 `StringEquals`를 사용하고 다중 문자 패턴 와일드카드(\$1)를 사용합니다.

#### 예제 4: 특정 속성의 업데이트를 금지하는 권한을 부여
<a name="FGAC_DDB.Examples.PreventUpdates"></a>

다음 권한 정책은 사용자 액세스를 `dynamodb:Attributes` 조건 키로 식별되는 특정 속성만 업데이트하도록 제한합니다. `StringNotLike` 조건은 애플리케이션이 `dynamodb:Attributes` 조건 키를 사용하여 지정된 속성을 업데이트하는 것을 금지합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"PreventUpdatesOnCertainAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
         "Condition":{
            "ForAllValues:StringNotLike":{
               "dynamodb:Attributes":[
                  "FreeGamesAvailable",
                  "BossLevelUnlocked"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

다음을 참조하세요.
+ `UpdateItem` 작업은 다른 쓰기 작업과 마찬가지로 업데이트 전후의 값을 반환할 수 있도록 항목에 대한 읽기 액세스가 필요합니다. 이 정책에서는 `dynamodb:ReturnValues` 조건 키를 지정하여 작업이 업데이트를 허용할 속성에만 액세스하도록 제한합니다. 조건 키는 요청에서 `ReturnValues`를 제한하여 `NONE`, `UPDATED_OLD` 또는 `UPDATED_NEW`만 지정하며 `ALL_OLD` 또는 `ALL_NEW`를 포함하지 않습니다.
+ `StringEqualsIfExists` 연산자는 `dynamodb:Select` 또는 `dynamodb:ReturnValues`가 요청에 있는 경우 지정된 값과 일치해야 합니다. 이렇게 하면 작업에서 전체 항목을 반환할 수 없습니다.
+ 속성 업데이트를 제한할 때는 보호된 속성의 정보 공개를 방지하기 위해 반환할 수 있는 데이터도 제어해야 합니다.
+ `PutItem` 및 `DeleteItem` 작업은 전체 항목을 대체하므로 애플리케이션이 어떤 속성도 수정할 수 있습니다. 그러므로 애플리케이션을 특정 속성만 업데이트하도록 허용할 경우 이러한 API에 대한 권한을 부여하면 안 됩니다.

#### 예제 5: 인덱스에서 프로젝션 속성만 쿼리하는 권한을 부여
<a name="FGAC_DDB.Examples.QueryProjectedAttributes"></a>

다음 권한 정책은 `dynamodb:Attributes` 조건 키를 사용하여 보조 인덱스(`TopScoreDateTimeIndex`)에 대한 쿼리를 허용합니다. 또한 이 정책은 인덱스로 프로젝션된 특정 속성만 요청하도록 쿼리를 제한합니다.

또한 이 정책은 애플리케이션이 쿼리에서 속성 목록을 지정하도록 하기 위해 `dynamodb:Select` 조건 키를 지정하여 DynamoDB `Query` 작업의 `Select` 파라미터가 `SPECIFIC_ATTRIBUTES`가 되도록 요구합니다. 속성의 목록은 `dynamodb:Attributes` 조건 키를 사용하여 제공되는 특정 목록으로 제한됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryOnlyProjectedIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:Attributes":[
                  "TopScoreDateTime",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "Attempts"
               ]
            },
            "StringEquals":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

다음 권한 정책은 비슷하지만 쿼리가 인덱스로 프로젝션된 모든 속성을 요청해야 합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"QueryAllIndexAttributes",
         "Effect":"Allow",
         "Action":[
            "dynamodb:Query"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "StringEquals":{
               "dynamodb:Select":"ALL_PROJECTED_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

#### 예제 6: 액세스를 특정 속성 및 파티션 키 값으로 제한하는 권한을 부여
<a name="FGAC_DDB.Examples.AttributesAndKeyValues"></a>

다음 권한 정책은 테이블 및 테이블 인덱스(`Resource` 요소로 지정)에서 특정 DynamoDB 작업(`Action` 요소로 지정)을 허용합니다. 이 정책은 `dynamodb:LeadingKeys` 조건 키를 사용하여 파티션 키 값이 사용자의 Facebook ID와 일치하는 항목으로만 권한을 제한합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	                    
   "Statement":[
      {
         "Sid":"LimitAccessToCertainAttributesAndKeyValues",
         "Effect":"Allow",
         "Action":[
            "dynamodb:UpdateItem",
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:BatchGetItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores",
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores/index/TopScoreDateTimeIndex"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${graph.facebook.com:id}"
               ],
               "dynamodb:Attributes":[
                  "attribute-A",
                  "attribute-B"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES",
               "dynamodb:ReturnValues":[
                  "NONE",
                  "UPDATED_OLD",
                  "UPDATED_NEW"
               ]
            }
         }
      }
   ]
}
```

------

다음 사항에 유의하세요.
+ 정책(`UpdateItem`)에서 허용하는 쓰기 작업은 attribute-A 또는 attribute-B만 수정할 수 있습니다.
+ 이 정책은 `UpdateItem`을 허용하므로 애플리케이션이 새 항목을 삽입할 수 있으며 숨겨진 속성은 새 항목에서 null이 됩니다. 이러한 속성이 `TopScoreDateTimeIndex`로 프로젝션되면 이 정책은 쿼리로 인한 테이블에서의 가져오기를 방지하는 부가적인 이점도 얻게 됩니다.
+ 애플리케이션은 `dynamodb:Attributes`에 나열되지 않은 속성은 읽을 수 없습니다. 이 정책을 사용하면 애플리케이션은 읽기 요청에서 `Select` 파라미터를 `SPECIFIC_ATTRIBUTES`로 설정해야 하며, 허용 목록의 속성만 요청할 수 있습니다. 쓰기 요청의 경우, 애플리케이션은 `ReturnValues`를 `ALL_OLD` 또는 `ALL_NEW`로 설정할 수 없으며 다른 속성에 근거하여 조건부 쓰기 작업을 수행할 수 없습니다.

#### 예제 7: 테이블의 특정 속성에 대한 액세스를 제한하는 권한을 거부
<a name="FGAC_DDB.Examples.DenySpecificAttributes"></a>

다음 정책은 민감한 속성에 대한 액세스를 거부하고 프로젝션 표현식을 생략하여 이 제한을 우회할 수 없도록 합니다. `SSN` 및 `CreditCardNumber` 속성에 대한 액세스를 명시적으로 거부하면서 `CustomerData` 테이블에 대한 일반 액세스를 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData"
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "ForAnyValue:StringEquals":{
               "dynamodb:Attributes":[
                  "SSN",
                  "CreditCardNumber"
               ]
            }
         }
      },
      {
         "Effect":"Deny",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:Query",
            "dynamodb:Scan"
         ],
         "Resource":"arn:aws:dynamodb:us-west-2:123456789012:table/CustomerData",
         "Condition":{
            "StringNotEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

## 관련 주제
<a name="w2aac39c21c15c11"></a>
+  [Amazon DynamoDB의 Identity and Access Management](security-iam.md) 
+ [DynamoDB API 권한: 작업, 리소스 및 조건 참조](api-permissions-reference.md)

# 웹 아이덴티티 페더레이션 사용
<a name="WIF"></a>

대규모 사용자를 대상으로 하는 애플리케이션을 작성하려는 경우 필요에 따라 인증 및 권한 부여를 위해 *웹 자격 증명 연동* 기능을 사용할 수 있습니다. 웹 자격 증명 연동을 사용하면 개별 사용자를 생성할 필요가 없습니다. 그 대신에 사용자는 자격 증명 공급자에 로그인한 후 AWS Security Token Service(AWS STS)에서 임시 보안 자격 증명을 얻을 수 있습니다. 그러면 앱은 이러한 자격 증명을 사용하여 AWS 서비스에 액세스할 수 있습니다.

웹 자격 증명 연동은 다음 자격 증명 공급자를 지원합니다.
+ Login with Amazon
+ Facebook
+ Google

## 웹 ID 페더레이션 관련 추가 리소스
<a name="WIF.AdditionalResources"></a>

다음 리소스는 웹 ID 페더레이션에 대해 자세히 알아보는 데 도움이 됩니다.
+ AWS 개발자 블로그의 게시글 [AWS SDK for .NET을 사용한 웹 자격 증명 연동](https://aws.amazon.com/blogs/developer/web-identity-federation-using-the-aws-sdk-for-net)에서는 Facebook에서 웹 자격 증명 연동을 사용하는 방법을 안내합니다. 여기에는 웹 자격 증명으로 IAM 역할을 수임하는 방법과 임시 보안 자격 증명을 사용해 AWS 리소스에 액세스하는 방법을 보여주는 C\$1 코드 조각이 포함되어 있습니다.
+ [AWS Mobile SDK for iOS](https://aws.amazon.com/sdkforios/) 및 [AWS Mobile SDK for Android](https://aws.amazon.com/sdkforandroid/)에는 샘플 앱이 포함되어 있습니다. 이러한 앱에는 자격 증명 공급자를 호출하는 방법과 이러한 공급자의 정보를 사용하여 임시 보안 자격 증명을 가져오고 사용하는 방법을 보여 주는 코드가 포함되어 있습니다.
+ [모바일 애플리케이션을 사용한 웹 자격 증명 연동](https://aws.amazon.com/articles/4617974389850313) 항목에서는 웹 자격 증명 연동에 대해 설명하며, 웹 자격 증명 연동을 사용하여 AWS 리소스에 액세스하는 방법의 예를 보여 줍니다.

## 웹 아이덴티티 페더레이션에 대한 정책 예
<a name="WIF.Example"></a>

DynamoDB에서 웹 자격 증명 연동을 사용하는 방법을 보려면 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 소개된 *GameScores* 테이블을 다시 살펴보세요. 다음은 *GameScores*의 기본 키입니다.


****  

| 테이블 이름 | 기본 키 속성 | 파티션 키 이름 및 유형 | 정렬 키 이름 및 유형 | 
| --- | --- | --- | --- | 
| GameScores(UserId, GameTitle, ...) | 복합 | 속성 이름: UserId 유형: 문자열 | 속성 이름: GameTitle 유형: 문자열 | 

이번에는 모바일 게임 앱에서 이 테이블을 사용하며 해당 앱에서 수천 명 또는 수만 명의 사용자를 지원해야 한다고 가정해 보겠습니다. 이 규모에서는 개별 앱 사용자를 관리하고 각 사용자가 *GameScores* 테이블에서 자신의 고유 데이터에만 액세스할 수 있도록 하는 것이 매우 어렵습니다. 다행히 많은 사용자가 이미 Facebook, Google 또는 Login with Amazon 같은 타사 자격 증명 공급자의 계정을 이미 보유하고 있습니다. 따라서 인증 작업에 대해 이러한 공급자 중 하나를 활용할 수 있습니다.

웹 자격 증명 연동을 사용하여 이 작업을 수행하려면 앱 개발자가 자격 증명 공급자(예: Login with Amazon)에 앱을 등록하고 고유한 앱 ID를 받아야 합니다. 그러고 나면 개발자는 IAM 역할을 생성해야 합니다. (이 예에서 이 역할의 이름은 *GameRole*입니다.) 이 역할에는 앱이 *GameScores* 테이블에 액세스할 수 있는 조건을 지정하는 IAM 정책 문서가 연결되어 있어야 합니다.

게임을 플레이하려는 사용자는 해당 게임 앱에서 자신의 Login with Amazon 계정에 로그인해야 합니다. 그런 다음 앱은 Login with Amazon 앱 ID를 지정하고 *GameRole*의 멤버십을 요청하여 AWS Security Token Service(AWS STS)를 직접적으로 호출합니다. AWS STS는 임시 AWS 자격 증명을 앱에 반환하여 앱이 *GameRole* 정책 문서에 따라 *GameScores* 테이블에 액세스하도록 허용합니다.

다음 다이어그램은 이러한 각 단계가 어떻게 서로 연결되는지 보여 줍니다.

![\[게임 앱의 워크플로입니다. 앱은 Amazon ID 및 AWS STS를 사용하여 DynamoDB 테이블에 액세스하기 위한 임시 자격 증명을 얻습니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/wif-overview.png)


**웹 아이덴티티 페더레이션 개요**

1. 앱은 타사 자격 증명 공급자를 호출하여 사용자와 앱을 인증합니다. 자격 증명 공급자가 웹 자격 증명 토큰을 앱에 반환합니다.

1. 앱이 AWS STS를 호출하고 웹 자격 증명 토큰을 입력으로 전달합니다. AWS STS는 앱에 권한을 부여하고 임시 AWS 액세스 자격 증명을 제공합니다. 앱은 IAM 역할(*GameRole*)을 수임하고 역할의 보안 정책에 따라 AWS 리소스에 액세스할 수 있습니다.

1. 앱은 DynamoDB를 호출하여 *GameScores* 테이블에 액세스합니다. *GameRole*을 위임했으므로 앱은 해당 역할과 연결된 보안 정책을 준수해야 합니다. 정책 문서는 앱이 사용자와 관련이 없는 데이터에 액세스할 수 없도록 합니다.

다시 한번 다음은 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)에 나온 *GameRole*의 보안 정책입니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Sid":"AllowAccessToOnlyItemsMatchingUserID",
         "Effect":"Allow",
         "Action":[
            "dynamodb:GetItem",
            "dynamodb:BatchGetItem",
            "dynamodb:Query",
            "dynamodb:PutItem",
            "dynamodb:UpdateItem",
            "dynamodb:DeleteItem",
            "dynamodb:BatchWriteItem"
         ],
         "Resource":[
            "arn:aws:dynamodb:us-west-2:123456789012:table/GameScores"
         ],
         "Condition":{
            "ForAllValues:StringEquals":{
               "dynamodb:LeadingKeys":[
                  "${www.amazon.com:user_id}"
               ],
               "dynamodb:Attributes":[
                  "UserId",
                  "GameTitle",
                  "Wins",
                  "Losses",
                  "TopScore",
                  "TopScoreDateTime"
               ]
            },
            "StringEqualsIfExists":{
               "dynamodb:Select":"SPECIFIC_ATTRIBUTES"
            }
         }
      }
   ]
}
```

------

`Condition` 절은 앱에 표시되는 *GameScores*의 항목을 결정합니다. 이 작업은 Login with Amazon ID를 `UserId`의 `GameScores` 파티션 키 값과 비교하여 수행됩니다. 이 정책에 나열된 DynamoDB 작업 중 하나를 통해서는 현재 사용자에게 속한 항목만 처리할 수 있습니다. 테이블의 다른 항목에는 액세스할 수 없습니다. 또한 정책에 나열된 특정 속성만 액세스할 수 있습니다.

# 웹 아이덴티티 페더레이션을 사용하기 위한 준비
<a name="WIF.PreparingForUse"></a>

애플리케이션 개발자이며 앱에 대해 웹 자격 증명 연동을 사용하려면 다음 단계를 따릅니다.

1. **타사 자격 증명 공급자에 개발자로 가입합니다.** 다음 외부 링크는 지원되는 자격 증명 공급 가입에 대한 정보를 제공합니다.
   + [Login with Amazon 개발자 센터](http://login.amazon.com/)
   + [Facebook 사이트의 Registration](https://business.facebook.com/business/loginpage)
   + [Google 사이트의 Using OAuth 2.0 to Access Google APIs](https://developers.google.com/accounts/docs/OAuth2)

1. **자신의 앱을 자격 증명 공급자에 등록합니다.** 이 작업을 수행하면 공급자가 앱에 고유한 ID를 제공합니다. 앱이 여러 자격 증명 공급자에서 작동하도록 하려면 각 공급자로부터 앱 ID를 얻어야 합니다.

1. **하나 이상의 IAM 역할을 생성합니다. ** 각 앱에서는 자격 증명 공급자마다 한 개의 역할이 필요합니다 예를 들면 사용자가 Login with Amazon을 사용하여 로그인한 앱에 의해 위임될 수 있는 역할, 사용자가 Facebook을 사용하여 로그인한 동일 앱에 대한 두 번째 역할, 그리고 사용자가 Google을 사용하여 로그인하는 앱에 대한 세 번째 역할을 생성할 수 있습니다.

   역할 생성 과정의 일부로 IAM 정책을 해당 역할에 연결해야 합니다. 정책 문서에 앱이 필요로 하는 DynamoDB 리소스와, 이러한 리소스에 액세스할 수 있는 권한을 정의해야 합니다.

자세한 내용은 *IAM 사용 설명서*의 [웹 자격 증명 연동 정보](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) 단원을 참조하세요.

**참고**  
AWS Security Token Service 대신 Amazon Cognito를 사용할 수 있습니다. Amazon Cognito는 모바일 앱의 임시 자격 증명을 관리하는 기본 서비스입니다. 자세한 내용은 **Amazon Cognito 개발자 안내서의 [자격 증명 얻기](https://docs.aws.amazon.com/cognito/latest/developerguide/getting-credentials.html)를 참조하세요.

## DynamoDB 콘솔을 사용하여 IAM 정책 생성
<a name="WIF.PreparingForUse.DDBConsole"></a>

DynamoDB 콘솔은 웹 자격 증명 연동에 사용할 IAM 정책을 생성하는 데 도움이 됩니다. 정책을 생성하려면 DynamoDB 테이블을 선택하고 정책에 포함할 자격 증명 공급자, 작업 및 속성을 지정해야 합니다. 그러면 DynamoDB 콘솔에서 IAM 역할에 연결할 수 있는 정책이 생성합니다.

1. AWS Management Console에 로그인하고 [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)에서 DynamoDB 콘솔을 엽니다.

1.  탐색 창에서 **테이블**을 선택합니다.

1.  테이블 목록에서 IAM 정책을 생성할 테이블을 선택합니다.

1.  **작업** 버튼을 클릭하고 **액세스 제어 정책 생성**을 선택합니다.

1.  정책에 대해 ID 공급자, 작업 및 속성을 선택합니다.

    원하는 대로 설정되었으면 **정책 생성**을 선택합니다. 생성된 정책이 표시됩니다.

1.  **설명서 참조**를 선택하고 생성된 정책을 IAM 역할에 연결하는 데 필요한 단계를 따릅니다.

# 웹 아이덴티티 페더레이션을 사용할 앱 작성
<a name="WIF.RunningYourApp"></a>

웹 자격 증명 연동을 사용하려면 사용자가 생성한 IAM 역할을 앱이 수임해야 합니다. 그 시점 이후로 앱은 사용자가 역할에 연결한 액세스 정책을 준수합니다.

런타임 시 앱에 웹 자격 증명 연동이 사용되는 경우 다음 단계를 따라야 합니다.

1. **타사 자격 증명 공급자를 사용하여 인증합니다.** 앱은 제공되는 인터페이스를 사용하여 자격 증명 공급자를 호출해야 합니다. 사용자를 인증하는 정확한 방법은 앱이 실행 중인 플랫폼과 공급자에 따라 달라집니다. 일반적으로 사용자가 아직 로그인하지 않은 경우 자격 증명 공급자가 해당 공급자의 로그인 페이지 표시를 처리합니다.

   자격 증명 공급자는 사용자를 인증한 후 웹 자격 증명 토큰을 앱에 반환합니다. 이 토큰의 형식은 공급자마다 다르지만, 일반적으로는 매우 긴 문자열 형식입니다.

1. **임시 AWS 보안 자격 증명을 얻습니다.** 이렇게 하려면 앱이 `AssumeRoleWithWebIdentity` 요청을 AWS Security Token Service(AWS STS)로 보냅니다. 이 요청은 다음을 포함합니다.
   + 이전 단계의 웹 자격 증명 토큰
   + 자격 증명 공급자에게서 받은 앱 ID
   + 이 앱의 자격 증명 공급자에 대해 생성한 IAM 역할의 Amazon 리소스 이름(ARN)

   AWS STS는 일정 시간(기본적으로 3600초)이 지나면 만료되는 AWS 보안 자격 증명 집합을 반환합니다.

   다음은 샘플 요청과 `AssumeRoleWithWebIdentity`의 AWS STS 작업에서 받은 응답입니다. 웹 자격 증명 토큰은 Login with Amazon 자격 증명 공급자로부터 얻었습니다.

   ```
   GET / HTTP/1.1
   Host: sts.amazonaws.com
   Content-Type: application/json; charset=utf-8
   URL: https://sts.amazonaws.com/?ProviderId=www.amazon.com
   &DurationSeconds=900&Action=AssumeRoleWithWebIdentity
   &Version=2011-06-15&RoleSessionName=web-identity-federation
   &RoleArn=arn:aws:iam::123456789012:role/GameRole
   &WebIdentityToken=Atza|IQEBLjAsAhQluyKqyBiYZ8-kclvGTYM81e...(remaining characters omitted)
   ```

   

   ```
   <AssumeRoleWithWebIdentityResponse
     xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
     <AssumeRoleWithWebIdentityResult>
       <SubjectFromWebIdentityToken>amzn1.account.AGJZDKHJKAUUSW6C44CHPEXAMPLE</SubjectFromWebIdentityToken>
       <Credentials>
         <SessionToken>AQoDYXdzEMf//////////wEa8AP6nNDwcSLnf+cHupC...(remaining characters omitted)</SessionToken>
         <SecretAccessKey>8Jhi60+EWUUbbUShTEsjTxqQtM8UKvsM6XAjdA==</SecretAccessKey>
         <Expiration>2013-10-01T22:14:35Z</Expiration>
         <AccessKeyId>06198791C436IEXAMPLE</AccessKeyId>
       </Credentials>
       <AssumedRoleUser>
         <Arn>arn:aws:sts::123456789012:assumed-role/GameRole/web-identity-federation</Arn>
         <AssumedRoleId>AROAJU4SA2VW5SZRF2YMG:web-identity-federation</AssumedRoleId>
       </AssumedRoleUser>
     </AssumeRoleWithWebIdentityResult>
     <ResponseMetadata>
       <RequestId>c265ac8e-2ae4-11e3-8775-6969323a932d</RequestId>
     </ResponseMetadata>
   </AssumeRoleWithWebIdentityResponse>
   ```

1. **AWS 소스에 액세스합니다.** AWS STS의 응답에는 앱이 DynamoDB 리소스에 액세스하는 데 필요한 정보가 포함되어 있습니다.
   + `AccessKeyID`, `SecretAccessKey` 및 `SessionToken` 필드에는 이 사용자와 이 앱에만 유효한 보안 자격 증명이 들어 있습니다.
   + `Expiration` 필드는 이러한 자격 증명이 유효 상태로 유지되는 제한 시간을 지정합니다.
   + `AssumedRoleId` 필드에는 앱에 의해 수임된 세션별 IAM 역할의 이름이 포함되어 있습니다. 앱은 이 세션 기간 동안 IAM 정책 문서의 액세스 제어를 준수합니다.
   + `SubjectFromWebIdentityToken` 필드에는 이 특정 자격 증명 공급자에 대한 IAM 정책 변수에 표시되는 고유 ID가 포함되어 있습니다. 다음은 지원되는 공급자에 대한 IAM 정책 변수이며, 몇 가지 예를 들면 다음과 같습니다.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/WIF.RunningYourApp.html)

이러한 정책 변수가 사용되는 IAM 정책의 예는 [정책 예: 조건을 사용하여 세부적인 액세스 제어 구현](specifying-conditions.md#FGAC_DDB.Examples) 단원을 참조하세요.

AWS STS가 임시 액세스 자격 증명을 생성하는 방법에 대한 자세한 내용은 *IAM 사용 설명서*의 [임시 보안 자격 증명 요청](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html) 단원을 참조하세요.

# DynamoDB API 권한: 작업, 리소스 및 조건 참조
<a name="api-permissions-reference"></a>

[Amazon DynamoDB의 Identity and Access Management](security-iam.md)를 설정하고 IAM 자격 증명에 연결할 수 있는 권한 정책(자격 증명 기반 정책)을 작성할 때 *IAM 사용 설명서*에서 [Amazon DynamoDB에 사용되는 작업, 리소스 및 조건 키](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazondynamodb.html) 목록을 참조로 사용할 수 있습니다. 해당 페이지에는 각 DynamoDB API 작업, 작업을 수행할 권한을 부여할 수 있는 해당 작업, 권한을 부여할 수 있는 대상 AWS 리소스가 나열되어 있습니다. 정책의 `Action`필드에서 작업을 지정하고, 정책의 `Resource`필드에서 리소스 값을 지정합니다.

DynamoDB 정책에서 AWS 차원 조건 키를 사용하여 조건을 표현할 수 있습니다. AWS 차원 키의 전체 목록은 *IAM 사용 설명서*의 [IAM JSON 정책 요소 참조](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys)를 참조하세요.

AWS 차원 조건 키 이외에도 DynamoDB에는 조건에 사용할 수 있는 고유한 특정 키가 있습니다. 자세한 내용은 [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md) 섹션을 참조하세요.

## 관련 주제
<a name="w2aac39c21c15c15b9"></a>
+  [Amazon DynamoDB의 Identity and Access Management](security-iam.md)
+ [IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현](specifying-conditions.md)

# DynamoDB에 대한 업종별 규정 준수 확인
<a name="Compliance"></a>

AWS 서비스가 특정 규정 준수 프로그램의 범위에 포함되는지 알아보려면 [규정 준수 프로그램 제공 범위 내 AWS 서비스](https://aws.amazon.com/compliance/services-in-scope/)를 참조하고 관심 있는 규정 준수 프로그램을 선택합니다. 일반적인 정보는 [AWS 규정 준수 프로그램](https://aws.amazon.com/compliance/programs/)을 참조하세요.

AWS Artifact를 사용하여 타사 감사 보고서를 다운로드할 수 있습니다. 자세한 내용은 [AWS Artifact에서 보고서 다운로드](https://docs.aws.amazon.com/artifact/latest/ug/downloading-documents.html)를 참조하세요.

AWS 서비스 사용 시 규정 준수 책임은 데이터의 민감도, 회사의 규정 준수 목표 및 관련 법률 및 규정에 따라 결정됩니다. AWS 서비스 사용 시 규정 준수 책임에 대한 자세한 내용은 [AWS 보안 설명서](https://docs.aws.amazon.com/security/) 참조하세요.

# Amazon DynamoDB의 복원성 및 재해 복구
<a name="disaster-recovery-resiliency"></a>

AWS 글로벌 인프라는 AWS 리전 및 가용 영역을 중심으로 구축됩니다. AWS 리전은 물리적으로 분리되고 격리된 다수의 가용 리전을 제공하며 이러한 가용 리전은 짧은 지연 시간, 높은 처리량 및 높은 중복성을 갖춘 네트워크에 연결되어 있습니다. 가용 영역을 사용하면 중단 없이 가용 영역 간에 자동으로 장애 조치가 이루어지는 애플리케이션 및 데이터베이스를 설계하고 운영할 수 있습니다. 가용 영역은 기존의 단일 또는 복수 데이터 센터 인프라보다 가용성, 내결함성, 확장성이 뛰어납니다.

더 먼 지역적 거리를 두고 데이터 또는 애플리케이션을 복제해야 하는 경우 AWS 로컬 리전을 사용하세요. AWS 로컬 리전은 기존 AWS 리전을 보완하기 위해 설계된 단일 데이터 센터입니다. 모든 AWS 리전과 마찬가지로 AWS 로컬 리전은 다른 AWS 리전과 완벽히 격리되어 있습니다.

AWS 리전 및 가용 영역에 대한 자세한 내용은 [AWS 글로벌 인프라](https://aws.amazon.com/about-aws/global-infrastructure/)를 참조하세요.

Amazon DynamoDB는 리전 내 3개의 가용 영역에 데이터를 자동으로 복제하여 기본적으로 높은 내구성과 99.99% 가용성 SLA를 제공합니다. 또한 Amazon DynamoDB는 데이터 복원성과 백업 요구 사항을 지원하는 다양한 기능을 제공합니다.

**온디맨드 백업 및 복원**  
DynamoDB는 온디맨드 백업 기능을 제공합니다. 따라서 테이블의 전체 백업을 생성하여 장기간 유지하고 보관할 수 있습니다. 자세한 내용은 [DynamoDB에 대한 온디맨드 백업 및 복원](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Backup-and-Restore.html)을 참조하세요.

**시점 복구**  
특정 시점으로 복구를 사용하면 우발적인 쓰기 또는 삭제 작업으로부터 DynamoDB 테이블을 보호할 수 있습니다. 특정 시점으로 복구를 설정해 두면 온디맨드 백업의 생성, 유지 관리, 예약을 걱정할 필요가 없습니다. 자세한 내용은 [DynamoDB의 특정 시점으로 복구](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Point-in-time-recovery.html)를 참조하세요.

**여러 AWS 리전에서 동기화되는 글로벌 테이블**  
DynamoDB는 테이블의 데이터와 트래픽을 충분한 수의 서버로 자동 분산하여 처리량 및 스토리지 요구 사항을 처리하면서도 일관되고 빠른 성능을 유지합니다. 모든 데이터가 SSD(Solid State Disk)에 저장되고 AWS 리전의 여러 가용 영역에 걸쳐 자동 복제되기 때문에 확실한 고가용성과 데이터 내구성을 제공합니다. 전역 테이블을 사용하여 AWS 리전 간에 DynamoDB 테이블을 동기화할 수 있습니다.

# Amazon DynamoDB의 인프라 보안
<a name="network-isolation"></a>

관리형 서비스인 Amazon DynamoDB는 AWS Well-Architected Framework의 [인프라 보호](https://docs.aws.amazon.com/wellarchitected/latest/security-pillar/infrastructure-protection.html)에 설명된 AWS 글로벌 네트워크 보안 절차로 보호됩니다.

AWS에서 게시한 API 호출을 사용하여 네트워크를 통해 DynamoDB에 액세스합니다. 클라이언트는 TLS(전송 계층 보안) 버전 1.2 또는 1.3을 사용할 수 있습니다. 클라이언트는 DHE(Ephemeral Diffie-Hellman) 또는 ECDHE(Elliptic Curve Diffie-Hellman Ephemeral)와 같은 PFS(전달 완전 보안)가 포함된 암호 제품군도 지원해야 합니다. Java 7 이상의 최신 시스템은 대부분 이러한 모드를 지원합니다. 또한 요청은 액세스 키 ID 및 IAM 주체와 관련된 보안 액세스 키를 사용하여 서명해야 합니다. 또는 [AWS Security Token Service](https://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html)(AWS STS)를 사용하여 임시 보안 자격 증명을 생성하여 요청에 서명할 수 있습니다.

 DynamoDB에 대한 Virtual Private Cloud(VPC) 엔드포인트를 사용하면 VPC의 Amazon EC2 인스턴스가 퍼블릭 인터넷에 노출되지 않고도 프라이빗 IP 주소를 사용해 DynamoDB에 액세스할 수 있게 할 수 있습니다. 자세한 내용은 [Amazon VPC 엔드포인트를 사용하여 DynamoDB에 액세스](#vpc-endpoints-dynamodb) 섹션을 참조하세요.

## Amazon VPC 엔드포인트를 사용하여 DynamoDB에 액세스
<a name="vpc-endpoints-dynamodb"></a>

보안상의 이유로 많은 AWS 고객은 Amazon Virtual Private Cloud 환경(Amazon VPC)에서 애플리케이션을 실행합니다. Amazon VPC를 통해 Amazon EC2 인스턴스를 퍼블릭 인터넷을 비롯한 다른 네트워크와 논리적으로 분리된 Virtual Private Cloud로 시작할 수 있습니다. Amazon VPC를 사용하면 IP 주소 범위, 서브넷, 라우팅 테이블, 네트워크 게이트웨이 및 보안 설정을 통제할 수 있습니다.

**참고**  
2013년 12월 4일 이후 AWS 계정을 생성했다면 각 AWS 리전에 기본 VPC가 갖추어져 있습니다. 기본 VPC는 바로 사용할 수 있으므로 별도의 구성 단계 없이 즉시 사용할 수 있습니다.  
자세한 내용은 *Amazon VPC 사용 설명서*의 [기본 VPC 및 기본 서브넷](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)을 참조하세요.

퍼블릭 인터넷에 액세스하려면 VPC를 인터넷에 연결하는 가상 라우터인 인터넷 게이트웨이가 VPC에 있어야 합니다. 이를 통해 VPC의 Amazon EC2에서 실행되는 애플리케이션이 Amazon DynamoDB와 같은 인터넷 리소스에 액세스할 수 있습니다.

기본적으로 DynamoDB와의 통신은 SSL/TLS 암호화를 사용하여 네트워크 트래픽을 보호하는 HTTPS 프로토콜을 사용합니다. 다음 다이어그램은 DynamoDB가 VPC 엔드포인트 대신 인터넷 게이트웨이를 사용하도록 하여 DynamoDB에 액세스하는 VPC의 Amazon EC2 인스턴스를 보여줍니다.

![\[라우터, 인터넷 게이트웨이 및 인터넷을 통해 DynamoDB에 액세스하는 Amazon EC2 인스턴스를 보여주는 워크플로 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/ddb-no-vpc-endpoint.png)


많은 고객이 퍼블릭 인터넷을 통해 데이터를 주고받는 것에 대한 합법적인 개인 정보 보호 및 보안 문제를 우려합니다. 가상 사설 네트워크(VPN)를 사용하여 모든 DynamoDB 네트워크 트래픽을 자체 기업 네트워크 인프라를 통해 라우팅함으로써 이러한 문제를 해결할 수 있습니다. 그러나 이러한 접근 방식은 대역폭 및 가용성 문제를 일으킬 수 있습니다.

DynamoDB에 대한 VPC 엔드포인트는 이러한 문제를 완화할 수 있습니다. DynamoDB에 대한 *VPC 엔드포인트*를 사용하면 VPC의 Amazon EC2 인스턴스가 퍼블릭 인터넷에 노출되지 않고도 프라이빗 IP 주소를 사용해 DynamoDB에 액세스할 수 있습니다. EC2 인스턴스에 퍼블릭 IP 주소를 지정할 필요가 없으며 VPC에서 인터넷 게이트웨이, NAT 디바이스 또는 가상 프라이빗 게이트웨이가 필요 없습니다. 엔드포인트 정책을 사용하여 DynamoDB에 대한 액세스를 제어합니다. VPC와 AWS 서비스 간의 트래픽은 Amazon 네트워크를 벗어나지 않습니다.

**참고**  
 퍼블릭 IP 주소를 사용하는 경우에도 AWS에 호스팅된 인스턴스와 서비스 간의 모든 VPC 통신은 AWS 네트워크 내에서 프라이빗 상태를 유지합니다. AWS 네트워크에 목적지가 있는 AWS 네트워크에서 시작된 패킷은 AWS 중국 리전으로 오가는 트래픽을 제외하고 AWS 글로벌 네트워크에 남아 있습니다.

DynamoDB에 대한 VPC 엔드포인트를 생성하면 리전 내의 DynamoDB 엔드포인트(예: *dynamodb.us-west-2.amazonaws.com*)에 대한 모든 요청이 Amazon 네트워크 내의 프라이빗 DynamoDB 종단점으로 라우팅됩니다. VPC의 EC2 인스턴스에서 실행 중인 애플리케이션을 수정할 필요가 없습니다. 엔드포인트 이름은 변함이 없지만 DynamoDB로의 경로는 전적으로 Amazon 네트워크 내에 유지되며 퍼블릭 인터넷에 액세스하지 않습니다.

다음 다이어그램은 VPC의 EC2 인스턴스가 DynamoDB에 액세스하기 위해 VPC 엔드포인트를 사용하는 방법을 보여 줍니다.

![\[라우터와 VPC 종단점을 통해서만 DynamoDB에 액세스하는 EC2 인스턴스를 보여주는 워크플로 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/ddb-yes-vpc-endpoint.png)


자세한 내용은 [자습서: DynamoDB에 대한 VPC 엔드포인트 사용](#vpc-endpoints-dynamodb-tutorial) 섹션을 참조하세요.

### Amazon VPC 엔드포인트 및 DynamoDB 공유
<a name="vpc-endpoints-dynamodb-sharing"></a>

VPC 서브넷의 게이트웨이 엔드포인트를 통해 DynamoDB 서비스에 액세스할 수 있으려면 해당 VPC 서브넷에 대한 소유자 계정 권한이 있어야 합니다.

 VPC 서브넷의 게이트웨이 엔드포인트에 DynamoDB에 대한 액세스 권한이 부여되면 해당 서브넷에 액세스할 수 있는 모든 AWS 계정이 DynamoDB를 사용할 수 있습니다. 즉, VPC 서브넷 내의 모든 계정 사용자는 액세스 권한이 있는 모든 DynamoDB 테이블을 사용할 수 있습니다. 여기에는 VPC 서브넷과는 다른 계정에 연결된 DynamoDB 테이블이 포함됩니다. VPC 서브넷 소유자는 재량에 따라 서브넷 내의 특정 사용자가 게이트웨이 엔드포인트를 통해 DynamoDB 서비스를 사용하는 것을 제한할 수 있습니다.

### 자습서: DynamoDB에 대한 VPC 엔드포인트 사용
<a name="vpc-endpoints-dynamodb-tutorial"></a>

이 단원에서는 DynamoDB에 대해 VPC 엔드포인트를 설정하고 사용하는 절차를 살펴봅니다.

**Topics**
+ [1단계: Amazon EC2 인스턴스 시작](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance)
+ [2단계: Amazon EC2 인스턴스 구성](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance)
+ [3단계: DynamoDB에 대한 VPC 엔드포인트 생성](#vpc-endpoints-dynamodb-tutorial.create-endpoint)
+ [4단계: (선택 사항) 정리](#vpc-endpoints-dynamodb-tutorial.clean-up)

#### 1단계: Amazon EC2 인스턴스 시작
<a name="vpc-endpoints-dynamodb-tutorial.launch-ec2-instance"></a>

이 단계에서는 기본 Amazon VPC에서 Amazon EC2 인스턴스를 시작합니다. 그런 다음 DynamoDB에 대해 VPC 엔드포인트를 생성하고 사용할 수 있습니다.

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. **인스턴스 시작**을 선택하고 다음을 수행합니다.

   단계: Amazon Machine Image(AMI) 선택
   + AMI 목록 맨 위에서 [**Amazon Linux AMI**]로 이동한 후 [**Select**]를 선택합니다.

   단계: 인스턴스 유형 선택
   + 인스턴스 유형 목록 맨 위에서 [**t2.micro**]를 선택합니다.
   + [**Next: Configure Instance Details**]를 선택합니다.

   단계: 인스턴스 세부 정보 구성
   + [**Network**]로 이동한 후 기본 VPC를 선택합니다.

     **다음: 스토리지 추가**를 선택합니다.

   단계: 스토리지 추가
   + [**Next: Tag Instance**]를 선택하여 이 단계를 건너뜁니다.

   단계: 인스턴스에 태그 지정
   + [**Next: Configure Security Group**]을 선택하여 이 단계를 건너뜁니다.

   단계: 보안 그룹 구성
   + **기존 보안 그룹 선택**을 선택합니다.
   + 보안 그룹 목록에서 **기본값**을 선택합니다. 이것이 VPC의 기본 보안 그룹입니다.
   + [**Next: Review and Launch**]를 선택합니다.

   단계: 인스턴스 시작 검토
   + **시작**을 선택합니다.

1. [**Select an existing key pair or create a new key pair**] 창에서 다음 중 하나를 수행합니다.
   + Amazon EC2 키 페어가 없는 경우 **Create a new key pair(새 키 페어 생성)**를 선택하고 지침을 따릅니다. 프라이빗 키 파일(*.pem* 파일)을 다운로드하라는 메시지가 표시됩니다. 이 파일은 나중에 Amazon EC2 인스턴스에 로그인할 때 필요합니다.
   + Amazon EC2 키 페어가 이미 있으면 **Select a key pair(키 페어 선택)**로 이동하고 목록에서 해당 키 페어를 선택합니다. Amazon EC2 인스턴스에 로그인하려면 프라이빗 키 파일(*.pem* 파일)이 있어야 합니다.

1. 구성된 키 페어가 있으면 **Launch Instances(인스턴스 시작)**를 선택합니다.

1. Amazon EC2 콘솔 홈 페이지로 돌아가서 시작한 인스턴스를 선택합니다. 하단 창의 [**Description**] 탭에서 인스턴스의 [**Public DNS**]를 확인합니다. 예를 들면 `ec2-00-00-00-00.us-east-1.compute.amazonaws.com`입니다.

   이 퍼블릭 DNS 이름은 이 자습서의 다음 단계([2단계: Amazon EC2 인스턴스 구성](#vpc-endpoints-dynamodb-tutorial.configure-ec2-instance))에서 필요하므로 기록해 둡니다.

**참고**  
Amazon EC2 인스턴스가 사용 가능한 상태가 되는 데 몇 분 정도 걸립니다. 다음 단계로 이동하기 전에 [**Instance State**]가 `running`이고 모든 [**Status Checks**]가 통과되었는지 확인하세요.

#### 2단계: Amazon EC2 인스턴스 구성
<a name="vpc-endpoints-dynamodb-tutorial.configure-ec2-instance"></a>

Amazon EC2 인스턴스를 사용할 수 있는 경우 해당 인스턴스에 로그인하고 첫 사용이 가능한 상태로 준비할 수 있습니다.

**참고**  
다음 단계에서는 사용자가 Linux를 실행하는 컴퓨터에서 Amazon EC2 인스턴스로 연결되어 있다고 가정합니다. 다른 연결 방법은 Linux 인스턴스용 Amazon EC2 사용 설명서의 [Linux 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstances.html) 단원을 참조하세요.

1. Amazon EC2 인스턴스에 대한 인바운드 SSH 트래픽을 승인해야 합니다. 이를 위해 새로운 EC2 보안 그룹을 생성하여 EC2 인스턴스에 할당합니다.

   1. 탐색 창에서 **보안 그룹**을 선택합니다.

   1. **보안 그룹 생성**을 선택합니다. **보안 그룹 생성** 창에서 다음을 수행하세요.
      + **Security group name(보안 그룹 이름)** - 보안 그룹의 이름을 입력합니다. 예: `my-ssh-access`
      + **Description(설명)** - 보안 그룹에 대한 간단한 설명을 입력합니다.
      + **VPC** - 기본 VPC를 선택합니다.
      + [**Security group rules**] 단원에서 [**Add Rule**]을 선택하고 다음을 수행합니다.
        + **Type(유형)** - SSH를 선택합니다.
        + **Source(소스)** - 내 IP를 선택합니다.

      원하는 대로 설정되었으면 [**Create**]를 선택합니다.

   1. 탐색 창에서 **인스턴스**를 선택합니다.

   1. [1단계: Amazon EC2 인스턴스 시작](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance)에서 시작한 Amazon EC2 인스턴스를 선택합니다.

   1. **Actions(작업)** --> **네트워킹** --> **보안 그룹 변경**을 차례로 선택합니다.

   1. [**보안 그룹 변경**]에서 이 절차에서 앞서 생성한 보안 그룹을 선택합니다(예: `my-ssh-access`). 기존 `default` 보안 그룹도 선택되어야 합니다. 원하는 대로 설정되었으면 [**보안 그룹 할당**]을 선택합니다.

1. `ssh` 명령을 사용하여 Amazon EC2 인스턴스에 로그인합니다(아래 예 참조).

   ```
   ssh -i my-keypair.pem ec2-user@public-dns-name
   ```

   프라이빗 키 파일(*.pem* 파일)과 인스턴스의 퍼블릭 DNS 이름을 지정해야 합니다. ([1단계: Amazon EC2 인스턴스 시작](#vpc-endpoints-dynamodb-tutorial.launch-ec2-instance) 단원을 참조하세요.) 

   로그인 ID는 `ec2-user`입니다. 암호는 필요하지 않습니다.

1. 다음 예제와 같이 AWS 자격 증명을 구성합니다. 메시지가 나타나면 AWS 액세스 키 ID, 비밀 키 및 기본 리전 이름을 입력합니다.

   ```
   aws configure
   ```

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-east-1
   Default output format [None]:
   ```

이제 DynamoDB에 대한 VPC 엔드포인트를 생성할 준비가 되었습니다.

#### 3단계: DynamoDB에 대한 VPC 엔드포인트 생성
<a name="vpc-endpoints-dynamodb-tutorial.create-endpoint"></a>

이 단계에서는 DynamoDB에 대한 VPC 엔드포인트를 생성하고 이 엔드포인트가 작동하는지 테스트합니다.

1. 시작하기 전에 퍼블릭 엔드포인트를 사용하여 DynamoDB와 통신할 수 있는지 확인합니다.

   ```
   aws dynamodb list-tables
   ```

   출력에는 현재 보유하고 있는 DynamoDB 테이블 목록이 표시됩니다. (보유 중인 테이블이 없는 경우 목록이 비어있음).

1. DynamoDB가 현재 AWS 리전에서 VPC 엔드포인트를 생성하기 위해 사용할 수 있는 서비스인지 확인합니다. (명령은 예제 출력에 이어 굵은 텍스트로 표시됩니다.)

   ```
   aws ec2 describe-vpc-endpoint-services
   ```

   ```
   {
       "ServiceNames": [
           "com.amazonaws.us-east-1.s3",
           "com.amazonaws.us-east-1.dynamodb"
       ]
   }
   ```

   예제 출력에서 DynamoDB는 사용할 수 있는 서비스 중 하나이므로 이에 대한 VPC 엔트포인트를 생성할 수 있습니다.

1. VPC 식별자 확인

   ```
   aws ec2 describe-vpcs
   ```

   ```
   {
       "Vpcs": [
           {
               "VpcId": "vpc-0bbc736e", 
               "InstanceTenancy": "default", 
               "State": "available", 
               "DhcpOptionsId": "dopt-8454b7e1", 
               "CidrBlock": "172.31.0.0/16", 
               "IsDefault": true
           }
       ]
   }
   ```

   예제 출력에서 VPC ID는 `vpc-0bbc736e`입니다.

1. VPC 엔드포인트를 생성합니다. `--vpc-id` 파라미터에 대해 이전 단계에서 VPC ID를 지정합니다. `--route-table-ids` 파라미터를 사용하여 엔드포인트를 라우팅 테이블과 연결합니다.

   ```
   aws ec2 create-vpc-endpoint --vpc-id vpc-0bbc736e --service-name com.amazonaws.us-east-1.dynamodb --route-table-ids rtb-11aa22bb
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [
               "rtb-11aa22bb"
           ],
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

1. VPC 엔드포인트를 통해 DynamoDB에 액세스할 수 있는지 확인합니다.

   ```
   aws dynamodb list-tables
   ```

   원하는 경우 DynamoDB에 대한 다른 몇 가지 AWS CLI 명령을 시도할 수 있습니다. 자세한 내용은 [AWS CLI 명령 참조](https://docs.aws.amazon.com/cli/latest/reference/)설명서를 참조하세요.

#### 4단계: (선택 사항) 정리
<a name="vpc-endpoints-dynamodb-tutorial.clean-up"></a>

이 자습서에서 생성한 리소스를 삭제하려면 다음 절차를 따릅니다.

**DynamoDB에 대한 VPC 엔드포인트를 제거하려면 다음을 수행합니다.**

1. Amazon EC2 인스턴스에 로그인합니다.

1. VPC 종단점 ID를 결정합니다.

   ```
   aws ec2 describe-vpc-endpoints
   ```

   ```
   {
       "VpcEndpoint": {
           "PolicyDocument": "{\"Version\":\"2008-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"*\",\"Resource\":\"*\"}]}", 
           "VpcId": "vpc-0bbc736e", 
           "State": "available", 
           "ServiceName": "com.amazonaws.us-east-1.dynamodb", 
           "RouteTableIds": [], 
           "VpcEndpointId": "vpce-9b15e2f2", 
           "CreationTimestamp": "2017-07-26T22:00:14Z"
       }
   }
   ```

   예제 출력에서 VPC 엔드포인트 ID는 `vpce-9b15e2f2`입니다.

1. VPC 엔드포인트를 삭제합니다.

   ```
   aws ec2 delete-vpc-endpoints --vpc-endpoint-ids vpce-9b15e2f2
   ```

   ```
   {
       "Unsuccessful": []
   }
   ```

   빈 어레이 `[]`는 성공을 나타냅니다(실패한 요청 없음).

**Amazon EC2 인스턴스를 종료하려면**

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 탐색 창에서 **인스턴스**를 선택합니다.

1. Amazon EC2 인스턴스를 선택합니다.

1. **Actions**(작업), **Instance State**(인스턴스 상태), **Terminate**(해지)를 차례로 선택합니다.

1. 확인 창에서 **예, 종료합니다.**를 선택합니다.

# AWS PrivateLink for DynamoDB
<a name="privatelink-interface-endpoints"></a>

AWS PrivateLink for DynamoDB를 사용하면 Virtual Private Cloud(Amazon VPC)에서 *인터페이스 Amazon VPC 엔드포인트*(인터페이스 엔드포인트)를 프로비저닝할 수 있습니다. 이러한 엔드포인트는 VPN 및 Direct Connect를 통해 온프레미스에 있는 애플리케이션에서 또는 [Amazon VPC 피어링](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)을 통해 다른 AWS 리전에 있는 애플리케이션에서 직접 액세스할 수 있습니다. AWS PrivateLink 및 인터페이스 엔드포인트를 사용하면 애플리케이션에서 DynamoDB로의 프라이빗 네트워크 연결을 단순화할 수 있습니다.

VPC의 애플리케이션은 DynamoDB 작업을 위해 VPC 인터페이스 엔드포인트를 사용하여 DynamoDB와 통신하는 데 퍼블릭 IP 주소가 필요하지 않습니다. 인터페이스 엔드포인트는 Amazon VPC의 서브넷에서 프라이빗 IP 주소가 할당된 하나 이상의 탄력적 네트워크 인터페이스(ENI)로 표시됩니다. 인터페이스 엔드포인트를 통한 DynamoDB에 대한 요청은 Amazon 네트워크에 유지됩니다. 또한, AWS Direct Connect 또는 AWS Virtual Private Network(Site-to-Site VPN)을 통해 온프레미스 애플리케이션에서 Amazon VPC의 인터페이스 엔드포인트에 액세스할 수 있습니다. Amazon VPC를 온프레미스 네트워크에 연결하는 방법에 대한 자세한 내용은 [Direct Connect 사용 설명서](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 및 [AWS Site-to-Site VPN 사용 설명서](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하세요.

인터페이스 엔드포인트에 대한 일반적인 내용은 *AWS PrivateLink 설명서*의 [Interface Amazon VPC 엔드포인트(AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html)를 참조하세요. AWS PrivateLink는 Amazon DynamoDB Streams 엔드포인트에도 지원됩니다. 자세한 내용은 [AWS PrivateLink for DynamoDB Streams](privatelink-streams.md) 섹션을 참조하세요.

**Topics**
+ [Amazon DynamoDB용 Amazon VPC 엔드포인트의 유형](#types-of-vpc-endpoints-for-ddb)
+ [AWS PrivateLink for Amazon DynamoDB 사용 시 고려 사항](#privatelink-considerations)
+ [Amazon VPC 엔드포인트 생성](#ddb-creating-vpc)
+ [Amazon DynamoDB 인터페이스 엔드포인트에 액세스](#accessing-ddb-interface-endpoints)
+ [DynamoDB 인터페이스 엔드포인트에서 DynamoDB 테이블에 및 제어 API 작업에 액세스](#accessing-tables-apis-from-interface-endpoints)
+ [온프레미스 DNS 구성 업데이트](#updating-on-premises-dns-config)
+ [DynamoDB에 대한 Amazon VPC 엔드포인트 정책 생성](#creating-vpc-endpoint-policy)
+ [AWS Management Console 프라이빗 액세스와 함께 DynamoDB 엔드포인트 사용](#ddb-endpoints-private-access)
+ [AWS PrivateLink for DynamoDB Streams](privatelink-streams.md)
+ [DynamoDB Accelerator(DAX)에 AWS PrivateLink 사용](dax-private-link.md)

## Amazon DynamoDB용 Amazon VPC 엔드포인트의 유형
<a name="types-of-vpc-endpoints-for-ddb"></a>

두 가지 유형의 Amazon VPC 엔드포인트, 즉 **게이트웨이 엔드포인트와 **인터페이스 엔드포인트(AWS PrivateLink 사용)를 사용하여 Amazon DynamoDB에 액세스할 수 있습니다. **게이트웨이 엔드포인트는 AWS 네트워크를 통해 Amazon VPC에서 DynamoDB에 액세스하기 위해 라우팅 테이블에 지정하는 게이트웨이입니다. **인터페이스 엔드포인트는 프라이빗 IP 주소를 통해 온프레미스의 Amazon VPC 내에서 또는 Amazon VPC 피어링이나 AWS Transit Gateway를 사용하여 다른 AWS 리전의 Amazon VPC에서 DynamoDB로 요청을 라우팅함으로써 게이트웨이 엔드포인트의 기능을 확장합니다. 자세한 내용은 [Amazon VPC 피어링이란?](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 및 [Transit Gateway와 Amazon VPC 피어링 비교](https://docs.aws.amazon.com/whitepapers/latest/building-scalable-secure-multi-vpc-network-infrastructure/transit-gateway-vs-vpc-peering.html)를 참조하세요.

인터페이스 엔드포인트는 게이트웨이 엔드포인트와 호환됩니다. Amazon VPC에 기존 게이트웨이 엔드포인트가 있는 경우, 동일한 Amazon VPC에서 두 가지 유형의 엔드포인트를 모두 사용할 수 있습니다.


|  DynamoDB용 게이트웨이 엔드포인트  |  DynamoDB용 인터페이스 엔드포인트  | 
| --- | --- | 
|  두 경우 모두, 네트워크 트래픽은 AWS 네트워크에 남아 있습니다.  | 
|  Amazon DynamoDB 퍼블릭 IP 주소 사용  |  Amazon VPC의 프라이빗 IP 주소를 사용하여 Amazon DynamoDB에 액세스  | 
|  온프레미스에서의 액세스를 허용하지 않음  |  온프레미스에서의 액세스 허용  | 
|  다른 AWS 리전에서의 액세스를 허용하지 않음  |  Amazon VPC 피어링 또는 AWS Transit Gateway를 사용하여 다른 AWS 리전의 Amazon VPC 엔드포인트에서 액세스 허용  | 
|  미청구  |  청구  | 

게이트웨이 엔드포인트에 대한 자세한 내용은 **AWS PrivateLink 안내서에서 [Gateway Amazon VPC endpoints](https://docs.aws.amazon.com//vpc/latest/privatelink/vpce-gateway.html)를 참조하세요.

## AWS PrivateLink for Amazon DynamoDB 사용 시 고려 사항
<a name="privatelink-considerations"></a>

Amazon VPC 고려 사항이 AWS PrivateLink for Amazon DynamoDB에 적용됩니다. 자세한 내용은 *AWS PrivateLink 가이드*의 [인터페이스 엔드포인트 고려 사항](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-interface-limitations) 및 [AWS PrivateLink 할당량](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)을 참조하십시오. 또한 다음과 같은 제한 사항이 적용됩니다.

AWS PrivateLink for Amazon DynamoDB는 다음을 지원하지 않습니다.
+ Transport Layer Security (TLS) 1.1
+ 프라이빗 및 하이브리드 도메인 이름 시스템(DNS) 서비스

**중요**  
DynamoDB 엔드포인트 DNS 이름(예: `dynamodb.region.amazonaws.com` 또는 `*.region.amazonaws.com`)을 재정의하여 트래픽을 인터페이스 엔드포인트로 라우팅하는 프라이빗 호스팅 영역을 생성하지 마세요. DynamoDB DNS 구성은 시간이 지남에 따라 변경될 수 있습니다.  
 사용자 지정 DNS 재정의는 이러한 변경 사항과 호환되지 않으므로 인터페이스 엔드포인트 대신 퍼블릭 IP 주소를 통해 요청이 예기치 않게 라우팅될 수 있습니다.  
 AWS PrivateLink를 통해 DynamoDB에 액세스하려면 Amazon VPC 엔드포인트 URL을 직접 사용하도록 클라이언트를 구성합니다(예: `https://vpce-1a2b3c4d-5e6f.dynamodb.region.vpce.amazonaws.com`).

활성화한 각 AWS PrivateLink 엔드포인트에 대해 초당 최대 5만 개의 요청을 제출할 수 있습니다.

**참고**  
AWS PrivateLink 엔드포인트에 대한 네트워크 연결 제한 시간은 DynamoDB 오류 응답 범위에 포함되지 않으므로 PrivateLink 엔드포인트에 연결하는 애플리케이션에서 적절하게 처리해야 합니다.

## Amazon VPC 엔드포인트 생성
<a name="ddb-creating-vpc"></a>

Amazon VPC 인터페이스 엔드포인트를 생성하려면 **AWS PrivateLink 안내서의 [Create an Amazon VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)를 참조하세요.

## Amazon DynamoDB 인터페이스 엔드포인트에 액세스
<a name="accessing-ddb-interface-endpoints"></a>

인터페이스 엔드포인트를 생성하면 DynamoDB는 *Regional* 및 *Zonal*이라는 두 가지 유형의 엔드포인트별 DynamoDB DNS 이름을 생성합니다.
+ **리전 DNS 이름에는 고유한 Amazon VPC 엔드포인트 ID, 서비스 식별자, AWS 리전, `vpce.amazonaws.com`이 포함됩니다. 예를 들어, Amazon VPC 엔드포인트 ID `vpce-1a2b3c4d`의 경우, 생성된 DNS 이름은 `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`과 비슷할 수 있습니다.
+ **영역별 DNS 이름에는 가용 영역이 포함됩니다(예: `vpce-1a2b3c4d-5e6f-us-east-1a.dynamodb.us-east-1.vpce.amazonaws.com`). 아키텍처가 가용 영역을 분리하는 경우 이 옵션을 사용할 수 있습니다. 예를 들어, 오류를 제한하거나 리전별 데이터 전송 비용을 줄이는 데 사용할 수 있습니다.

**참고**  
최적의 신뢰성을 얻으려면 최소 3개의 가용 영역에 서비스를 배포하는 것이 좋습니다.

## DynamoDB 인터페이스 엔드포인트에서 DynamoDB 테이블에 및 제어 API 작업에 액세스
<a name="accessing-tables-apis-from-interface-endpoints"></a>

AWS CLI 또는 AWS SDK를 사용하여 DynamoDB 테이블에 액세스하고 DynamoDB 인터페이스 엔드포인트를 통해 API 작업을 제어할 수 있습니다.

### AWS CLI 예제
<a name="privatelink-ddb-aws-cli-examples"></a>

AWS CLI 명령의 DynamoDB 인터페이스 엔드포인트를 통해 DynamoDB 테이블 또는 DynamoDB 제어 API 작업에 액세스하려면 `--region` 및 `--endpoint-url` 파라미터를 사용하세요.

**예: VPC 엔드포인트 생성**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**예: VPC 엔드포인트 수정**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**예: 엔드포인트 URL을 사용하여 테이블 나열**

다음 예시에서 리전 `us-east-1` 및 VPC 엔드포인트 ID의 DNS 이름 `vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
aws dynamodb --region us-east-1 --endpoint https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com list-tables
```

### AWS SDK 예제
<a name="privatelink-ddb-aws-sdk-examples"></a>

AWS SDK를 사용하여 DynamoDB 인터페이스 엔드포인트를 통해 DynamoDB 테이블 또는 DynamoDB 제어 API 작업에 액세스하려면 SDK를 최신 버전으로 업데이트하세요. 그런 다음, DynamoDB 인터페이스 엔드포인트를 통해 테이블 또는 DynamoDB 제어 API 작업에 액세스하기 위해 엔드포인트 URL을 사용하도록 클라이언트를 구성합니다.

------
#### [ SDK for Python (Boto3) ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 테이블에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
ddb_client = session.client(
service_name='dynamodb',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 테이블에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
//client build with endpoint config  
final AmazonDynamoDB dynamodb = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 테이블에 액세스**  
다음 예에서 리전 us-east-1 및 VPC 엔드포인트 ID https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com을 실제 정보로 바꿉니다.

```
Region region = Region.US_EAST_1;
dynamoDbClient = DynamoDbClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## 온프레미스 DNS 구성 업데이트
<a name="updating-on-premises-dns-config"></a>

 엔드포인트별 DNS 이름을 사용하여 DynamoDB의 인터페이스 엔드포인트에 액세스할 때는 온프레미스 DNS 리졸버를 업데이트할 필요가 없습니다. 퍼블릭 DynamoDB DNS 도메인의 인터페이스 엔드포인트의 프라이빗 IP 주소로 엔드포인트별 DNS 이름을 확인할 수 있습니다.

### 인터페이스 엔드포인트를 사용하여 Amazon VPC의 게이트웨이 엔드포인트 또는 인터넷 게이트웨이 없이 DynamoDB에 액세스
<a name="using-interface-endpoints"></a>

다음 다이어그램과 같이 Amazon VPC의 인터페이스 엔드포인트는 Amazon 네트워크를 통해 Amazon VPC 내 애플리케이션과 온프레미스 애플리케이션을 모두 DynamoDB로 라우팅할 수 있습니다.

![\[데이터 흐름 다이어그램은 인터페이스 엔드포인트 및 AWS PrivateLink를 사용하여 온프레미스 및 Amazon VPC 내 앱에서 DynamoDB로 액세스하는 방법을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/PrivateLink-interfaceEndpoints.png)


다이어그램은 다음을 보여 줍니다.
+ 온프레미스 네트워크에서는 Direct Connect 또는 Site-to-Site VPN을 사용하여 Amazon VPC A에 연결합니다.
+ 온프레미스 및 Amazon VPC A의 애플리케이션은 엔드포인트별 DNS 이름을 사용하여 DynamoDB 인터페이스 엔드포인트를 통해 DynamoDB에 액세스합니다.
+ 온프레미스 애플리케이션은 Direct Connect(또는 Site-to-Site VPN)를 통해 Amazon VPC에서 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 DynamoDB로 데이터를 이동합니다.
+ Amazon VPC 내 애플리케이션도 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 DynamoDB로 데이터를 이동합니다.

### 동일한 Amazon VPC에서 게이트웨이 엔드포인트와 인터페이스 엔드포인트를 함께 사용하여 DynamoDB에 액세스
<a name="using-gateway-and-interface-endpoints"></a>

다음 다이어그램과 같이 인터페이스 엔드포인트를 생성하고 기존 게이트웨이 엔드포인트를 동일한 Amazon VPC에 유지할 수 있습니다. 이 접근법을 사용하면 Amazon VPC 내 애플리케이션이 게이트웨이 엔드포인트를 통해 DynamoDB에 계속 액세스할 수 있으며, 요금은 청구되지 않습니다. 그런 다음, 온프레미스 애플리케이션만 인터페이스 엔드포인트를 사용하여 DynamoDB에 액세스합니다. 이러한 방식으로 DynamoDB에 액세스하려면 DynamoDB에 대한 엔드포인트별 DNS 이름을 사용하도록 온프레미스 애플리케이션을 업데이트해야 합니다.

![\[게이트웨이 엔드포인트와 인터페이스 엔드포인트를 함께 사용하여 DynamoDB에 액세스하는 방법을 보여주는 데이터 흐름 다이어그램.\]](http://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/images/PL-Image2-InterfaceAndGatewayEP.png)


다이어그램은 다음을 보여 줍니다.
+ 온프레미스 애플리케이션은 엔드포인트별 DNS 이름을 사용하여 Direct Connect(또는 Site-to-Site VPN)를 통해 Amazon VPC에서 인터페이스 엔드포인트로 데이터를 전송합니다. AWS PrivateLink는 AWS 네트워크를 통해 인터페이스 엔드포인트에서 DynamoDB로 데이터를 이동합니다.
+ Amazon VPC 내 애플리케이션은 기본 리전 DynamoDB 이름을 사용하여 AWS 네트워크를 통해 DynamoDB에 연결하는 게이트웨이 엔드포인트로 데이터를 전송합니다.

게이트웨이 엔드포인트에 대한 자세한 내용은 **Amazon VPC 사용 설명서의 [Gateway Amazon VPC endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)를 참조하세요.

## DynamoDB에 대한 Amazon VPC 엔드포인트 정책 생성
<a name="creating-vpc-endpoint-policy"></a>

DynamoDB에 대한 액세스를 제어하는 Amazon VPC 엔드포인트에 엔드포인트 정책을 연결할 수 있습니다. 이 정책은 다음 정보를 지정합니다.
+ 작업을 수행할 수 있는 AWS Identity and Access Management(IAM) 보안 주체.
+ 수행할 수 있는 작업 
+ 작업을 수행할 수 있는 리소스 

**Topics**
+ [예: Amazon VPC 엔드포인트에서 특정 테이블로만 액세스 제한](#privatelink-example-restrict-access-to-bucket)

### 예: Amazon VPC 엔드포인트에서 특정 테이블로만 액세스 제한
<a name="privatelink-example-restrict-access-to-bucket"></a>

특정 DynamoDB 테이블로만 액세스를 제한하는 엔드포인트 정책을 생성할 수 있습니다. 이 정책 유형은 Amazon VPC에 테이블을 사용하는 다른 AWS 서비스가 있을 경우 유용합니다. 다음 테이블 정책은 `DOC-EXAMPLE-TABLE`로만 액세스를 제한합니다. 이 엔드포인트 정책을 사용하려면 `DOC-EXAMPLE-TABLE`을 실제 테이블의 이름으로 대체합니다.

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-table-only",
      "Principal": "*",
      "Action": [
        "dynamodb:GetItem",
        "dynamodb:PutItem"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE",
                   "arn:aws:dynamodb:us-east-1:111122223333:table/DOC-EXAMPLE-TABLE/*"]
    }
  ]
}
```

------

## AWS Management Console 프라이빗 액세스와 함께 DynamoDB 엔드포인트 사용
<a name="ddb-endpoints-private-access"></a>

[AWS Management Console 프라이빗 액세스](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)에서 [DynamoDB 콘솔](https://console.aws.amazon.com/dynamodb)과 함께 VPC 엔드포인트를 사용하는 경우 DynamoDB 및 DynamoDB Streams에 대한 DNS 구성을 설정해야 합니다.

AWS Management Console 프라이빗 액세스에서 DynamoDB에 액세스할 수 있도록 구성하려면 다음 두 VPC 엔드포인트를 생성해야 합니다.
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

VPC 엔드포인트를 생성할 때 Route53 콘솔로 초대하고 리전 엔드포인트 `dynamodb.us-east-1.amazonaws.com`을 사용하여 DynamoDB용 프라이빗 호스팅 영역을 생성합니다.

프라이빗 호스팅 영역에 다음 두 개의 별칭 레코드를 생성합니다.
+ `dynamodb.<region>.amazonaws.com`은 트래픽을 VPC 엔드포인트 `com.amazonaws.<region>.dynamodb`로 라우팅합니다.
+ `streams.dynamodb.<region>.amazonaws.com`은 트래픽을 VPC 엔드포인트 `com.amazonaws.<region>.dynamodb-streams`로 라우팅합니다.

# AWS PrivateLink for DynamoDB Streams
<a name="privatelink-streams"></a>

AWS PrivateLink for Amazon DynamoDB Streams를 사용하면 Virtual Private Cloud(Amazon VPC)에서 인터페이스 Amazon VPC 엔드포인트(인터페이스 엔드포인트)를 프로비저닝할 수 있습니다. 이러한 엔드포인트는 VPN 및 Direct Connect를 통해 온프레미스에 있는 애플리케이션에서 또는 Amazon VPC 피어링을 통해 다른 AWS 리전에 있는 애플리케이션에서 직접 액세스할 수 있습니다. AWS PrivateLink 및 인터페이스 엔드포인트를 사용하면 애플리케이션에서 DynamoDB Streams로의 프라이빗 네트워크 연결을 단순화할 수 있습니다.

Amazon VPC의 애플리케이션은 DynamoDB Streams 작업을 위해 Amazon VPC 인터페이스 엔드포인트를 사용하여 DynamoDB Streams와 통신하는 데 퍼블릭 IP 주소가 필요하지 않습니다. 인터페이스 엔드포인트는 Amazon VPC의 서브넷에서 프라이빗 IP 주소가 할당된 하나 이상의 탄력적 네트워크 인터페이스(ENI)로 표시됩니다. 인터페이스 엔드포인트를 통한 DynamoDB Streams에 대한 요청은 Amazon 네트워크에 유지됩니다. 또한, Direct Connect 또는 AWS Virtual Private Network(AWS VPN)을 통해 온프레미스 애플리케이션에서 Amazon VPC의 인터페이스 엔드포인트에 액세스할 수 있습니다. AWS Virtual Private Network를 온프레미스 네트워크에 연결하는 방법에 대한 자세한 내용은 [https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 및 [https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html)를 참조하세요.

인터페이스 엔드포인트에 대한 일반적인 정보는 [Interface Amazon VPC endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) (AWS PrivateLink)를 참조하세요.

**참고**  
DynamoDB Streams에는 인터페이스 엔드포인트만 지원됩니다. 게이트웨이 엔드포인트는 지원되지 않습니다.

**Topics**
+ [AWS PrivateLink for Amazon DynamoDB Streams 사용 시 고려 사항](#privatelink-streams-considerations)
+ [Amazon VPC 엔드포인트 생성](#privatelink-streams-vpc-endpoint)
+ [Amazon DynamoDB Streams 인터페이스 엔드포인트에 액세스](#privatelink-streams-accessing-ddb-interface-endpoints)
+ [DynamoDB Streams 인터페이스 엔드포인트에서 DynamoDB Streams API 작업에 액세스](#privatelink-streams-accessing-api-operations-from-interface-endpoints)
+ [AWS SDK 예제](#privatelink-streams-aws-sdk-examples)
+ [DynamoDB Streams에 대한 Amazon VPC 엔드포인트 정책 만들기](#privatelink-streams-creating-vpc-endpoint-policy)
+ [AWS Management Console 프라이빗 액세스와 함께 DynamoDB 엔드포인트 사용](#ddb-streams-endpoints-private-access)

## AWS PrivateLink for Amazon DynamoDB Streams 사용 시 고려 사항
<a name="privatelink-streams-considerations"></a>

Amazon VPC 고려 사항이 AWS PrivateLink for Amazon DynamoDB Streams에 적용됩니다. 자세한 내용은 [interface endpoint considerations](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) 및 [AWS PrivateLink quotas](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-limits-endpoints.html)를 참조하세요. 다음과 같은 제한 사항이 적용됩니다.

AWS PrivateLink for Amazon DynamoDB Streams는 다음을 지원하지 않습니다.
+ Transport Layer Security (TLS) 1.1
+ 프라이빗 및 하이브리드 도메인 이름 시스템(DNS) 서비스

**중요**  
DynamoDB Streams 엔드포인트 DNS 이름을 재정의하여 트래픽을 인터페이스 엔드포인트로 라우팅하는 프라이빗 호스팅 영역을 생성하지 마세요. DynamoDB DNS 구성은 시간이 지남에 따라 변경될 수 있으며 사용자 지정 DNS 재정의로 인해 인터페이스 엔드포인트 대신 퍼블릭 IP 주소를 통해 요청이 예기치 않게 라우팅될 수 있습니다.  
 AWS PrivateLink를 통해 DynamoDB Streams에 액세스하려면 Amazon VPC 엔드포인트 URL을 직접 사용하도록 클라이언트를 구성합니다(예: `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.region.vpce.amazonaws.com`).

**참고**  
AWS PrivateLink 엔드포인트에 대한 네트워크 연결 제한 시간은 DynamoDB Streams 오류 응답 범위에 포함되지 않으므로 AWS PrivateLink 엔드포인트에 연결하는 애플리케이션에서 적절하게 처리해야 합니다.

## Amazon VPC 엔드포인트 생성
<a name="privatelink-streams-vpc-endpoint"></a>

Amazon VPC 인터페이스 엔드포인트를 생성하려면 **AWS PrivateLink 안내서의 [Create an Amazon VPC endpoint](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws)를 참조하세요.

## Amazon DynamoDB Streams 인터페이스 엔드포인트에 액세스
<a name="privatelink-streams-accessing-ddb-interface-endpoints"></a>

인터페이스 엔드포인트를 생성하면 DynamoDB는 *Regional* 및 *Zonal*이라는 두 가지 유형의 엔드포인트별 DynamoDB Streams DNS 이름을 생성합니다.
+ **리전 DNS 이름에는 고유한 Amazon VPC 엔드포인트 ID, 서비스 식별자, AWS 리전, `vpce.amazonaws.com`이 포함됩니다. 예를 들어, Amazon VPC 엔드포인트 ID `vpce-1a2b3c4d`의 경우, 생성된 DNS 이름은 `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`과 비슷할 수 있습니다.
+ **영역별 DNS 이름에는 가용 영역이 포함됩니다(예: `vpce-1a2b3c4d-5e6f-us-east-1a.streams.dynamodb.us-east-1.vpce.amazonaws.com`). 아키텍처가 가용 영역을 분리하는 경우 이 옵션을 사용할 수 있습니다. 예를 들어, 오류를 제한하거나 리전별 데이터 전송 비용을 줄이는 데 사용할 수 있습니다.

## DynamoDB Streams 인터페이스 엔드포인트에서 DynamoDB Streams API 작업에 액세스
<a name="privatelink-streams-accessing-api-operations-from-interface-endpoints"></a>

AWS CLI 또는 AWS SDK를 사용하여 DynamoDB Streams 인터페이스 엔드포인트를 통해 DynamoDB Streams API 작업에 액세스할 수 있습니다.

### AWS CLI 예제
<a name="privatelink-streams-aws-cli-examples"></a>

AWS CLI 명령의 DynamoDB Streams 인터페이스 엔드포인트를 통해 DynamoDB Streams 또는 API 작업에 액세스하려면 `--region` 및 `--endpoint-url` 파라미터를 사용하세요.

**예: VPC 엔드포인트 생성**

```
aws ec2 create-vpc-endpoint \
--region us-east-1 \
--service-name com.amazonaws.us-east-1.dynamodb-streams \
--vpc-id client-vpc-id \
--subnet-ids client-subnet-id \
--vpc-endpoint-type Interface \
--security-group-ids client-sg-id
```

**예: VPC 엔드포인트 수정**

```
aws ec2 modify-vpc-endpoint \
--region us-east-1 \
--vpc-endpoint-id client-vpc-endpoint-id \
--policy-document policy-document \ #example optional parameter
--add-security-group-ids security-group-ids \ #example optional parameter 
# any additional parameters needed, see Privatelink documentation for more details
```

**예: 엔드포인트 URL을 사용하여 스트림 나열**

다음 예시에서 리전 `us-east-1` 및 VPC 엔드포인트 ID의 DNS 이름 `vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
aws dynamodbstreams --region us-east-1 —endpoint https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com list-streams
```

## AWS SDK 예제
<a name="privatelink-streams-aws-sdk-examples"></a>

AWS SDK를 사용하여 DynamoDB Streams 인터페이스 엔드포인트를 통해 Amazon DynamoDB Streams API 작업에 액세스하려면 SDK를 최신 버전으로 업데이트하세요. 그런 다음, DynamoDB Streams 인터페이스 엔드포인트를 통해 DynamoDB Streams API 작업에 대해 엔드포인트 URL을 사용하도록 클라이언트를 구성합니다.

------
#### [ SDK for Python (Boto3) ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 스트림에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
ddb_streams_client = session.client(
service_name='dynamodbstreams',
region_name='us-east-1',
endpoint_url='https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com'
)
```

------
#### [ SDK for Java 1.x ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 스트림에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
//client build with endpoint config  
final AmazonDynamoDBStreams dynamodbstreams = AmazonDynamoDBStreamsClientBuilder.standard().withEndpointConfiguration(
        new AwsClientBuilder.EndpointConfiguration(
                "https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com",
                Regions.DEFAULT_REGION.getName()
        )
).build();
```

------
#### [ SDK for Java 2.x ]

**예: 엔드포인트 URL을 사용하여 DynamoDB 스트림에 액세스**  
다음 예에서 리전 `us-east-1` 및 VPC 엔드포인트 ID `https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com`을 실제 정보로 바꿉니다.

```
Region region = Region.US_EAST_1;
dynamoDbStreamsClient = DynamoDbStreamsClient.builder().region(region)
.endpointOverride(URI.create("https://vpce-1a2b3c4d-5e6f.streams.dynamodb.us-east-1.vpce.amazonaws.com"))
.build()
```

------

## DynamoDB Streams에 대한 Amazon VPC 엔드포인트 정책 만들기
<a name="privatelink-streams-creating-vpc-endpoint-policy"></a>

DynamoDB Streams에 대한 액세스를 제어하는 Amazon VPC 엔드포인트에 엔드포인트 정책을 연결할 수 있습니다. 이 정책은 다음 정보를 지정합니다.
+ 작업을 수행할 수 있는 AWS Identity and Access Management(IAM) 보안 주체.
+ 수행할 수 있는 작업 
+ 작업을 수행할 수 있는 리소스 

**Topics**
+ [예: Amazon VPC 엔드포인트에서 특정 스트림으로만 액세스 제한](#privatelink-streams-example-restrict-access-to-bucket)

### 예: Amazon VPC 엔드포인트에서 특정 스트림으로만 액세스 제한
<a name="privatelink-streams-example-restrict-access-to-bucket"></a>

특정 DynamoDB Streams로만 액세스를 제한하는 엔드포인트 정책을 만들 수 있습니다. 이 정책 유형은 Amazon VPC에 DynamoDB Streams를 사용하는 다른 AWS 서비스가 있을 경우 유용합니다. 다음 스트림 정책은 `DOC-EXAMPLE-TABLE`에 연결된 스트림 `2025-02-20T11:22:33.444`로만 액세스를 제한합니다. 이 엔드포인트 정책을 사용하려면 `DOC-EXAMPLE-TABLE`을 테이블의 이름으로, `2025-02-20T11:22:33.444`를 스트림 레이블로 대체합니다.

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Id": "Policy1216114807515",
  "Statement": [
    { "Sid": "Access-to-specific-stream-only",
      "Principal": "*",
      "Action": [
        "dynamodb:DescribeStream",
        "dynamodb:GetRecords"
      ],
      "Effect": "Allow",
      "Resource": ["arn:aws:dynamodb:us-east-1:111122223333:table/table-name/stream/2025-02-20T11:22:33.444"]
    }
  ]
}
```

------

**참고**  
게이트웨이 엔드포인트는 DynamoDB Streams에서 지원되지 않습니다.

## AWS Management Console 프라이빗 액세스와 함께 DynamoDB 엔드포인트 사용
<a name="ddb-streams-endpoints-private-access"></a>

[AWS Management Console 프라이빗 액세스](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html)에서 [DynamoDB 콘솔](https://console.aws.amazon.com/dynamodb)과 함께 VPC 엔드포인트를 사용하는 경우 DynamoDB 및 DynamoDB Streams에 대한 DNS 구성을 설정해야 합니다.

AWS Management Console 프라이빗 액세스에서 DynamoDB에 액세스할 수 있도록 구성하려면 다음 두 VPC 엔드포인트를 생성해야 합니다.
+ `com.amazonaws.<region>.dynamodb`
+ `com.amazonaws.<region>.dynamodb-streams`

VPC 엔드포인트를 생성할 때 Route53 콘솔로 초대하고 리전 엔드포인트 `dynamodb.us-east-1.amazonaws.com`을 사용하여 DynamoDB용 프라이빗 호스팅 영역을 생성합니다.

프라이빗 호스팅 영역에 다음 두 개의 별칭 레코드를 생성합니다.
+ `dynamodb.<region>.amazonaws.com`은 트래픽을 VPC 엔드포인트 `com.amazonaws.<region>.dynamodb`로 라우팅합니다.
+ `streams.dynamodb.<region>.amazonaws.com`은 트래픽을 VPC 엔드포인트 `com.amazonaws.<region>.dynamodb-streams`로 라우팅합니다.

# DynamoDB Accelerator(DAX)에 AWS PrivateLink 사용
<a name="dax-private-link"></a>

AWS PrivateLink for DynamoDB Accelerator(DAX)를 사용하면 가상 프라이빗 클라우드(VPC) 내의 프라이빗 IP 주소를 통해 `CreateCluster`, `DescribeClusters` 및 `DeleteCluster`와 같은 DAX 관리 API에 안전하게 액세스할 수 있습니다. 이 기능을 사용하면 트래픽을 퍼블릭 인터넷에 노출하지 않고도 애플리케이션에서 비공개로 DAX 서비스에 액세스할 수 있습니다.

DAX PrivateLink는 듀얼 스택 엔드포인트(`dax.{region}.api.aws`)를 지원하여 IPv4 및 IPv6 연결을 모두 활성화합니다. 고객은 AWS PrivateLink for DAX를 통해 프라이빗 DNS 이름을 사용하여 서비스에 액세스할 수 있습니다. 듀얼 스택 엔드포인트 지원은 네트워크 프라이버시를 유지하면서 투명한 연결을 보장합니다. 이렇게 하면 SDK 구성을 변경하지 않고도 퍼블릭 인터넷과 VPC 엔드포인트를 통해 DAX에 액세스할 수 있습니다.

## AWS PrivateLink for DynamoDB Accelerator(DAX) 사용 시 고려 사항
<a name="dax-privatelink-considerations"></a>

AWS PrivateLink for DynamoDB Accelerator(DAX)를 구현할 때의 몇 가지 중요한 고려 사항이 있습니다.

DAX에 대한 인터페이스 엔드포인트를 설정하기 전에 다음을 고려하세요.
+ DAX 인터페이스 엔드포인트는 동일한 AWS 리전 내의 DAX 관리 API에 대한 액세스만 지원합니다. 인터페이스 엔드포인트를 사용하여 다른 리전의 DAX 관리 API에 액세스할 수 없습니다.
+ DAX 관리를 위해 비공개로 AWS Management Console에 액세스하려면 `com.amazonaws.region.console` 및 관련 서비스와 같은 서비스에 대한 추가 VPC 엔드포인트를 생성해야 할 수 있습니다.
+ DAX에 대한 인터페이스 엔드포인트 생성 및 사용에 대한 요금이 청구됩니다. 요금 정보는 [AWS PrivateLink 요금](https://aws.amazon.com/vpc/pricing/)을 참조하세요.

## AWS PrivateLink에서 DAX를 사용하는 방식
<a name="dax-privatelink-how-it-works"></a>

DAX에 대한 인터페이스 엔드포인트를 생성하는 경우:

1. AWS는 인터페이스 엔드포인트에 대해 사용 설정하는 각 서브넷에서 엔드포인트 네트워크 인터페이스를 생성합니다.

1. 이는 DAX로 향하는 트래픽의 진입점 역할을 하는 요청자 관리형 네트워크 인터페이스입니다.

1. 그런 다음 VPC 내의 프라이빗 IP 주소를 통해 DAX에 액세스할 수 있습니다.

1. 이 아키텍처를 사용하면 VPC 보안 그룹을 사용하여 엔드포인트에 대한 액세스를 관리할 수 있습니다.

1. 애플리케이션은 VPC 내의 각 인터페이스 엔드포인트를 통해 DynamoDB와 DAX 모두에 액세스할 수 있으며, 온프레미스 애플리케이션이 Direct Connect 또는 VPN을 통해 연결할 수 있습니다.

1. 이를 통해 두 서비스 모두에서 일관된 연결 모델을 제공하고, 아키텍처를 간소화하고, AWS 네트워크 내에서 트래픽을 유지하여 보안을 강화할 수 있습니다.

## DAX에 대한 인터페이스 엔드포인트 생성
<a name="dax-privatelink-creating-endpoints"></a>

AWS Management Console, AWS SDK, CloudFormation 또는 AWS API를 사용하여 인터페이스 엔드포인트를 생성하여 DAX에 연결할 수 있습니다.

**콘솔을 사용하여 DAX용 인터페이스 엔드포인트 생성하기**

1. [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/)에서 Amazon VPC 콘솔로 이동합니다.

1. 탐색 창에서 **엔드포인트**를 선택합니다.

1. **엔드포인트 생성**을 선택합니다.

1. **서비스 범주**에서 **AWS 서비스**를 선택하고 **서비스 이름**에서 `com.amazonaws.region.dax`를 검색하고 선택합니다.

1. **VPC**의 경우 DAX에 액세스할 VPC를 선택하고, **서브넷**의 경우 AWS가 엔드포인트 네트워크 인터페이스를 생성할 서브넷을 선택합니다.

1. **보안 그룹**에서 엔드포인트 네트워크 인터페이스에 연결할 보안 그룹을 선택하거나 생성합니다.

1. **정책**의 경우 기본 **전체 액세스**를 유지하거나 필요에 따라 사용자 지정합니다.

1. 엔드포인트에 대한 프라이빗 DNS를 활성화하려면 **DNS 이름 활성화**를 선택합니다. SDK 구성이 변경되지 않도록 프라이빗 DNS 이름을 활성화된 상태로 유지합니다. 활성화하면 애플리케이션에서 표준 서비스 DNS 이름(예: `dax.region.amazonaws.com`)을 계속 사용할 수 있습니다. AWS는 VPC에 프라이빗 호스팅 영역을 생성하여 이 이름을 엔드포인트의 프라이빗 IP 주소로 확인합니다.
**참고**  
필요한 경우 리전 DNS 이름을 사용합니다. 영역 DNS 이름은 사용하지 않는 것이 좋습니다. 또한 PrivateLink를 통해 가용성을 극대화하려면 3개 이상의 AZ에서 서브넷을 선택합니다.

1. **엔드포인트 생성**을 선택합니다.

**AWS CLI를 사용하여 DAX용 인터페이스 엔드포인트 생성하기**  
`create-vpc-endpoint` 명령을 사용하여 `vpc-endpoint-type` 파라미터를 `Interface`로, `service-name` 파라미터를 `com.amazonaws.region.dax`로 설정합니다.

```
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-ec43eb89 \
    --vpc-endpoint-type Interface \
    --service-name com.amazonaws.us-east-1.dax \
    --subnet-ids subnet-abcd1234 subnet-1a2b3c4d \
    --security-group-ids sg-1a2b3c4d \
    --private-dns-enabled
```

## 추가 리소스
<a name="dax-privatelink-resources"></a>

AWS PrivateLink 및 VPC 엔드포인트에 대한 자세한 내용은 다음 리소스를 참조하세요.
+ [AWS PrivateLink for DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-interface-endpoints.html)
+ [AWS PrivateLink for DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/privatelink-streams.html)
+ [를 사용하여 서비스에 VPC 연결AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)
+ [를 사용하여 DynamoDB에 대한 프라이빗 연결 간소화AWS PrivateLink](https://aws.amazon.com/blogs//database/simplify-private-connectivity-to-amazon-dynamodb-with-aws-privatelink)
+ [AWS PrivateLink 백서](https://docs.aws.amazon.com/whitepapers/latest/aws-vpc-connectivity-options/aws-privatelink.html)

# Amazon DynamoDB의 구성 및 취약성 분석
<a name="configuration-vulnerability"></a>

AWS가 게스트 운영 체제(OS), 데이터베이스 패치, 방화벽 구성, 재해 복구 등의 기본 보안 작업을 처리합니다. 적합한 제3자가 이 절차를 검토하고 인증하였습니다. 자세한 내용은 다음 리소스를 참조하세요.
+ [Amazon DynamoDB의 규정 준수 확인](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Compliance.html)
+ [공동 책임 모델](https://aws.amazon.com/compliance/shared-responsibility-model/) 
+ [Amazon Web Services: 보안 프로세스의 개요](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)(백서)

다음 보안 모범 사례에서도 Amazon DynamoDB의 구성 및 취약성 분석을 다룹니다.
+ [를 이용한 DynamoDB 규정 준수 모니터링AWS Config 규칙](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#rules)
+ [를 이용한 DynamoDB 구성 모니터링AWS Config](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices-security-detective.html#config)

# Amazon DynamoDB 보안 모범 사례
<a name="best-practices-security"></a>

Amazon DynamoDB는 자체 보안 정책을 개발하고 구현할 때 고려해야 할 여러 보안 기능을 제공합니다. 다음 모범 사례는 일반적인 지침이며 완벽한 보안 솔루션을 나타내지는 않습니다. 이러한 모범 사례는 환경에 적절하지 않거나 충분하지 않을 수 있으므로 참고용으로만 사용해 주세요.

**Topics**
+ [DynamoDB 예방 보안 모범 사례](best-practices-security-preventative.md)
+ [DynamoDB 탐지 보안 모범 사례](best-practices-security-detective.md)

# DynamoDB 예방 보안 모범 사례
<a name="best-practices-security-preventative"></a>

다음과 같은 모범 사례를 통해 Amazon DynamoDB에서 보안 사고를 예측하고 방지할 수 있습니다.

**유휴 시 암호화**  
DynamoDB는 유휴 시 테이블, 인덱스, 스트림 및 백업에 저장된 모든 사용자 데이터를 [AWS Key Management Service(AWS KMS)](https://aws.amazon.com/kms/)에 저장된 암호화 키를 사용해 암호화합니다. 이를 통해 기본 스토리지에 대한 무단 액세스로부터 데이터를 보호하여 데이터 보호 계층을 추가로 제공합니다.  
DynamoDB가 AWS 소유 키(기본 암호화 유형)와 AWS 관리형 키 또는 고객 관리형 키 중에서 어떤 것을 사용해 사용자 데이터를 암호화하도록 할지 지정할 수 있습니다. 자세한 내용은 [미사용 Amazon DynamoDB 암호화](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EncryptionAtRest.html)를 참조하세요.

**IAM 역할을 사용해 DynamoDB에 대한 액세스 인증하기**  
사용자, 애플리케이션, 기타 AWS 서비스는 DynamoDB에 액세스하려면 AWS API 요청에 유효한 AWS 자격 증명이 있어야 합니다. AWS 자격 증명을 애플리케이션이나 EC2 인스턴스에 직접 저장해서는 안 됩니다. 이러한 보안 인증은 자동으로 교체되지 않기 때문에 손상된 경우 비즈니스에 큰 영향을 줄 수 있는 장기 보안 인증입니다. IAM 역할을 사용하면 AWS 서비스 및 리소스에 액세스하는 데 사용할 수 있는 임시 액세스 키를 얻을 수 있습니다.  
자세한 내용은 [Amazon DynamoDB의 Identity and Access Management](security-iam.md) 섹션을 참조하세요.

**IAM 정책을 사용한 DynamoDB 기본 인증**  
권한을 부여하려면 권한을 부여받을 사용자, 권한을 행사할 수 있는 대상이 되는 DynamoDB API, 해당 리소스에 허용하고자 하는 특정 작업을 결정합니다. 최소 권한을 구현하는 것이 오류 또는 악의적인 의도로 인해 발생할 수 있는 보안 위험과 영향을 줄일 수 있는 비결입니다.  
IAM 자격 증명(즉 사용자, 그룹 및 역할)에 권한 정책을 연결함으로써 DynamoDB 리소스에서 작업을 수행할 수 있는 권한을 부여합니다.  
이를 위해 다음 정책을 사용할 수 있습니다.  
+ [AWS 관리형(미리 정의된) 정책](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-aws-managed)
+ [고객 관리형 정책](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/using-identity-based-policies.html#access-policy-examples-for-sdk-cli)

**IAM 정책 조건을 사용하여 세분화된 액세스 제어 구현**  
DynamoDB에서 권한을 부여할 때 권한 정책이 적용되는 방식을 결정하는 조건을 지정할 수 있습니다. 최소 권한을 구현하는 것이 오류 또는 악의적인 의도로 인해 발생할 수 있는 보안 위험과 영향을 줄일 수 있는 비결입니다.  
IAM 정책을 사용해 권한을 부여할 때 조건을 지정할 수 있습니다. 예를 들어 다음을 수행할 수 있습니다.  
+ 사용자에게 테이블 또는 보조 인덱스의 특정 항목 및 속성에 대한 읽기 전용 액세스를 허용하는 권한을 부여할 수 있습니다.
+ 사용자 ID를 기준으로 테이블의 특정 속성에 대한 쓰기 전용 액세스 권한을 해당 사용자에게 부여할 수 있습니다.
 자세한 내용은 [세분화된 액세스 제어를 위한 IAM 정책](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/specifying-conditions.html)을 참조하세요.

**VPC 엔드포인트 및 정책을 사용해 DynamoDB에 액세스**  
Virtual Private Cloud(VPC)에서 DynamoDB에 액세스하는 권한만 필요한 경우에는 VPC 엔드포인트를 사용해 필요한 VPC에서만 액세스할 수 있도록 제한해야 합니다. 이를 통해 해당 트래픽이 개방형 인터넷을 통과하여 이 환경에 종속되는 것을 방지할 수 있습니다.  
DynamoDB에 VPC 엔드포인트를 사용하면 다음 정책을 사용해 액세스를 제어 및 제한할 수 있습니다.  
+ VPC 엔드포인트 정책 - 이 정책은 DynamoDB VPC 종단점에서 적용됩니다. 이 정책을 통해 DynamoDB 테이블에 대한 API 액세스를 제어 및 제한할 수 있습니다.
+ IAM 정책 - 사용자, 그룹 또는 역할에 연결된 정책의 `aws:sourceVpce` 조건을 사용해 DynamoDB 테이블에 대한 모든 액세스가 지정된 VPC 엔드포인트를 통해 이루어지도록 강제할 수 있습니다.
 자세한 내용은 [Amazon DynamoDB용 엔드포인트](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-ddb.html)를 참조하세요.

**클라이언트 측 암호화 참조**  
DynamoDB에서 테이블을 구현하기 전에 암호화 전략을 계획하는 것이 좋습니다. 민감한 데이터나 기밀 데이터를 DynamoDB에 저장하는 경우 계획에 클라이언트측 암호화를 포함하는 것을 고려해 보세요. 이렇게 하면 데이터를 원본에 최대한 가깝게 암호화하고 전체 수명 주기 동안 데이터를 보호할 수 있습니다. 전송 중 및 유휴 상태의 중요 데이터를 암호화하면 일반 텍스트 데이터를 제3자가 사용할 수 없게 하는 데 도움이 됩니다.  
 [AWS Database Encryption SDK for DynamoDB](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/what-is-ddb-encrypt.html)는 DynamoDB에 보낼 테이블 데이터를 보호하는 데 도움이 되는 소프트웨어 라이브러리입니다. DynamoDB 테이블 항목을 암호화, 서명, 확인 및 복호화합니다. 암호화 및 서명되는 속성을 제어할 수 있습니다.

**프라이머리 키 관련 고려 사항**  
테이블과 글로벌 보조 인덱스의 [프라이머리 키](HowItWorks.Partitions.md)에 민감한 이름이나 민감한 일반 텍스트 데이터를 사용하지 마세요. 키 이름은 테이블 정의에 표시됩니다. 예를 들어 [DescribeTable](WorkingWithTables.Basics.md#WorkingWithTables.Basics.DescribeTable)을 직접적으로 호출할 권한이 있는 사람은 누구나 프라이머리 키 이름에 액세스할 수 있습니다. 키 값은 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 및 기타 로그에 표시될 수 있습니다. 또한 DynamoDB는 키 값을 사용하여 데이터를 배포하고 요청을 라우팅하며 AWS 관리자는 이 값을 관찰하여 서비스 상태를 유지할 수 있습니다.  
테이블 또는 GSI 키 값의 민감한 데이터를 사용해야 하는 경우 종단 간 클라이언트 암호화를 사용하는 것이 좋습니다. 이렇게 하면 데이터에 대한 키-값 참조를 수행할 수 있으며 데이터가 DynamoDB 관련 로그에 암호화되지 않은 상태로 표시되지 않습니다. 이 작업을 수행하는 한 가지 방법은 [AWS Database Encryption SDK for DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/client-server-side.html)를 사용하는 것이지만 이것이 필수는 아닙니다. 자체 솔루션을 사용하는 경우 항상 충분히 안전한 암호화 알고리즘을 사용해야 합니다. 해시와 같은 비암호화 옵션은 대부분의 상황에서 충분히 안전하지 않은 것으로 간주되므로 사용해서는 안 됩니다.  
프라이머리 키의 키 이름이 민감한 경우 ``pk`` 및 ``sk``를 대신 사용하는 것이 좋습니다. 이는 파티션 키 설계를 유연하게 만드는 일반적인 모범 사례입니다.  
무엇이 올바른 선택인지 고민된다면 언제든지 보안 전문가나 AWS 계정 팀에 문의하세요.

# DynamoDB 탐지 보안 모범 사례
<a name="best-practices-security-detective"></a>

다음과 같은 Amazon DynamoDB 모범 사례는 잠재적 보안 약점과 사고를 탐지하는 데 도움이 됩니다.

**AWS CloudTrail을 사용해 AWS 관리형 KMS 키 사용량 모니터링하기**  
유휴 중 암호화를 위해 [AWS 관리형 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk)를 사용하고 있는 경우 이 키의 사용량은 AWS CloudTrail로 로깅됩니다. CloudTrail은 계정에서 수행한 작업을 기록함으로써 사용자 활동에 대한 가시성을 제공합니다. CloudTrail은 요청한 사용자, 사용한 서비스, 수행한 작업, 작업에 대한 파라미터, AWS 서비스가 반환하는 응답 요소 등 각 작업에 대한 중요 정보를 기록합니다. 이러한 정보는 AWS 리소스의 변경 사항을 추적하고 운영 관련 문제를 해결하는 데 도움이 됩니다. CloudTrail을 이용하면 내부 정책 및 규제 표준 준수를 더 쉽게 보장할 수 있습니다.  
CloudTrail을 사용해 키 사용을 감사할 수 있습니다. CloudTrail은 계정의 AWS API 호출 및 관련 이벤트 내역이 포함된 로그 파일을 생성합니다. 이 로그 파일은 AWS Management Console, AWS SDK, 명령줄 도구를 사용해 이루어진 모든 AWS KMS API 요청 외에도 통합된 AWS 서비스를 통해 이루어진 요청도 포함합니다. 이러한 로그 파일을 사용해 키가 사용된 시간, 요청되었던 작업, 요청자의 ID, 요청이 시작된 IP 주소 등에 대한 정보를 얻을 수 있습니다. 자세한 내용은 [AWS CloudTrail을 사용하여 AWS KMS API 호출](https://docs.aws.amazon.com/kms/latest/developerguide/logging-using-cloudtrail.html) 및 [AWS CloudTrail 사용 설명서](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/)를 참조하세요.

**CloudTrail 사용하여 DynamoDB 작업 모니터링**  
CloudTrail은 제어 플레인 이벤트와 데이터 영역 이벤트를 모두 모니터링할 수 있습니다. 제어 플레인 작업은 DynamoDB 테이블을 생성하고 관리하도록 해 줍니다. 또한 인덱스, 스트림 및 테이블에 따라 다른 다양한 객체를 사용하도록 해 줍니다. 데이터 영역 작업은 테이블의 데이터에 대해 생성, 읽기, 업데이트 및 삭제(*CRUD*) 작업을 수행하도록 해 줍니다. 데이터 영역 작업의 일부는 보조 인덱스로부터 데이터를 읽도록 해주기도 합니다. CloudTrail에서 데이터 영역 이벤트의 로깅을 활성화하려면 CloudTrail에서 데이터 영역 API 활동의 로깅을 활성화해야 합니다. 자세한 내용은 [추적을 위한 데이터 이벤트 로깅](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) 단원을 참조하세요.  
DynamoDB에서 활동이 수행되면 해당 활동은 이벤트 기록에 있는 다른 AWS 서비스 이벤트와 함께 CloudTrail 이벤트에 기록됩니다. 자세한 내용은 [AWS CloudTrail을 사용하여 DynamoDB 작업 로깅](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/logging-using-cloudtrail.html)을 참조하세요. AWS 계정에서 최신 이벤트를 확인, 검색 및 다운로드할 수 있습니다. 자세한 내용은 *AWS CloudTrail 사용 설명서*에서 [CloudTrail 이벤트 기록을 사용하여 이벤트 보기](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html)를 참조하세요.  
DynamoDB에 대한 이벤트를 포함하여 AWS 계정에 이벤트를 지속적으로 기록하려면 [추적](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)을 생성합니다. CloudTrail은 추적을 사용하여 Amazon Simple Storage Service(Amazon S3) 버킷으로 로그 파일을 전송할 수 있습니다. 콘솔에서 추적을 생성하면 기본적으로 모든 AWS 리전에 추적이 적용됩니다. 추적은 AWS 파티션에 있는 모든 리전의 이벤트를 로깅하고 지정된 S3 버킷으로 로그 파일을 전송합니다. 또한 CloudTrail 로그에서 수집된 이벤트 데이터를 추가 분석 및 처리하도록 다른 AWS 서비스를 구성할 수 있습니다.

**DynamoDB Streams를 이용한 데이터 영역 작업 모니터링**  
DynamoDB는 DynamoDB Streams의 이벤트에 자동으로 응답하는 코드 조각인 트리거를 만들 수 있도록 AWS Lambda와 통합되어 있습니다. 트리거를 사용하면 DynamoDB 테이블의 데이터 수정에 응답하는 애플리케이션을 구축할 수 있습니다.  
테이블에 DynamoDB Streams를 활성화할 경우 스트림 Amazon 리소스 이름(ARN)을 사용자가 작성하는 Lambda 함수에 연결할 수 있습니다. 테이블의 항목이 수정되는 즉시 새로운 레코드가 테이블의 스트림에 표시됩니다. AWS Lambda는 새로운 스트림 레코드가 감지될 때마다 스트림을 폴링하고 Lambda 함수를 동기식으로 호출합니다. Lambda 함수는 알림 보내기, 워크플로 시작과 같이 사용자가 지정하는 모든 작업을 수행할 수 있습니다.  
자세한 내용은 [자습서: Amazon DynamoDB Streams와 함께 AWS Lambda 사용하기](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb-example.html)를 참조하세요. 이 예에서는 DynamoDB 이벤트 입력을 받아들여 이 입력에 포함된 메시지를 처리한 후 수신 이벤트 데이터 중 일부를 Amazon CloudWatch Logs에 씁니다.

**를 이용한 DynamoDB 구성 모니터링AWS Config**  
[AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)를 통해 AWS 리소스의 구성 변경 사항을 지속적으로 모니터링하고 기록할 수 있습니다. 또한 AWS Config를 이용해 AWS 리소스의 목록을 만들 수도 있습니다. 이전 상태에서 변경된 사항이 탐지되면 사용자가 검토하여 조치를 취할 수 있도록 Amazon Simple Notification Service(Amazon SNS) 알림이 전송됩니다. [콘솔을 이용한 AWS Config 설정](https://docs.aws.amazon.com/config/latest/developerguide/gs-console.html)의 지침에 따라 DynamoDB 리소스 유형이 포함되도록 합니다.  
Amazon SNS 주제로 구성 변경 및 알림을 스트리밍하도록 AWS Config를 구성할 수 있습니다. 예를 들어, 리소스가 업데이트되면 변경 사항을 볼 수 있도록 이메일로 전송되는 알림을 받을 수 있습니다. AWS Config가 리소스와 대조하여 사용자 지정 규칙 또는 관리형 규칙을 평가하는 경우에도 알림을 받을 수 있습니다.  
예제는 *AWS Config개발자 안내서*에서 [AWS Config가 Amazon SNS 주제로 전송하는 알림](https://docs.aws.amazon.com/config/latest/developerguide/notifications-for-AWS-Config.html)을 참조하세요.

**AWS Config 규칙을 이용한 DynamoDB 규정 준수 모니터링**  
AWS Config는 리소스에서 발생하는 구성 변경 사항을 지속적으로 추적합니다. 또한 이러한 변경으로 인해 규칙의 조건 중 위반한 것이 있는지 여부를 확인합니다. 리소스가 규칙을 위반한 경우, AWS Config는 해당 리소스와 규칙을 규칙 미준수로 표시합니다.  
AWS Config를 사용해 리소스 구성을 평가함으로써 리소스 구성이 내부 관행, 업계 지침, 규정을 얼마나 잘 준수하는지 평가할 수 있습니다. AWS Config는 [AWS 관리형 규칙](https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html)을 제공합니다. 이 규칙은 AWS 리소스가 일반 모범 사례를 준수하는지 여부를 평가하기 위해 AWS Config가 사용하는 미리 정의된 사용자 지정 가능 규칙입니다.

**식별 및 자동화를 위해 DynamoDB 리소스에 태그 지정하기**  
AWS 리소스에 태그 형태로 메타데이터를 지정할 수 있습니다. 각 태그는 리소스 관리, 검색 및 필터링을 더 수월하게 해줄 수 있는 옵션 값과 고객이 정의한 키로 구성된 간단한 레이블입니다.  
태그를 지정하면 그룹화 제어를 구현할 수 있습니다. 고유한 태그 유형은 없지만 목적, 소유자, 환경 또는 기타 기준에 따라 리소스를 분류할 수 있습니다. 다음은 몇 가지 예입니다.  
+ 보안 - 암호화와 같은 요구 사항을 결정하는 데 사용됩니다.
+ 기밀성 – 리소스가 지원하는 특정 데이터 기밀성 수준에 대한 식별자입니다.
+ 환경 - 개발, 테스트 및 프로덕션 인프라 간 구별에 사용됩니다.
자세한 내용은 [AWS 태그 지정 전략](https://aws.amazon.com/answers/account-management/aws-tagging-strategies/) 및 [DynamoDB에 태그 지정하기](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)를 참조하세요.

**AWS Security Hub CSPM을 사용하여 보안 모범 사례와 관련된 Amazon DynamoDB의 사용량을 모니터링합니다.**  
Security Hub CSPM은 보안 제어를 사용해 리소스 구성 및 보안 표준을 평가하여 다양한 규정 준수 프레임워크를 준수할 수 있도록 지원합니다.  
Security Hub를 사용하여 DynamoDB 리소스를 평가하는 방법에 대한 자세한 내용은 *AWS Security Hub CSPM 사용자 가이드*의 [Amazon DynamoDB 제어](https://docs.aws.amazon.com/securityhub/latest/userguide/dynamodb-controls.html)를 참조하세요.