

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.

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