

# DynamoDB での属性ベースのアクセス制御の使用
<a name="attribute-based-access-control"></a>

[属性ベースのアクセス制御 (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) は、アイデンティティベースのポリシーまたは他の AWS ポリシー (リソースベースのポリシーや組織の IAM ポリシーなど) の[タグ条件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html)に基づいてアクセス許可を定義する認可戦略です。DynamoDB テーブルにタグをアタッチすると、タグベースの条件に対して評価されます。テーブルに関連付けられたインデックスは、テーブルに追加するタグを継承します。DynamoDB テーブルごとに最大 50 個のタグを追加できます。テーブル内のすべてのタグにサポートされる最大サイズは 10 KB です。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 テーブルやインデックスへのアクセスを制御できます。これらの条件により、IAM プリンシパル、ユーザー、またはロールが DynamoDB テーブルとインデックスに対して持つアクセスのレベルが決まります。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 マネジメントコンソール、AWS API、AWS Command Line Interface (AWS CLI)、AWS SDK、または AWS CloudFormation を使用して含めることができます。

次の例では、名前 `environment` と値 `production` を持つタグキーが含まれている場合に、`MusicTable` という名前の付いたテーブルで [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>

DynamoDB テーブルまたはインデックスで ABAC を使用する場合は、次の考慮事項が適用されます。
+ DynamoDB Streams では、タグ付けと 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/ja_jp/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


ABAC は、アイデンティティベースのポリシーまたは他のポリシーで指定されたタグベースの条件を引き続き監査する必要がある AWS アカウントに対して有効になっていません。アカウントで 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 マネジメントコンソール にサインインして DynamoDB コンソール ([https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)) を開きます。

1. 上部のナビゲーションペインで、ABAC を有効にするリージョンを選択します。

1. 左のナビゲーションペインで、**[設定]** を選択します。

1. **[Settings]** (設定) ページで、以下の操作を行います。

   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 マネジメントコンソール、AWS API、AWS Command Line Interface (AWS CLI)、AWS SDK、または AWS CloudFormation を使用して、新規または既存の 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. IAM ポリシーを AWS アカウントのテストユーザーまたはロールにアタッチします。使用する 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 テーブルのタグ条件が一致しません。結果として、`AmazonDynamoDBReadOnlyAccess` ポリシーの影響により、`PutItem` アクションは `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 暦日以内にオプトアウトします。