

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Contoh untuk menggunakan ABAC dengan tabel dan indeks DynamoDB
<a name="abac-example-use-cases"></a>

Contoh berikut menggambarkan beberapa kasus penggunaan untuk mengimplementasikan kondisi berbasis atribut menggunakan tag.

**Topics**
+ [Contoh 1: Izinkan tindakan menggunakan aws: ResourceTag](#abac-allow-example-resource-tag)
+ [Contoh 2: Izinkan tindakan menggunakan aws: RequestTag](#abac-allow-example-request-tag)
+ [Contoh 3: Tolak tindakan menggunakan aws: TagKeys](#abac-deny-example-tag-key)

## Contoh 1: Izinkan tindakan menggunakan aws: ResourceTag
<a name="abac-allow-example-resource-tag"></a>

Dengan menggunakan kunci `aws:ResourceTag/tag-key` kondisi, Anda dapat membandingkan pasangan nilai kunci tag yang ditentukan dalam kebijakan IAM dengan pasangan nilai kunci yang dilampirkan dalam tabel DynamoDB. Misalnya, Anda dapat mengizinkan tindakan tertentu, seperti [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html), jika kondisi tag cocok dengan kebijakan IAM dan tabel. Untuk melakukan ini, lakukan langkah-langkah berikut:

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

1. Buat tabel. Contoh berikut menggunakan AWS CLI perintah [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) untuk membuat tabel bernama. `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. Tambahkan tag ke tabel ini. Contoh AWS CLI perintah [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) berikut menambahkan pasangan nilai kunci tag ke. `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. Buat [kebijakan inline](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) dan tambahkan ke peran yang memiliki kebijakan [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS terkelola yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

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

****  

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

------

   Kebijakan ini memungkinkan `PutItem` tindakan pada tabel jika kunci tag dan nilai yang dilampirkan ke tabel cocok dengan tag yang ditentukan dalam kebijakan.

1. Asumsikan peran dengan kebijakan yang dijelaskan dalam Langkah 3.

1. Gunakan AWS CLI perintah [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) untuk menempatkan item ke. `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. Pindai tabel untuk memverifikasi apakah item telah ditambahkan ke tabel.

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

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

1. Buat tabel. Contoh berikut menggunakan [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)API untuk membuat tabel bernama`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. Tambahkan tag ke tabel ini. [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)API dalam contoh berikut menambahkan pasangan nilai kunci tag `Title: ProductManager` ke. `myMusicTable`

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

1. Buat [kebijakan inline](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) dan tambahkan ke peran yang memiliki kebijakan [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS terkelola yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

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

****  

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

------

   Kebijakan ini memungkinkan `PutItem` tindakan pada tabel jika kunci tag dan nilai yang dilampirkan ke tabel cocok dengan tag yang ditentukan dalam kebijakan.

1. Asumsikan peran dengan kebijakan yang dijelaskan dalam Langkah 3.

1. Gunakan [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)API untuk menempatkan item ke file`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. Pindai tabel untuk memverifikasi apakah item telah ditambahkan ke tabel.

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

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

1. Buat tabel. Contoh berikut menggunakan [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)API untuk membuat tabel bernama`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. Tambahkan tag ke tabel ini. [TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)API dalam contoh berikut menambahkan pasangan nilai kunci tag `Title: ProductManager` ke. `myMusicTable`

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

1. Buat [kebijakan inline](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) dan tambahkan ke peran yang memiliki kebijakan [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS terkelola yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

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

****  

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

------

   Kebijakan ini memungkinkan `PutItem` tindakan pada tabel jika kunci tag dan nilai yang dilampirkan ke tabel cocok dengan tag yang ditentukan dalam kebijakan.

1. Asumsikan peran dengan kebijakan yang dijelaskan dalam Langkah 3.

1. Gunakan [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)API untuk menempatkan item ke file`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. Pindai tabel untuk memverifikasi apakah item telah ditambahkan ke tabel.

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

------

**Tanpa ABAC**  
Jika ABAC tidak diaktifkan untuk Anda Akun AWS, kondisi tag dalam kebijakan IAM dan tabel DynamoDB tidak cocok. Akibatnya, `PutItem` tindakan mengembalikan `AccessDeniedException` karena efek `AmazonDynamoDBReadOnlyAccess` kebijakan.

```
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.
```

**Dengan ABAC**  
Jika ABAC diaktifkan untuk Anda Akun AWS, `put-item` tindakan berhasil diselesaikan dan menambahkan item baru ke tabel Anda. Hal ini karena kebijakan inline pada tabel memungkinkan `PutItem` tindakan jika kondisi tag dalam kebijakan IAM dan tabel cocok.

## Contoh 2: Izinkan tindakan menggunakan aws: RequestTag
<a name="abac-allow-example-request-tag"></a>

Dengan menggunakan [RequestTagkunci kondisi aws: /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), Anda dapat membandingkan pasangan nilai kunci tag yang diteruskan dalam permintaan Anda dengan pasangan tag yang ditentukan dalam kebijakan IAM. Misalnya, Anda dapat mengizinkan tindakan tertentu, seperti`CreateTable`, menggunakan `aws:RequestTag` jika kondisi tag tidak cocok. Untuk melakukan ini, lakukan langkah-langkah berikut:

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

1. Buat [kebijakan inline](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) dan tambahkan ke peran yang memiliki kebijakan [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) AWS terkelola yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

------
#### [ 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. Buat tabel yang berisi pasangan nilai kunci tag dari. `"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 untuk Python (Boto3) ]

1. Buat [kebijakan inline](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) dan tambahkan ke peran yang memiliki kebijakan [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS terkelola yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

------
#### [ 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. Buat tabel yang berisi pasangan nilai kunci tag dari. `"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'
           },
       ],
   )
   ```

------

**Tanpa ABAC**  
Jika ABAC tidak diaktifkan untuk Anda Akun AWS, kondisi tag dalam kebijakan sebaris dan tabel DynamoDB tidak cocok. Akibatnya, `CreateTable` permintaan gagal dan tabel Anda tidak dibuat.

```
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.
```

**Dengan ABAC**  
Jika ABAC diaktifkan untuk Anda Akun AWS, permintaan pembuatan tabel Anda berhasil diselesaikan. Karena pasangan nilai kunci tag `"Owner": "John"` hadir dalam `CreateTable` permintaan, kebijakan inline memungkinkan pengguna `John` untuk melakukan tindakan. `CreateTable`

## Contoh 3: Tolak tindakan menggunakan aws: TagKeys
<a name="abac-deny-example-tag-key"></a>

Menggunakan [aws: TagKeys](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys) condition key, Anda dapat membandingkan kunci tag dalam permintaan dengan kunci yang ditentukan dalam kebijakan IAM. Misalnya, Anda dapat menolak tindakan tertentu, seperti`CreateTable`, menggunakan `aws:TagKeys` jika kunci tag tertentu *tidak* ada dalam permintaan. Untuk melakukan ini, lakukan langkah-langkah berikut:

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

1. Tambahkan [kebijakan terkelola pelanggan](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) ke peran yang memiliki kebijakan AWS terkelola [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

------
#### [ 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. Asumsikan peran yang dilampirkan kebijakan, dan buat tabel dengan kunci tag`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 untuk Python (Boto3) ]

1. Tambahkan [kebijakan terkelola pelanggan](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) ke peran yang memiliki kebijakan AWS terkelola [AmazonDynamoDBFullAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html) yang dilampirkan padanya, seperti yang ditunjukkan pada contoh berikut.

------
#### [ 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. Asumsikan peran yang dilampirkan kebijakan, dan buat tabel dengan kunci tag`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'
           },
       ],
   )
   ```

------

**Tanpa ABAC**  
Jika ABAC tidak diaktifkan untuk Anda Akun AWS, DynamoDB tidak mengirim kunci tag dalam `create-table` perintah ke IAM. `Null`Kondisi memastikan bahwa kondisi mengevaluasi `false` jika tidak ada kunci tag dalam permintaan. Karena `Deny` kebijakan tidak cocok, `create-table` perintah berhasil diselesaikan.

**Dengan ABAC**  
Jika ABAC diaktifkan untuk Anda Akun AWS, kunci tag yang diteruskan dalam `create-table` perintah diteruskan ke IAM. Kunci tag `Title` dievaluasi terhadap kunci tag berbasis kondisi`CostCenter`, yang ada dalam kebijakan. `Deny` Kunci tag `Title` tidak cocok dengan kunci tag yang ada dalam `Deny` kebijakan karena `StringNotEquals` operator. Oleh karena itu, `CreateTable` tindakan gagal dan tabel Anda tidak dibuat. Menjalankan `create-table` perintah mengembalikan file`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.
```