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

Date de la dernière mise à jour : 10/08/2020

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 autre compte depuis Amazon Redshift, procédez comme suit :

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.

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 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 stratégie 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 KMS si le compartiment S3 n'est pas chiffré avec une clé AWS KMS.

4.    Choisissez Review policy (Vérifier la stratégie).

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 du compte AWS du compte Amazon Redshift.

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. 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 stratégie IAM similaire à celle-ci :

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

Remplacez AmazonS3AccountPolicy par l'ARN de la stratégie que vous avez créée sur le compte S3.

4.    Choisissez Review policy (Vérifier la stratégie).

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

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 :

Amazon_S3_Account_ID : l'ID de compte AWS du compte Amazon S3
RoleA : le premier rôle que vous avez créé

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 S3
s3://awsbucket/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éé

unload ('select * from table_name') to 's3://awsexamplebucket/folder/test.dat' 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 : la table 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

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 S3
s3://awsbucket/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éé