

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Utilisation du contrôle d’accès par attributs avec DynamoDB
<a name="attribute-based-access-control"></a>

Le [contrôle d'accès basé sur les attributs (ABAC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html) est une stratégie d'autorisation qui définit les autorisations d'accès en fonction des [conditions des balises](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html) dans vos politiques basées sur l'identité ou dans d'autres politiques, telles que les politiques basées sur les ressources et AWS les politiques IAM de l'organisation. Vous pouvez associer des balises aux tables DynamoDB, qui sont ensuite évaluées par rapport aux conditions basées sur les balises. Les index associés à une table héritent des balises que vous ajoutez à la table. Vous pouvez ajouter jusqu’à 50 balises par table DynamoDB. La taille maximale prise en charge pour toutes les balises d’une table est de 10 Ko. Pour plus d’informations sur le balisage des ressources DynamoDB et les restrictions de balisage, consultez [Étiquetage de ressources dans DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html) et [Restrictions d’étiquetage dans DynamoDB](Tagging.md#TaggingRestrictions).

Pour plus d'informations sur l'utilisation de balises pour contrôler l'accès aux AWS ressources, consultez les rubriques suivantes du guide de l'utilisateur IAM :
+ [À quoi sert ABAC AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)
+ [Contrôle de l'accès aux AWS ressources à l'aide de balises](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html)

À l’aide d’ABAC, vous pouvez appliquer différents niveaux d’accès à vos équipes et à vos applications afin qu’elles puissent effectuer des actions sur les tables DynamoDB en utilisant moins de politiques. Vous pouvez spécifier une balise dans le champ [élément de condition](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition.html) d’une politique IAM pour contrôler l’accès à vos tables ou index DynamoDB. Ces conditions déterminent le niveau d’accès d’un principal, d’un utilisateur ou d’un rôle IAM aux tables et aux index DynamoDB. Lorsqu’un principal IAM fait une demande d’accès à DynamoDB, les balises de la ressource et de l’identité sont évaluées par rapport aux conditions des balises définies dans la politique IAM. Par la suite, la politique n’entre en vigueur que si les conditions relatives aux balises sont remplies. Cela vous permet de créer une politique IAM qui énonce efficacement l’un des éléments suivants :
+ *Autorisez l’utilisateur à gérer uniquement les ressources dotées d’une balise comportant une clé `X` et une valeur `Y`*.
+ *Refusez l’accès à tous les utilisateurs pour les ressources étiquetées avec une clé `X`*.

Par exemple, vous pouvez créer une politique qui permet aux utilisateurs de mettre à jour une table uniquement si elle possède la balise de paire clé-valeur : `"environment": "staging"`. Vous pouvez utiliser la clé de ResourceTag condition [aws :](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) pour autoriser ou refuser l'accès à une table en fonction des balises associées à cette table.

Vous pouvez inclure des conditions basées sur les attributs lors de la création de la politique ou ultérieurement à l'aide de l' AWS API AWS Management Console, AWS Command Line Interface (AWS CLI), du AWS SDK ou. AWS CloudFormation

L'exemple suivant autorise l'[UpdateItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html)action sur une table nommée `MusicTable` si elle inclut une clé de balise avec le nom `environment` et la valeur`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**
+ [Pourquoi utiliser l’ABAC ?](#why-use-abac)
+ [Clés de condition pour mettre en œuvre ABAC avec DynamoDB](#condition-keys-implement-abac)
+ [Considérations relatives à l’utilisation d’ABAC avec DynamoDB](#abac-considerations)
+ [Activation de l’ABAC dans DynamoDB](abac-enable-ddb.md)
+ [Utilisation de l’ABAC avec des tables et des index DynamoDB](abac-implementation-ddb-tables.md)
+ [Exemples d’utilisation de l’ABAC avec des tables et des index DynamoDB](abac-example-use-cases.md)
+ [Résolution des erreurs courantes liées à l’ABAC pour les tables et les index DynamoDB](abac-troubleshooting.md)

## Pourquoi utiliser l’ABAC ?
<a name="why-use-abac"></a>
+ **Gestion des politiques simplifiée :** vous utilisez moins de politiques, car vous n’avez pas à créer de politiques différentes afin de définir le niveau d’accès pour chaque principal IAM.
+ **Contrôle d’accès pouvait être mis à l’échelle :** la mise à l’échelle du contrôle d’accès est plus facile avec ABAC, car vous n’avez pas à mettre à jour vos politiques lorsque vous créez de nouvelles ressources DynamoDB. Vous pouvez utiliser des balises pour autoriser l’accès aux principaux IAM qui contiennent des balises correspondant à celles de la ressource. Vous pouvez intégrer de nouveaux principaux IAM ou de nouvelles ressources DynamoDB et appliquer les balises appropriées afin d’accorder automatiquement les autorisations nécessaires sans avoir à modifier les politiques.
+ **Gestion précise des autorisations :** il est recommandé d’[accorder le moindre privilège](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) lorsque vous créez des politiques. Avec ABAC, vous pouvez créer des balises pour le principal IAM et les utiliser pour restreindre l’accès à des actions et à des ressources spécifiques correspondant aux balises du principal IAM. 
+ **Alignement avec l’annuaire d’entreprise :** vous pouvez mapper des balises avec les attributs des employés existants à partir de votre annuaire d’entreprise afin d’aligner vos politiques de contrôle d’accès sur votre structure organisationnelle.

## Clés de condition pour mettre en œuvre ABAC avec DynamoDB
<a name="condition-keys-implement-abac"></a>

Vous pouvez utiliser les clés de condition suivantes dans vos AWS politiques pour contrôler le niveau d'accès à vos tables et index DynamoDB :
+ [aws : ResourceTag /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) : contrôle l'accès selon que la paire clé-valeur de balise d'une table ou d'un index DynamoDB correspond ou non à la clé et à la valeur de balise d'une politique. Cette clé de condition s'applique à tous APIs ceux qui opèrent sur une table ou un index existant.

  Les conditions `dynamodb:ResourceTag` sont évaluées comme si vous n’aviez attaché aucune balise à une ressource.
+ [aws : RequestTag /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag) : permet de comparer la paire clé-valeur de balise transmise dans la demande avec la paire de balises que vous spécifiez dans la politique. Cette clé de condition est pertinente pour ceux APIs qui contiennent des balises dans le cadre de la charge utile de la demande. Il s'agit APIs notamment [CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)de et [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) : Compare les clés de balise d'une demande avec les clés que vous spécifiez dans la politique. Cette clé de condition est pertinente pour ceux APIs qui contiennent des balises dans le cadre de la charge utile de la demande. Ceux-ci APIs incluent `CreateTable``TagResource`, et`UntagResource`.

## Considérations relatives à l’utilisation d’ABAC avec DynamoDB
<a name="abac-considerations"></a>

Lorsque vous utilisez ABAC avec des tables ou des index DynamoDB, les considérations suivantes s’appliquent :
+ Le balisage et l’ABAC ne sont pas pris en charge pour DynamoDB Streams.
+ Le balisage et l’ABAC ne sont pas pris en charge pour les sauvegardes DynamoDB. Pour utiliser l’ABAC avec des sauvegardes, nous vous recommandons d’utiliser [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html).
+ Les balises ne sont pas conservées dans les tables restaurées. Vous devez ajouter des balises aux tables restaurées avant de pouvoir utiliser des conditions basées sur des balises dans vos politiques.

# Activation de l’ABAC dans DynamoDB
<a name="abac-enable-ddb"></a>

Dans la plupart des cas Comptes AWS, ABAC est activé par défaut. À l’aide de la [console DynamoDB](https://console.aws.amazon.com/dynamodb/), vous pouvez vérifier si ABAC est activé pour votre compte. [Pour ce faire, assurez-vous d'ouvrir la console DynamoDB avec un rôle doté de l'autorisation dynamodb :. GetAbacStatus](#required-permissions-abac) Ouvrez ensuite la page **Paramètres** de la console DynamoDB.

Si vous ne voyez pas la carte **Contrôle d’accès basé sur les attributs** ou si le statut de la carte est **Activé**, cela signifie que l’ABAC est activé pour votre compte. Toutefois, si vous voyez la carte de **Contrôle d’accès basé sur les attributs** avec le statut **Désactivé**, comme indiqué dans l’image suivante, cela signifie que l’ABAC n’est pas activé pour votre compte.

## Contrôle d’accès par attributs - Non activé
<a name="abac-disabled-image"></a>

![\[Page de paramètres de la console DynamoDB qui affiche la carte de Contrôle d’accès par attributs.\]](http://docs.aws.amazon.com/fr_fr/amazondynamodb/latest/developerguide/images/ddb-console-settings-page.png)


L'ABAC n'est pas activé Comptes AWS pour les conditions basées sur les balises spécifiées dans leurs politiques basées sur l'identité ou dans d'autres politiques qui doivent encore être auditées. Si l’ABAC n’est pas activé pour votre compte, les conditions basées sur les balises de vos politiques destinées à agir sur les tables ou les index DynamoDB sont évaluées comme si aucune balise n’était présente pour vos ressources ou vos demandes d’API. Lorsque l’ABAC est activé pour votre compte, les conditions basées sur les balises figurant dans les politiques de votre compte sont évaluées en tenant compte des balises associées à vos tables ou à vos demandes d’API.

Pour activer l’ABAC pour votre compte, nous vous recommandons de commencer par auditer vos politiques comme décrit dans la section [Audit de politique](#policy-audit-for-abac). Incluez ensuite les [autorisations requises pour l’ABAC](#required-permissions-abac) dans votre politique IAM. Enfin, suivez les étapes décrites dans [Activation de l’ABAC dans la console](#abac-enable-console) pour activer l’ABAC pour votre compte dans la région actuelle. Après avoir activé l’ABAC, vous pouvez le désactiver dans les sept prochains jours calendaires suivant l’activation.

**Topics**
+ [Audit de vos politiques avant d’activer l’ABAC](#policy-audit-for-abac)
+ [Autorisations IAM requises pour activer l’ABAC](#required-permissions-abac)
+ [Activation de l’ABAC dans la console](#abac-enable-console)

## Audit de vos politiques avant d’activer l’ABAC
<a name="policy-audit-for-abac"></a>

Avant d’activer l’ABAC pour votre compte, auditez vos politiques pour vous assurer que les conditions basées sur des balises qui peuvent exister dans les politiques de votre compte sont configurées comme prévu. L’audit de vos politiques permet d’éviter les surprises liées aux modifications d’autorisation apportées à vos flux de travail DynamoDB après l’activation de l’ABAC. Pour consulter des exemples d’utilisation de conditions basées sur les attributs avec des balises, ainsi que le comportement avant et après de la mise en œuvre de l’ABAC, consultez [Exemples d’utilisation de l’ABAC avec des tables et des index DynamoDBExemples de cas d’utilisation ](abac-example-use-cases.md).

## Autorisations IAM requises pour activer l’ABAC
<a name="required-permissions-abac"></a>

Vous devez disposer de l’autorisation `dynamodb:UpdateAbacStatus` pour activer l’ABAC pour votre compte dans la région actuelle. Pour vérifier si l’ABAC est activé pour votre compte, vous devez également avoir l’autorisation `dynamodb:GetAbacStatus`. Cette autorisation vous permet de consulter le statut de l’ABAC d’un compte dans n’importe quelle région. Vous avez besoin de ces autorisations en plus de l’autorisation nécessaire pour accéder à la console DynamoDB.

La politique IAM suivante accorde l’autorisation d’activer l’ABAC et de consulter son statut pour un compte dans la région actuelle.

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

## Activation de l’ABAC dans la console
<a name="abac-enable-console"></a>

1. Connectez-vous à la console DynamoDB AWS Management Console et ouvrez-la à l'adresse. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Dans le panneau de navigation supérieur, sélectionnez la région pour laquelle vous souhaitez activer l’ABAC.

1. Dans le panneau de navigation de gauche, choisissez **Paramètres**.

1. Sur la page **Settings (Paramètres)**, procédez comme suit :

   1. Dans la carte de **Contrôle d’accès par attributs**, choisissez **Activer**.

   1. Dans la case **Confirmer le réglage du contrôle d’accès par attributs**, choisissez **Activer** pour confirmer votre choix.

      Cette opération active l’ABAC pour la région actuelle et la carte de **Contrôle d’accès basé sur les attributs** indique le statut **Activé**.

      Si vous souhaitez désactiver l’ABAC après l’avoir activé sur votre console, vous pouvez le faire dans les sept jours calendaires suivant l’activation. Pour désactiver l’ABAC, choisissez **Désactiver** dans la carte de **Contrôle d’accès par attributs** de la page **Paramètres**.
**Note**  
La mise à jour du statut de l’ABAC est une opération asynchrone. Si les balises de vos politiques ne sont pas évaluées immédiatement, vous devrez peut-être attendre un certain temps, car l’application des modifications sera finalement cohérente.

# Utilisation de l’ABAC avec des tables et des index DynamoDB
<a name="abac-implementation-ddb-tables"></a>

Les étapes suivantes montrent comment configurer des autorisations à l’aide de l’ABAC. Dans cet exemple de scénario, vous allez ajouter des balises à une table DynamoDB et créer un rôle IAM avec une politique qui inclut des conditions basées sur des balises. Vous allez ensuite tester les autorisations accordées dans la table DynamoDB en respectant les conditions des balises.

**Topics**
+ [Étape 1 : Ajouter des balises à une table DynamoDB](#abac-add-table-tags)
+ [Étape 2 : Créer un rôle IAM avec une politique incluant des conditions basées sur des balises](#abac-create-iam-role)
+ [Étape 3 : Tester les autorisations accordées](#abac-test-permissions)

## Étape 1 : Ajouter des balises à une table DynamoDB
<a name="abac-add-table-tags"></a>

Vous pouvez ajouter des balises à des tables DynamoDB nouvelles ou existantes à l'aide de l'API AWS ,AWS CLI() AWS Command Line Interface AWS , AWS Management Console du SDK ou. AWS CloudFormation Par exemple, la commande CLI [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) suivante ajoute une balise à une table nommée `MusicTable`.

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

## Étape 2 : Créer un rôle IAM avec une politique incluant des conditions basées sur des balises
<a name="abac-create-iam-role"></a>

[Créez une politique IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html#access_policies_create-json-editor) à l'aide de la clé de condition [aws : ResourceTag /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag) pour comparer la paire clé-valeur de balise spécifiée dans la politique IAM avec la paire clé-valeur attachée à la table. L’exemple de politique suivant permet aux utilisateurs de placer ou de mettre à jour des éléments dans des tables si celles-ci contiennent la paire clé-valeur de balise : `"environment": "staging"`. Si une table ne possède pas la paire clé-valeur de balise spécifiée, ces actions sont refusées.

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

****  

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

------

## Étape 3 : Tester les autorisations accordées
<a name="abac-test-permissions"></a>

1. Attachez la politique IAM à un utilisateur ou à un rôle de test dans votre Compte AWS. Assurez-vous que le principal IAM que vous utilisez n’a pas déjà accès à la table DynamoDB par le biais d’une autre politique.

1. Assurez-vous que votre table DynamoDB contient la clé de balise `"environment"` avec une valeur de `"staging"`.

1. Exécutez les actions `dynamodb:PutItem` et `dynamodb:UpdateItem` et sur la table balisée. Ces actions devraient réussir si la paire clé-valeur de la balise `"environment": "staging"` est présente.

   Si vous effectuez ces actions sur une table dépourvue de la paire clé-valeur de balise `"environment": "staging"`, votre demande échouera avec un message d’erreur `AccessDeniedException`.

Vous pouvez également consulter les autres [exemples de cas d’utilisation](abac-example-use-cases.md) décrits dans la section suivante pour mettre en œuvre l’ABAC et effectuer d’autres tests.

# Exemples d’utilisation de l’ABAC avec des tables et des index DynamoDB
<a name="abac-example-use-cases"></a>

Les exemples suivants illustrent certains cas d’utilisation pour la mise en œuvre des conditions basées sur les attributs à l’aide de balises.

**Topics**
+ [Exemple 1 : Autoriser une action à l'aide de aws : ResourceTag](#abac-allow-example-resource-tag)
+ [Exemple 2 : Autoriser une action à l'aide de aws : RequestTag](#abac-allow-example-request-tag)
+ [Exemple 3 : Refuser une action à l'aide de aws : TagKeys](#abac-deny-example-tag-key)

## Exemple 1 : Autoriser une action à l'aide de aws : ResourceTag
<a name="abac-allow-example-resource-tag"></a>

À l’aide de la clé de condition `aws:ResourceTag/tag-key`, vous pouvez comparer la paire clé-valeur de balise spécifiée dans une politique IAM avec la paire clé-valeur attachée dans une table DynamoDB. Par exemple, vous pouvez autoriser une action spécifique, par exemple si les conditions des balises correspondent dans une politique IAM et dans une table. [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html) Effectuez les étapes suivantes pour ce faire :

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

1. Créer une table. L'exemple suivant utilise la AWS CLI commande [create-table](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html) pour créer une table nommée. `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. Ajoutez une balise à cette table. L'exemple de AWS CLI commande [tag-resource](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/tag-resource.html) suivant ajoute la paire clé-valeur tag au. `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. Créez une [politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) et ajoutez-la à un rôle auquel la politique [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

****  

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

------

   Cette politique autorise l’action `PutItem` sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

1. Assumez le rôle avec les politiques décrites à l’étape 3.

1. Utilisez la AWS CLI commande [put-item](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html) pour placer un élément dans le. `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. Analysez la table pour vérifier si l’élément y a été ajouté.

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

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

1. Créer une table. L'exemple suivant utilise l'[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)API pour créer une table nommée`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. Ajoutez une balise à cette table. Dans l'exemple suivant, l'[TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)API ajoute la paire clé-valeur de balise `Title: ProductManager` au. `myMusicTable`

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

1. Créez une [politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) et ajoutez-la à un rôle auquel la politique [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

****  

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

------

   Cette politique autorise l’action `PutItem` sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

1. Assumez le rôle avec les politiques décrites à l’étape 3.

1. Utilisez l'[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)API pour placer un élément dans le`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. Analysez la table pour vérifier si l’élément y a été ajouté.

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

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

1. Créer une table. L'exemple suivant utilise l'[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)API pour créer une table nommée`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. Ajoutez une balise à cette table. Dans l'exemple suivant, l'[TagResource](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TagResource.html)API ajoute la paire clé-valeur de balise `Title: ProductManager` au. `myMusicTable`

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

1. Créez une [politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) et ajoutez-la à un rôle auquel la politique [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS gérée est attachée, comme indiqué dans l'exemple suivant.

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

****  

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

------

   Cette politique autorise l’action `PutItem` sur la table lorsque la clé de balise et la valeur associées à la table correspondent aux balises spécifiées dans la politique.

1. Assumez le rôle avec les politiques décrites à l’étape 3.

1. Utilisez l'[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)API pour placer un élément dans le`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. Analysez la table pour vérifier si l’élément y a été ajouté.

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

------

**Sans l’ABAC**  
Si ABAC n'est pas activé pour vous Compte AWS, les conditions de balise de la politique IAM et de la table DynamoDB ne correspondent pas. Par conséquent, l’action `PutItem` renvoie le code `AccessDeniedException` en raison de l’effet de la politique `AmazonDynamoDBReadOnlyAccess`.

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

**Avec l’ABAC**  
Si ABAC est activé pour vous Compte AWS, l'`put-item`action se termine correctement et ajoute un nouvel élément à votre tableau. Cela est dû au fait que la politique intégrée de la table autorise l’action `PutItem` si les conditions de balise de la politique IAM et de la table correspondent.

## Exemple 2 : Autoriser une action à l'aide de aws : RequestTag
<a name="abac-allow-example-request-tag"></a>

À l'aide de la [RequestTagclé de condition aws : /tag-key](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag), vous pouvez comparer la paire clé-valeur de balise transmise dans votre demande avec la paire de balises spécifiée dans la politique IAM. Vous pouvez autoriser une action spécifique, telle que `CreateTable`, en utilisant `aws:RequestTag` si les conditions de la balise ne correspondent pas. Effectuez les étapes suivantes pour ce faire :

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

1. Créez une [politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) et ajoutez-la à un rôle auquel la politique [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/ReadOnlyAccess.html) AWS gérée est attachée, comme indiqué dans l'exemple suivant.

------
#### [ 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. Créez une table contenant la paire clé-valeur de balise de `"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 pour Python (Boto3) ]

1. Créez une [politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) et ajoutez-la à un rôle auquel la politique [AmazonDynamoDBReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBReadOnlyAccess.html) AWS gérée est attachée, comme indiqué dans l'exemple suivant.

------
#### [ 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. Créez une table contenant la paire clé-valeur de balise de `"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'
           },
       ],
   )
   ```

------

**Sans l’ABAC**  
Si ABAC n'est pas activé pour vous Compte AWS, les conditions de balise de la politique intégrée et de la table DynamoDB ne correspondent pas. Par conséquent, la demande `CreateTable` échoue et votre table n’est pas créée.

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

**Avec l’ABAC**  
Si ABAC est activé pour vous Compte AWS, votre demande de création de table est terminée avec succès. Étant donné que la paire clé-valeur de la balise `"Owner": "John"` est présente dans la demande `CreateTable`, la politique en ligne permet à l’utilisateur `John` d’effectuer l’action `CreateTable`.

## Exemple 3 : Refuser une action à l'aide de aws : TagKeys
<a name="abac-deny-example-tag-key"></a>

À l'aide de la clé de TagKeys condition [aws :](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys), vous pouvez comparer les clés de balise d'une demande avec les clés spécifiées dans la politique IAM. Vous pouvez refuser une action spécifique, par exemple `CreateTable`, avec `aws:TagKeys` si une clé de balise spécifique *n’est pas* présente dans la demande. Effectuez les étapes suivantes pour ce faire :

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

1. Ajoutez une [politique gérée par le client](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) à un rôle auquel est attachée la politique AWS gérée d'[AmazonDynamoDBFullaccès](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html), comme indiqué dans l'exemple suivant.

------
#### [ 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. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de balise `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 pour Python (Boto3) ]

1. Ajoutez une [politique gérée par le client](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies) à un rôle auquel est attachée la politique AWS gérée d'[AmazonDynamoDBFullaccès](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonDynamoDBFullAccess.html), comme indiqué dans l'exemple suivant.

------
#### [ 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. Assumez le rôle auquel la politique était attachée et créez une table avec la clé de balise `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'
           },
       ],
   )
   ```

------

**Sans l’ABAC**  
Si ABAC n'est pas activé pour vous Compte AWS, DynamoDB n'envoie pas les clés de balise de la commande à `create-table` IAM. La condition `Null` garantit que la condition a la valeur `false` s’il n’y a pas de clés de balise dans la demande. Comme la politique `Deny` ne correspond pas, la commande `create-table` s’exécute correctement.

**Avec l’ABAC**  
Si ABAC est activé pour vous Compte AWS, les clés de balise transmises dans la `create-table` commande sont transmises à IAM. La clé de balise `Title` est évaluée par rapport à la clé de balise basée sur les conditions, `CostCenter`, présente dans la politique `Deny`. La clé de balise `Title` ne correspond pas à la clé de balise présente dans la politique `Deny` à cause de l’opérateur `StringNotEquals`. Par conséquent, l’action `CreateTable` échoue et votre table n’est pas créée. L’exécution de la commande `create-table` renvoie le message d’erreur `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.
```

# Résolution des erreurs courantes liées à l’ABAC pour les tables et les index DynamoDB
<a name="abac-troubleshooting"></a>

Cette rubrique fournit des conseils de résolution pour les erreurs et problèmes courants que vous pouvez rencontrer lorsque vous mettez en œuvre l’ABAC dans des tables ou des index DynamoDB.

## Les clés de condition spécifiques au service dans les politiques génèrent une erreur
<a name="abac-troubleshooting-service-specific-keys"></a>

Les clés de condition spécifiques au service ne sont pas considérées comme des clés de condition valides. Si vous avez utilisé ce type de clés dans vos politiques, cela provoquera une erreur. Pour résoudre ce problème, vous devez remplacer les clés de condition spécifiques au service par une [clé de condition appropriée pour mettre en œuvre l’ABAC](attribute-based-access-control.md#condition-keys-implement-abac) dans DynamoDB.

Supposons, par exemple, que vous ayez utilisé la clé de `dynamodb:ResourceTag` condition [dans une politique intégrée](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies) qui exécute la [PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)demande. Imaginez que la demande échoue avec le message d’erreur `AccessDeniedException`. L’exemple suivant montre la politique en ligne erronée avec la clé de condition `dynamodb:ResourceTag`.

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

****  

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

------

Pour résoudre ce problème, remplacez la clé de condition `dynamodb:ResourceTag` par `aws:ResourceTag`, comme indiqué dans l’exemple suivant.

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

****  

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

------

## Impossible de désactiver l’ABAC
<a name="abac-troubleshooting-unable-opt-out"></a>

Si ABAC a été activé pour votre compte via Support, vous ne pourrez pas désactiver ABAC via la console DynamoDB. Pour désactiver l’ABAC, contactez [Support](https://console.aws.amazon.com/support).

Vous ne pouvez désactiver vous-même l’ABAC *que si* les conditions suivantes sont réunies :
+ Vous avez utilisé la méthode en libre-service pour [l’activer via la console DynamoDB](abac-enable-ddb.md#abac-enable-console).
+ Vous le désactiver dans les sept jours civils suivant son activation.