Comment puis-je importer ou transférer des données entre Amazon Redshift et un compartiment Amazon S3 d'un autre compte à l'aide des commandes COPY et UNLOAD ?

Lecture de 6 minute(s)
0

J'essaie d'importer ou de transférer des données entre Amazon Redshift et un compartiment Amazon Simple Storage Service (Amazon S3) d'un autre compte à l'aide des commandes COPY et UNLOAD. mais je ne parviens pas à endosser le rôle AWS Identity and Access Management (IAM) sur l'autre compte. Comment faut-il configurer l'accès de compte à compte ?

Brève description

Pour accéder aux ressources Amazon S3 qui se trouvent sur un compte différent de celui sur lequel Amazon Redshift est utilisé, procédez comme suit : Ces étapes s'appliquent à la fois à Redshift Serverless et à l'entrepôt de données provisionné Redshift :

1.    Créez le rôle IAM RoleA sur le compte Amazon S3.

2.    Créez le rôle IAM RoleB sur le compte Amazon Redshift qui dispose des autorisations nécessaires pour endosser le RoleA.

3.    Testez l'accès de compte à compte entre RoleA et RoleB.

Remarque : ces étapes fonctionnent, quel que soit le format de vos données. Toutefois, certaines modifications peuvent être apportées à la syntaxe des commandes COPY et UNLOAD lors de ces opérations. Par exemple, si vous utilisez le format de données Parquet, votre syntaxe se présente comme suit :

copy table_name from 's3://awsexamplebucket/crosscopy1.csv' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA format as parquet;

Solution

Remarque : les étapes suivantes supposent que le cluster Amazon Redshift et le compartiment S3 se trouvent dans la même région. S'ils se trouvent dans des régions différentes, vous devez ajouter le paramètre REGION à la commande COPY ou UNLOAD.

Créer un rôle IAM sur le compte qui utilise Amazon S3 (RoleA)

1.    Ouvrez la console IAM.

2.    Sélectionnez Stratégies, puis Créer une stratégie.

3.    Sélectionnez l'onglet JSON, puis saisissez une politique IAM similaire à celle-ci :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:Encrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "<KMS_KEY_ARN_A_Used_for_S3_encryption>"
      ]
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::awsexamplebucket",
        "arn:aws:s3:::awsexamplebucket/*"
      ]
    }
  ]
}

Remplacez awsexamplebucket par le nom du compartiment S3 auquel vous souhaitez accéder. Remplacez également KMS_KEY_ARN_A_Used_for_S3_encryption par l'Amazon Resource Name (ARN) de l'AWS Key Management Service (AWS KMS) utilisé pour chiffrer le compartiment S3.

Remarque : il n'est pas nécessaire de disposer d'une autorisation AWS KMS si le compartiment S3 n'est pas chiffré avec une clé AWS KMS.

4.    Choisissez Examiner une politique.

5.    Saisissez un nom pour la stratégie (par exemple : policy_for_roleA), puis sélectionnez Créer une stratégie.

6.    Dans le volet de navigation, sélectionnez Rôles.

7.    Sélectionnez Créer un rôle.

8.    Sélectionnez Autre compte AWS pour le rôle d'entité de confiance.

9.    Saisissez l'ID de compte AWS du compte qui utilise Amazon Redshift (RoleB).

10.    Sélectionnez Suivant : Autorisations, puis cliquez sur la stratégie que vous venez de créer (policy_for_roleA).

11.    Sélectionnez Suivant : Balises, puis Suivant : Vérification. Notez que les balises ne sont pas obligatoires.

12.    Saisissez un nom de rôle (par exemple : RoleA).

13.    Sélectionnez Créer un rôle.

Créez un rôle IAM (RoleB) sur le compte Amazon Redshift qui dispose des autorisations nécessaires pour endosser le RoleA.

1.    Ouvrez la console IAM.

2.    Sélectionnez Stratégies, puis Créer une stratégie.

3.    Sélectionnez l'onglet JSON, puis saisissez une politique IAM similaire à celle-ci :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CrossAccountPolicy",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "AmazonS3AccountRoleARN"
    }
  ]
}

Remplacez AmazonS3AccountRoleARN par l'ARN du RoleA (arn:aws:iam::Amazon_S3_Account_ID:role/RoleA).

4.    Choisissez Examiner une politique.

5.    Saisissez un nom pour la stratégie (par exemple : policy_for_roleB), puis sélectionnezCréer une stratégie.

6.    Dans le volet de navigation, sélectionnez Rôles.

7.    Sélectionnez Créer un rôle.

8.    Sélectionnez Service AWS comme type d'entité de confiance.

9.    Sélectionnez Redshift.

10.    Sélectionnez Redshift - Customizable.

11.    Sélectionnez Suivant : Autorisations, puis sélectionnez la stratégie que vous venez de créer (policy_for_roleB).

12.    Sélectionnez Suivant : Balises, puis Suivant : Vérification. Notez que les balises ne sont pas obligatoires.

13.    Saisissez un nom de rôle (par exemple : RoleB).

14.    Sélectionnez Créer un rôle.

15.    Associez le rôle IAM (RoleB) à votre cluster Amazon Redshift :

        Pour un cluster Redshift provisionné, voir Associer le rôle IAM à votre cluster.

        -ou-

        Pour Redshift Serverless, consultez Attribution de rôles IAM à un espace de nommage dans Sécurité et connexions dans Amazon Redshift Serverless.

Remarque : en créant des chaînes de rôles IAM dans Amazon Redshift, le cluster Amazon Redshift endosse le RoleB, qui assume ensuite à son tour le RoleA. Ce chaînage des rôles donne à Amazon Redshift l'accès à Amazon S3.

Testez l'accès de compte à compte entre votre compartiment S3 et Amazon Redshift.

Exécutez la commande COPY pour importer des données depuis votre compartiment S3 vers Amazon Redshift :

copy table_name from 's3://awsexamplebucket/crosscopy1.csv' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' delimiter ',' removequotes;

Remplacez les valeurs suivantes données dans l'exemple ci-dessus :

table_name : la table Amazon Redshift dans laquelle vous souhaitez copier les données Amazon S3
s3://awsexamplebucket/crosscopy1.csv : le compartiment S3 dont vous souhaitez copier les données
Amazon_Redshift_Account_ID : l'ID de compte AWS du compte Amazon Redshift
RoleB : le deuxième rôle que vous avez créé
Amazon_S3_Account_ID : l'ID de compte AWS du compte Amazon S3
RoleA : le premier rôle que vous avez créé

Exécutez ensuite la commande UNLOAD pour décharger les données d'Amazon Redshift dans votre compartiment S3, en vérifiant l'accès de compte à compte :

unload ('select * from table_name') to 's3://awsexamplebucket/folder/table_name_' iam_role 'arn:aws:iam::Amazon_Redshift_Account_ID:role/RoleB,arn:aws:iam::Amazon_S3_Account_ID:role/RoleA' KMS_KEY_ID 'ARN_KMS_KEY_ID' ENCRYPTED;

Remplacez les valeurs suivantes données dans l'exemple ci-dessus :

table_name : le tableau Amazon Redshift que vous souhaitez décharger dans le compartiment S3
s3://awsexamplebucket/folder/test.dat : le chemin d'accès S3 où vous souhaitez décharger les données Amazon Redshift
Amazon_Redshift_Account_ID : l'ID de compte AWS du compte Amazon Redshift
RoleB : le deuxième rôle que vous avez créé
Amazon_S3_Account_ID : l'ID de compte AWS du compte Amazon S3
RoleA : le premier rôle que vous avez créé
ARN_KMS_KEY_ID : l'ARN de l'ID de clé KMS utilisé pour chiffrer le compartiment S3


Informations connexes

Comment puis-je accorder un accès entre comptes à des objets dans les compartiments Amazon S3 ?

Comment copier des objets S3 depuis un autre compte AWS ?

Autorisations IAM pour les commandes COPY, UNLOAD et CREATE LIBRARY

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an