

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.

# Copiez les tables Amazon DynamoDB entre les comptes à l'aide d'une implémentation personnalisée
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation"></a>

*Ramkumar Ramanujam, Amazon Web Services*

## Résumé
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-summary"></a>

Lorsque vous travaillez avec Amazon DynamoDB sur Amazon Web Services (AWS), un cas d'utilisation courant consiste à copier ou à synchroniser des tables DynamoDB dans des environnements de développement, de test ou de préparation avec les données des tables présentes dans l'environnement de production. En règle générale, chaque environnement utilise un compte AWS différent.

DynamoDB prend désormais en charge la sauvegarde entre comptes à l'aide d'AWS Backup. Pour plus d'informations sur les coûts de stockage associés à l'utilisation d'AWS Backup, consultez la [tarification d'AWS Backup](https://aws.amazon.com/backup/pricing/). Lorsque vous utilisez AWS Backup pour effectuer des copies entre comptes, les comptes source et cible doivent appartenir à une organisation AWS Organizations. Il existe d'autres solutions de sauvegarde et de restauration entre comptes à l'aide de services AWS tels qu'AWS Glue. L'utilisation de ces solutions augmente toutefois l'encombrement des applications, car il y a davantage de services AWS à déployer et à gérer. 

Vous pouvez également utiliser Amazon DynamoDB Streams pour capturer les modifications de table dans le compte source. Vous pouvez ensuite lancer une fonction AWS Lambda et apporter les modifications correspondantes dans la table cible du compte cible. Mais cette solution s'applique aux cas d'utilisation dans lesquels les tables source et cible doivent toujours être synchronisées. Cela peut ne pas s'appliquer aux environnements de développement, de test et de préparation dans lesquels les données sont fréquemment mises à jour.

Ce modèle fournit les étapes permettant de mettre en œuvre une solution personnalisée pour copier une table Amazon DynamoDB d'un compte à un autre. Ce modèle peut être implémenté à l'aide de langages de programmation courants tels que C\$1, Java et Python. Nous vous recommandons d'utiliser un langage pris en charge par un [kit SDK AWS](https://aws.amazon.com/tools/).

## Conditions préalables et limitations
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-prereqs"></a>

**Conditions préalables**
+ Deux comptes AWS actifs
+ Tables DynamoDB dans les deux comptes
+ Connaissance des rôles et des politiques d'AWS Identity and Access Management (IAM)
+ Connaissance de l'accès aux tables Amazon DynamoDB à l'aide de n'importe quel langage de programmation courant, tel que C\$1, Java ou Python

**Limites**

Ce modèle s'applique aux tables DynamoDB dont la taille est inférieure ou égale à 2 Go environ. Grâce à une logique supplémentaire permettant de gérer les interruptions de connexion ou de session, les ralentissements, les échecs et les nouvelles tentatives, il peut être utilisé pour des tables plus volumineuses.

L'opération d'analyse DynamoDB, qui lit les éléments de la table source, ne peut récupérer que 1 Mo de données en un seul appel. Pour les tables plus grandes, supérieures à 2 Go, cette limitation peut augmenter le temps total nécessaire pour effectuer une copie complète de la table.

## Architecture
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-architecture"></a>

Le schéma suivant montre l'implémentation personnalisée entre les comptes AWS source et cible. Les politiques IAM et les jetons de sécurité sont utilisés dans le cadre de l'implémentation personnalisée. Les données sont lues depuis Amazon DynamoDB dans le compte source et écrites dans DynamoDB dans le compte cible.

![\[Architecture du compte source et cible à copier à l'aide de l'implémentation personnalisée.\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/ba8175be-9809-4c2e-b2d1-6b9180ed056c/images/d9d4c2c8-ff04-443f-9137-e37b8e23ccb5.png)


 

**Automatisation et mise à l'échelle**

Ce modèle s'applique aux tables DynamoDB dont la taille est plus petite, environ 2 Go. 

Pour appliquer ce modèle à des tables de plus grande taille, vous devez résoudre les problèmes suivants :
+ Pendant l'opération de copie de table, deux sessions actives sont maintenues à l'aide de jetons de sécurité différents. Si l'opération de copie de table prend plus de temps que les délais d'expiration des jetons, vous devez mettre en place une logique pour actualiser les jetons de sécurité. 
+ Si un nombre suffisant d'unités de capacité de lecture (RCUs) et d'unités de capacité d'écriture (WCUs) ne sont pas provisionnées, les lectures ou les écritures sur la table source ou cible peuvent être limitées. Assurez-vous de détecter et de gérer ces exceptions. 
+ Gérez tout autre échec ou exception et mettez en place un mécanisme de nouvelle tentative pour réessayer ou continuer à partir de l'endroit où l'opération de copie a échoué.

## Outils
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-tools"></a>

**Outils**
+ [Amazon DynamoDB — Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) DynamoDB est un service de base de données NoSQL entièrement géré qui fournit des performances rapides et prévisibles ainsi qu'une évolutivité sans faille. 
+ Les outils supplémentaires requis varient en fonction du langage de programmation que vous choisissez pour l'implémentation. Par exemple, si vous utilisez C\$1, vous aurez besoin de Microsoft Visual Studio et des NuGet packages suivants :
  + `AWSSDK`
  + `AWSSDK.DynamoDBv2`

**Code**

L'extrait de code Python suivant supprime et recrée une table DynamoDB à l'aide de la bibliothèque Boto3.

N'utilisez pas le `AWS_ACCESS_KEY_ID` et `AWS_SECRET_ACCESS_KEY` d'un utilisateur IAM car il s'agit d'informations d'identification à long terme, qui doivent être évitées pour l'accès programmatique aux services AWS. Pour plus d'informations sur les informations d'identification temporaires, consultez la section *Bonnes pratiques*.

Les `AWS_ACCESS_KEY_ID` et `TEMPORARY_SESSION_TOKEN` utilisés dans l'extrait de code suivant sont des informations d'identification temporaires extraites d'AWS Security Token Service (AWS STS). `AWS_SECRET_ACCESS_KEY`

```
import boto3
import sys
import json

#args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ...

#Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION
#[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}]

#Input param: ATTRIBUTES_JSON_COLLECTION
#[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}]

region = args['TARGET_REGION']
target_ddb_name = args['TARGET_DYNAMODB_NAME']

global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION'])
attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION'])

# Drop and create target DynamoDB table
dynamodb_client = boto3.Session(
        aws_access_key_id=args['AWS_ACCESS_KEY_ID'],
        aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'],
        aws_session_token=args['TEMPORARY_SESSION_TOKEN'],
    ).client('dynamodb')
    
# Delete table
print('Deleting table: ' + target_ddb_name + ' ...')

try:
    dynamodb_client.delete_table(TableName=target_ddb_name)

    #Wait for table deletion to complete
    waiter = dynamodb_client.get_waiter('table_not_exists')
    waiter.wait(TableName=target_ddb_name)
    print('Table deleted.')
except dynamodb_client.exceptions.ResourceNotFoundException:
    print('Table already deleted / does not exist.')
    pass

print('Creating table: ' + target_ddb_name + ' ...')

table = dynamodb_client.create_table(
    TableName=target_ddb_name,
    KeySchema=[
        {
            'AttributeName': 'PK',
            'KeyType': 'HASH'  # Partition key
        },
        {
            'AttributeName': 'SK',
            'KeyType': 'RANGE'  # Sort key
        }
    ],
    AttributeDefinitions=attribute_definitions,
    GlobalSecondaryIndexes=global_secondary_indexes,
    BillingMode='PAY_PER_REQUEST'
)
    
waiter = dynamodb_client.get_waiter('table_exists')
waiter.wait(TableName=target_ddb_name)
    
print('Table created.')
```

## Bonnes pratiques
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-best-practices"></a>

**Informations d’identification temporaires**

Pour des raisons de sécurité, lorsque vous accédez aux services AWS par programmation, évitez d'utiliser le `AWS_ACCESS_KEY_ID` et d'un utilisateur IAM, car il s'agit `AWS_SECRET_ACCESS_KEY` d'informations d'identification à long terme. Essayez toujours d'utiliser des informations d'identification temporaires pour accéder aux services AWS par programmation.

Par exemple, un développeur code en dur le code `AWS_ACCESS_KEY_ID` et `AWS_SECRET_ACCESS_KEY` d'un utilisateur IAM dans l'application pendant le développement, mais ne supprime pas les valeurs codées en dur avant de transférer les modifications au référentiel de code. Ces informations d'identification exposées peuvent être utilisées par des utilisateurs involontaires ou malveillants, ce qui peut avoir de graves conséquences (en particulier si les informations d'identification exposées ont des privilèges d'administrateur). Ces informations d'identification exposées doivent être désactivées ou supprimées immédiatement à l'aide de la console IAM ou de l'AWS Command Line Interface (AWS CLI).

Pour obtenir des informations d'identification temporaires pour un accès programmatique aux services AWS, utilisez AWS STS. Les informations d'identification temporaires ne sont valides que pour la durée spécifiée (de 15 minutes à 36 heures). La durée maximale autorisée des informations d'identification temporaires varie en fonction de facteurs tels que les paramètres des rôles et le chaînage des rôles. Pour plus d'informations sur AWS STS, consultez la [documentation](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html).

## Épopées
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-epics"></a>

### Configuration des tables DynamoDB
<a name="set-up-dynamodb-tables"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez des tables DynamoDB. | Créez des tables DynamoDB, avec des index, dans les comptes AWS source et cible.Définissez le provisionnement des capacités en mode à la demande, ce qui permet à DynamoDB de read/write dimensionner les capacités de manière dynamique en fonction de la charge de travail. Vous pouvez également utiliser une capacité provisionnée de 4 000 RCUs et 4 000 WCUs. | Développeur d'applications, DBA, ingénieur en migration | 
| Renseignez le tableau source. | Remplissez la table DynamoDB du compte source avec des données de test. Le fait de disposer d'au moins 50 Mo de données de test vous permet de connaître le pic et la RCUs consommation moyenne pendant la copie de la table. Vous pouvez ensuite modifier le provisionnement de capacité selon vos besoins. | Développeur d'applications, DBA, ingénieur en migration | 

### Configurer les informations d'identification pour accéder aux tables DynamoDB
<a name="set-up-credentials-to-access-the-dynamodb-tables"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez des rôles IAM pour accéder aux tables DynamoDB source et cible. | Créez un rôle IAM dans le compte source avec les autorisations nécessaires pour accéder (lire) à la table DynamoDB du compte source.Ajoutez le compte source en tant qu'entité de confiance pour ce rôle.Créez un rôle IAM dans le compte cible avec des autorisations d'accès (création, lecture, mise à jour, suppression) à la table DynamoDB du compte cible.  Ajoutez le compte cible en tant qu'entité de confiance pour ce rôle. | Développeur d'applications, AWS DevOps | 

### Copier les données d'une table d'un compte à un autre
<a name="copy-table-data-from-one-account-to-another"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Obtenez des informations d'identification temporaires pour les rôles IAM. | Obtenez des informations d'identification temporaires pour le rôle IAM créé dans le compte source.Obtenez des informations d'identification temporaires pour le rôle IAM créé dans le compte cible.L'un des moyens d'obtenir les informations d'identification temporaires pour le rôle IAM consiste à utiliser AWS STS à partir de l'AWS CLI.<pre>aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name></pre>Utilisez le profil AWS approprié (correspondant au compte source ou cible).Pour plus d'informations sur les différentes manières d'obtenir des informations d'identification temporaires, consultez les rubriques suivantes :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html) | Développeur d'applications, ingénieur en migration | 
| Initialisez les clients DynamoDB pour accéder à DynamoDB source et cible. | Initialisez les clients DynamoDB, fournis par le SDK AWS, pour les tables DynamoDB source et cible.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)Pour plus d'informations sur l'envoi de demandes à l'aide d'informations d'identification temporaires IAM, consultez la [documentation AWS](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html). | Développeur d’applications | 
| Supprimez et recréez la table cible. | Supprimez et recréez la table DynamoDB cible (ainsi que les index) dans le compte cible, à l'aide du client DynamoDB du compte cible.La suppression de tous les enregistrements d'une table DynamoDB est une opération coûteuse car elle consomme des ressources provisionnées. WCUs La suppression et la recréation du tableau permettent d'éviter ces coûts supplémentaires.Vous pouvez ajouter des index à une table après l'avoir créée, mais cela prend 2 à 5 minutes de plus. La création d'index lors de la création d'une table, en transmettant la collection d'index à l'`createTable`appel, est plus efficace. | Développeur d’applications | 
| Effectuez la copie du tableau. | Répétez les étapes suivantes jusqu'à ce que toutes les données soient copiées :[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)Pour plus d'informations, consultez l'implémentation de référence en C\$1 (pour supprimer, créer et remplir des tables) dans la section *Pièces jointes*. Un exemple de fichier de configuration de table JavaScript Object Notation (JSON) est également joint. | Développeur d’applications | 

## Ressources connexes
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-resources"></a>
+ [Documentation Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
+ [Création d'un utilisateur IAM dans votre compte AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)
+ [AWS SDKs](https://aws.amazon.com/tools/)
+ [Utilisation d'informations d'identification temporaires avec les ressources AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)

## Informations supplémentaires
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-additional"></a>

Ce modèle a été implémenté à l'aide de C\$1 pour copier une table DynamoDB contenant 200 000 éléments (taille moyenne des éléments de 5 Ko et taille de table de 250 Mo). La table DynamoDB cible a été configurée avec une capacité provisionnée de 4 000 et 4 000. RCUs WCUs

L'opération complète de copie du tableau (du compte source vers le compte cible), y compris la suppression et la recréation du tableau, a pris 5 minutes. Capacité totale d'unités consommées : 30 000 RCUs et environ 400 000 WCUs.

Pour plus d'informations sur les modes de capacité DynamoDB, [consultez la section Mode de capacité de lecture/écriture dans la](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html) documentation AWS.

## Pièces jointes
<a name="attachments-ba8175be-9809-4c2e-b2d1-6b9180ed056c"></a>

[Pour accéder au contenu supplémentaire associé à ce document, décompressez le fichier suivant : attachment.zip](samples/p-attach/ba8175be-9809-4c2e-b2d1-6b9180ed056c/attachments/attachment.zip)