

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

# Menggunakan kontrol akses berbasis atribut dengan DynamoDB
<a name="attribute-based-access-control"></a>

[Kontrol akses berbasis atribut (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) adalah strategi otorisasi yang menentukan izin akses berdasarkan [kondisi tag](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html) dalam kebijakan berbasis identitas Anda atau kebijakan lain, seperti kebijakan berbasis sumber daya dan kebijakan IAM AWS organisasi. Anda dapat melampirkan tag ke tabel DynamoDB, yang kemudian dievaluasi terhadap kondisi berbasis tag. Indeks yang terkait dengan tabel mewarisi tanda yang Anda tambahkan ke tabel. Anda dapat menambahkan hingga 50 tag untuk setiap tabel DynamoDB. Ukuran maksimum yang didukung untuk semua tag dalam tabel adalah 10 KB. [Untuk informasi selengkapnya tentang menandai sumber daya DynamoDB dan pembatasan penandaan, lihat Menandai sumber daya di DynamoDB dan.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html) [Pembatasan penandaan di DynamoDB](Tagging.md#TaggingRestrictions)

Untuk informasi selengkapnya tentang penggunaan tag untuk mengontrol akses ke AWS sumber daya, lihat topik berikut di Panduan Pengguna IAM:
+ [Untuk apa ABAC AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [Mengontrol akses ke AWS sumber daya menggunakan tag](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

Dengan ABAC, Anda dapat menerapkan tingkat akses yang berbeda-beda untuk tim dan aplikasi Anda guna melakukan tindakan pada tabel DynamoDB menggunakan lebih sedikit kebijakan. Anda dapat menentukan tag dalam [elemen kondisi](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) kebijakan IAM untuk mengontrol akses ke tabel atau indeks DynamoDB Anda. Kondisi ini menentukan tingkat akses yang dimiliki oleh prinsipal IAM, pengguna, atau peran, ke tabel dan indeks DynamoDB. Ketika prinsipal IAM membuat permintaan akses ke DynamoDB, tag sumber daya dan identitas dievaluasi terhadap kondisi tag dalam kebijakan IAM. Setelah itu, kebijakan menjadi efektif hanya jika kondisi tag terpenuhi. Ini memungkinkan Anda untuk membuat kebijakan IAM yang secara efektif mengatakan salah satu dari berikut ini:
+ *Izinkan pengguna untuk mengelola hanya sumber daya yang memiliki tag dengan kunci `X` dan nilai `Y`*.
+ *Tolak akses ke semua pengguna ke sumber daya yang ditandai dengan kunci `X`*.

Misalnya, Anda dapat membuat kebijakan yang memungkinkan pengguna memperbarui tabel hanya jika memiliki pasangan nilai kunci tag:. `"environment": "staging"` Anda dapat menggunakan kunci ResourceTag kondisi [aws:](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) untuk mengizinkan atau menolak akses ke tabel berdasarkan tag yang dilampirkan ke tabel tersebut.

Anda dapat menyertakan kondisi berbasis atribut saat membuat kebijakan atau yang lebih baru menggunakan Konsol Manajemen AWS, AWS API, AWS Command Line Interface (AWS CLI), AWS SDK, atau. AWS CloudFormation

Contoh berikut memungkinkan [UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)tindakan pada tabel bernama `MusicTable` jika menyertakan kunci tag dengan nama `environment` dan nilai`production`.

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

****  

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

------

**Topics**
+ [Mengapa saya harus menggunakan ABAC?](#why-use-abac)
+ [Kunci kondisi untuk mengimplementasikan ABAC dengan DynamoDB](#condition-keys-implement-abac)
+ [Pertimbangan untuk menggunakan ABAC dengan DynamoDB](#abac-considerations)
+ [Mengaktifkan ABAC di DynamoDB](abac-enable-ddb.md)
+ [Menggunakan ABAC dengan tabel dan indeks DynamoDB](abac-implementation-ddb-tables.md)
+ [Contoh untuk menggunakan ABAC dengan tabel dan indeks DynamoDB](abac-example-use-cases.md)
+ [Memecahkan masalah kesalahan ABAC umum untuk tabel dan indeks DynamoDB](abac-troubleshooting.md)

## Mengapa saya harus menggunakan ABAC?
<a name="why-use-abac"></a>
+ **Manajemen kebijakan yang lebih sederhana:** Anda menggunakan lebih sedikit kebijakan karena Anda tidak perlu membuat kebijakan yang berbeda untuk menentukan tingkat akses untuk setiap prinsipal IAM.
+ **Kontrol akses yang dapat diskalakan:** Menskalakan kontrol akses lebih mudah dengan ABAC karena Anda tidak perlu memperbarui kebijakan saat membuat sumber daya DynamoDB baru. Anda dapat menggunakan tag untuk mengotorisasi akses ke prinsipal IAM yang berisi tag yang cocok dengan tag sumber daya. Anda dapat menggunakan prinsipal IAM baru atau sumber daya DynamoDB dan menerapkan tag yang sesuai untuk secara otomatis memberikan izin yang diperlukan tanpa harus membuat perubahan kebijakan apa pun.
+ **Manajemen izin berbutir halus:** Merupakan praktik terbaik untuk [memberikan hak istimewa paling sedikit](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) saat Anda membuat kebijakan. Menggunakan ABAC, Anda dapat membuat tag untuk prinsipal IAM, dan menggunakannya untuk memberikan akses ke tindakan dan sumber daya tertentu yang cocok dengan tag pada prinsipal IAM. 
+ **Penyelarasan dengan direktori perusahaan:** Anda dapat memetakan tag dengan atribut karyawan yang ada dari direktori perusahaan Anda untuk menyelaraskan kebijakan kontrol akses Anda dengan struktur organisasi Anda.

## Kunci kondisi untuk mengimplementasikan ABAC dengan DynamoDB
<a name="condition-keys-implement-abac"></a>

Anda dapat menggunakan kunci kondisi berikut dalam AWS kebijakan Anda untuk mengontrol tingkat akses ke tabel dan indeks DynamoDB Anda:
+ [aws: ResourceTag /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag): Mengontrol akses berdasarkan apakah pasangan nilai kunci tag pada tabel atau indeks DynamoDB cocok dengan kunci tag dan nilai dalam kebijakan. Kunci kondisi ini relevan dengan semua APIs yang beroperasi pada tabel atau indeks yang ada.

  `dynamodb:ResourceTag`Kondisi dievaluasi seolah-olah Anda tidak melampirkan tag apa pun ke sumber daya.
+ [aws: RequestTag /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag): Memungkinkan membandingkan pasangan nilai kunci tag yang diteruskan dalam permintaan dengan pasangan tag yang Anda tentukan dalam kebijakan. Kunci kondisi ini relevan dengan APIs yang berisi tag sebagai bagian dari payload permintaan. Ini APIs termasuk [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)dan [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): Membandingkan kunci tag dalam permintaan dengan kunci yang Anda tentukan dalam kebijakan. Kunci kondisi ini relevan dengan APIs yang berisi tag sebagai bagian dari payload permintaan. Ini APIs termasuk`CreateTable`,`TagResource`, dan`UntagResource`.

## Pertimbangan untuk menggunakan ABAC dengan DynamoDB
<a name="abac-considerations"></a>

Bila Anda menggunakan ABAC dengan tabel atau indeks DynamoDB, pertimbangan berikut berlaku:
+ Penandaan dan ABAC tidak didukung untuk DynamoDB Streams.
+ Penandaan dan ABAC tidak didukung untuk backup DynamoDB. Untuk menggunakan ABAC dengan cadangan, kami sarankan Anda menggunakannya. [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)
+ Tag tidak disimpan dalam tabel yang dipulihkan. Anda perlu menambahkan tag ke tabel yang dipulihkan sebelum dapat menggunakan kondisi berbasis tag dalam kebijakan Anda.

# Mengaktifkan ABAC di DynamoDB
<a name="abac-enable-ddb"></a>

Untuk sebagian besar Akun AWS, ABAC diaktifkan secara default. Menggunakan konsol [DynamoDB](https://console.aws.amazon.com/dynamodb/), Anda dapat mengonfirmasi apakah ABAC diaktifkan untuk akun Anda. [Untuk melakukan ini, pastikan Anda membuka konsol DynamoDB dengan peran yang memiliki izin dynamodb:. GetAbacStatus](#required-permissions-abac) Kemudian, buka halaman **Pengaturan** konsol DynamoDB.

**Jika Anda tidak melihat kartu **kontrol akses berbasis Atribut** atau jika kartu menampilkan status Aktif, itu berarti ABAC diaktifkan untuk akun Anda.** Namun, jika Anda melihat kartu **kontrol akses berbasis Atribut** dengan status **Mati**, seperti yang ditunjukkan pada gambar berikut, ABAC tidak diaktifkan untuk akun Anda.

## Kontrol akses berbasis atribut — tidak diaktifkan
<a name="abac-disabled-image"></a>

![\[Halaman pengaturan pada konsol DynamoDB yang menampilkan kartu kontrol akses berbasis Atribut.\]](http://docs.aws.amazon.com/id_id/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


ABAC tidak diaktifkan Akun AWS untuk kondisi berbasis tag yang ditentukan dalam kebijakan berbasis identitas atau kebijakan lainnya masih perlu diaudit. Jika ABAC tidak diaktifkan untuk akun Anda, kondisi berbasis tag dalam kebijakan Anda yang dimaksudkan untuk bertindak pada tabel atau indeks DynamoDB akan dievaluasi seolah-olah tidak ada tag yang ada untuk sumber daya atau permintaan API Anda. Saat ABAC diaktifkan untuk akun Anda, kondisi berbasis tag dalam kebijakan akun Anda akan dievaluasi dengan mempertimbangkan tag yang dilampirkan pada tabel atau permintaan API Anda.

Untuk mengaktifkan ABAC untuk akun Anda, kami sarankan Anda terlebih dahulu mengaudit kebijakan Anda seperti yang dijelaskan di [Audit kebijakan](#policy-audit-for-abac) bagian ini. Kemudian, sertakan [izin yang diperlukan untuk ABAC dalam kebijakan](#required-permissions-abac) IAM Anda. Terakhir, lakukan langkah-langkah yang dijelaskan [Mengaktifkan ABAC di konsol](#abac-enable-console) untuk mengaktifkan ABAC untuk akun Anda di Wilayah saat ini. Setelah mengaktifkan ABAC, Anda dapat memilih keluar dalam tujuh hari kalender berikutnya setelah memilih.

**Topics**
+ [Mengaudit kebijakan Anda sebelum mengaktifkan ABAC](#policy-audit-for-abac)
+ [Izin IAM diperlukan untuk mengaktifkan ABAC](#required-permissions-abac)
+ [Mengaktifkan ABAC di konsol](#abac-enable-console)

## Mengaudit kebijakan Anda sebelum mengaktifkan ABAC
<a name="policy-audit-for-abac"></a>

Sebelum Anda mengaktifkan ABAC untuk akun Anda, audit kebijakan Anda untuk mengonfirmasi bahwa kondisi berbasis tag yang mungkin ada dalam kebijakan dalam akun Anda diatur sebagaimana dimaksud. Mengaudit kebijakan Anda akan membantu menghindari kejutan dari perubahan otorisasi dengan alur kerja DynamoDB Anda setelah ABAC diaktifkan. Untuk melihat contoh penggunaan kondisi berbasis atribut dengan tag, dan perilaku sebelum dan sesudah implementasi ABAC, lihat. [Contoh untuk menggunakan ABAC dengan tabel dan indeks DynamoDBContoh kasus penggunaan](abac-example-use-cases.md)

## Izin IAM diperlukan untuk mengaktifkan ABAC
<a name="required-permissions-abac"></a>

Anda memerlukan `dynamodb:UpdateAbacStatus` izin untuk mengaktifkan ABAC untuk akun Anda di Wilayah saat ini. Untuk mengonfirmasi apakah ABAC diaktifkan untuk akun Anda, Anda juga harus memiliki `dynamodb:GetAbacStatus` izin. Dengan izin ini, Anda dapat melihat status ABAC untuk akun di Wilayah mana pun. Anda memerlukan izin ini selain izin yang diperlukan untuk mengakses konsol DynamoDB.

Kebijakan IAM berikut memberikan izin untuk mengaktifkan ABAC dan melihat statusnya untuk akun di Wilayah saat ini.

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

## Mengaktifkan ABAC di konsol
<a name="abac-enable-console"></a>

1. Masuk ke Konsol Manajemen AWS dan buka konsol DynamoDB di. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Dari panel navigasi atas, pilih Wilayah yang ingin Anda aktifkan ABAC.

1. Di panel navigasi kiri, pilih **Pengaturan**.

1. Pada halaman **Pengaturan**, lakukan hal berikut:

   1. **Di kartu **kontrol akses berbasis atribut**, pilih Aktifkan.**

   1. Di kotak **pengaturan kontrol akses berbasis atribut Konfirmasi**, pilih **Aktifkan** untuk mengonfirmasi pilihan Anda.

      **Ini memungkinkan ABAC untuk Wilayah saat ini dan kartu **kontrol akses berbasis Atribut** menunjukkan status Aktif.**

      Jika Anda ingin memilih keluar setelah mengaktifkan ABAC di konsol, Anda dapat melakukannya dalam tujuh hari kalender berikutnya setelah memilih. Untuk memilih keluar, pilih **Nonaktifkan** di kartu **kontrol akses berbasis** Atribut di halaman **Pengaturan**.
**catatan**  
Memperbarui status ABAC adalah operasi asinkron. Jika tag dalam kebijakan Anda tidak segera dievaluasi, Anda mungkin perlu menunggu beberapa saat karena penerapan perubahan pada akhirnya konsisten.

# Menggunakan ABAC dengan tabel dan indeks DynamoDB
<a name="abac-implementation-ddb-tables"></a>

Langkah-langkah berikut menunjukkan cara mengatur izin menggunakan ABAC. Dalam skenario contoh ini, Anda akan menambahkan tag ke tabel DynamoDB dan membuat peran IAM dengan kebijakan yang menyertakan kondisi berbasis tag. Kemudian, Anda akan menguji izin yang diizinkan pada tabel DynamoDB dengan mencocokkan kondisi tag.

**Topics**
+ [Langkah 1: Tambahkan tag ke tabel DynamoDB](#abac-add-table-tags)
+ [Langkah 2: Buat peran IAM dengan kebijakan termasuk kondisi berbasis tag](#abac-create-iam-role)
+ [Langkah 3: Uji izin yang diizinkan](#abac-test-permissions)

## Langkah 1: Tambahkan tag ke tabel DynamoDB
<a name="abac-add-table-tags"></a>

Anda dapat menambahkan tag ke tabel DynamoDB baru atau yang sudah ada menggunakan Konsol Manajemen AWS AWS , API,AWS CLI() AWS Command Line Interface , SDK AWS , atau. AWS CloudFormation Misalnya, perintah [CLI tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) berikut menambahkan tag ke tabel bernama. `MusicTable`

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

## Langkah 2: Buat peran IAM dengan kebijakan termasuk kondisi berbasis tag
<a name="abac-create-iam-role"></a>

[Buat kebijakan IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) menggunakan [ResourceTagkunci kondisi aws: /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) untuk membandingkan pasangan nilai kunci tag yang ditentukan dalam kebijakan IAM dengan pasangan kunci-nilai yang dilampirkan ke tabel. Contoh kebijakan berikut memungkinkan pengguna untuk menempatkan atau memperbarui item dalam tabel jika tabel ini berisi pasangan nilai kunci tag:. `"environment": "staging"` Jika tabel tidak memiliki pasangan nilai kunci tag yang ditentukan, tindakan ini ditolak.

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

****  

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

------

## Langkah 3: Uji izin yang diizinkan
<a name="abac-test-permissions"></a>

1. Lampirkan kebijakan IAM ke pengguna pengujian atau peran di Anda Akun AWS. Pastikan bahwa prinsipal IAM yang Anda gunakan belum memiliki akses ke tabel DynamoDB melalui kebijakan yang berbeda.

1. Pastikan tabel DynamoDB Anda berisi `"environment"` kunci tag dengan nilai. `"staging"`

1. Lakukan `dynamodb:PutItem` dan `dynamodb:UpdateItem` tindakan pada tabel yang ditandai. Tindakan ini akan berhasil jika pasangan nilai kunci `"environment": "staging"` tag hadir.

   Jika Anda melakukan tindakan ini pada tabel yang tidak memiliki pasangan nilai kunci `"environment": "staging"` tag, permintaan Anda akan gagal dengan. `AccessDeniedException`

Anda juga dapat meninjau [kasus penggunaan sampel](abac-example-use-cases.md) lainnya yang dijelaskan di bagian berikut untuk menerapkan ABAC dan melakukan lebih banyak pengujian.

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

# Memecahkan masalah kesalahan ABAC umum untuk tabel dan indeks DynamoDB
<a name="abac-troubleshooting"></a>

Topik ini memberikan saran pemecahan masalah untuk kesalahan umum dan masalah yang mungkin Anda temui saat menerapkan ABAC di tabel atau indeks DynamoDB.

## Kunci kondisi khusus layanan dalam kebijakan menghasilkan kesalahan
<a name="abac-troubleshooting-service-specific-keys"></a>

Kunci kondisi khusus layanan tidak dianggap sebagai kunci kondisi yang valid. Jika Anda telah menggunakan kunci tersebut dalam kebijakan Anda, ini akan mengakibatkan kesalahan. Untuk memperbaiki masalah ini, Anda harus mengganti kunci kondisi khusus layanan dengan kunci kondisi yang sesuai [untuk mengimplementasikan ABAC di DynamoDB](attribute-based-access-control.md#condition-keys-implement-abac).

Misalnya, Anda telah menggunakan kunci `dynamodb:ResourceTag` kondisi dalam [kebijakan sebaris](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) yang menjalankan [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)permintaan. Bayangkan bahwa permintaan gagal dengan file`AccessDeniedException`. Contoh berikut menunjukkan kebijakan inline yang salah dengan kunci kondisi. `dynamodb:ResourceTag`

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

****  

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

------

Untuk memperbaiki masalah ini, ganti kunci `dynamodb:ResourceTag` kondisi dengan`aws:ResourceTag`, 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/Owner": "John"
                }
            }
        }
    ]
}
```

------

## Tidak dapat memilih keluar dari ABAC
<a name="abac-troubleshooting-unable-opt-out"></a>

Jika ABAC diaktifkan untuk akun Anda Dukungan, Anda tidak akan dapat memilih keluar dari ABAC melalui konsol DynamoDB. Untuk memilih keluar, hubungi [Dukungan](https://console.aws.amazon.com/support).

Anda dapat memilih keluar dari ABAC sendiri *hanya jika* yang berikut ini benar:
+ Anda menggunakan cara swalayan untuk [memilih melalui konsol DynamoDB](abac-enable-ddb.md#abac-enable-console).
+ Anda memilih keluar dalam waktu tujuh hari kalender setelah memilih.