

# 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/*"
      ]
    }
  ]
}
```

------