Passer au contenu

Comment résoudre les problèmes liés à la commande UNLOAD dans Amazon Redshift ?

Lecture de 6 minute(s)
0

Je souhaite utiliser la commande UNLOAD pour décharger les données de mon cluster Amazon Redshift vers Amazon Simple Storage Service (Amazon S3). Cependant, je reçois un message d'erreur.

Brève description

Lorsque vous exécutez la commande UNLOAD, un message d'erreur similaire à l'un des messages suivants peut s’afficher :

  • « error: User arn:aws:redshift:us-west-2:account-id:dbuser:cluster-identifier/dbuser username is not authorized to assume IAM Role arn:aws:iam::account-id:role/Role name » (erreur : L'utilisateur arn:aws:redshift:us-west-2:account-id:dbuser:cluster-identifier/dbuser username n'est pas autorisé à endosser le rôle IAM arn:aws:iam::account-id:role/Role)
  • « [Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied, » ([Amazon](500310) Opération non valide : S3ServiceException:Accès refusé,Statut 403,Erreur AccessDenied)
  • « ERROR: Specified unload destination on S3 is not empty. Consider using a different bucket / prefix, manually removing the target files in S3, or using the ALLOWOVERWRITE option. » (ERREUR : La destination de déchargement spécifiée sur S3 n'est pas vide. Envisagez d'utiliser un autre compartiment / préfixe, de supprimer manuellement les fichiers cible dans S3 ou d'utiliser l'option ALLOWOVERWRITE)

Pour résoudre le problème, effectuez l'une des actions suivantes en fonction du message d'erreur reçu :

  • Autorisez la base de données à endosser le rôle AWS Identity and Access Management (IAM).
  • Accordez à vos opérations Amazon S3 les autorisations appropriées.
  • Supprimez ou remplacez les objets du compartiment de destination. Modifiez le préfixe de clé S3. Vous pouvez également utiliser un autre compartiment.

Résolution

Autoriser la base de données à endosser le rôle IAM

Pour résoudre ce problème, associez le rôle IAM à votre cluster Amazon Redshift. Lorsque vous incluez le rôle IAM dans la commande UNLOAD, vérifiez l’absence d'espaces de fin. Assurez-vous également que vous utilisez la relation d’approbation appropriée pour le rôle IAM que vous attribuez au cluster Amazon Redshift.

Accorder à vos opérations Amazon S3 les autorisations appropriées

Si vous recevez un message d'erreur 403 Accès refusé en provenance de votre compartiment S3, accordez les autorisations appropriées à vos opérations d'API S3.

Exemple de politique :

{
"Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",       
        "s3:List*",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::your_bucket",
        "arn:aws:s3:::your_bucket/*"
      ]
    }
  ]
}

Si vous utilisez le chiffrement côté serveur avec des clés de chiffrement gérées Amazon S3 (SSE-S3), votre compartiment S3 chiffre chaque objet avec une clé unique.

Pour chiffrer les données déchargées au repos, exécutez la commande suivante pour définir le paramètre s3:x-amz-server-side-encryption de votre politique de compartiment S3 sur vrai :

"Condition": {   "Null": {
           "s3:x-amz-server-side-encryption": "true"
           }

Exécutez la commande suivante pour confirmer que vous avez chiffré KMS_KEY_ID afin de pouvoir décharger les données chiffrées dans votre compartiment S3 :

unload ('select * from a') to 's3://mybucket/test/varchar/' iam_role 'arn:aws:iam::xxxxxx:role/RedshiftS3Access' ALLOWOVERWRITE CSV
KMS_KEY_ID '11111111111111111111111111'
encrypted;

Pour les compartiments S3 que vous avez chiffrés avec une clé racine AWS Key Management Service (AWS KMS), ajoutez les autorisations de politique IAM suivantes :

"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]

Résoudre les problèmes liés au compartiment

Lorsque vous essayez de décharger des fichiers dans un dossier portant le même nom de fichier, vous recevez un message d'erreur.

Pour résoudre ce problème, prenez l'une des mesures suivantes :

  • Créez un nouveau compartiment S3 ou utilisez un autre compartiment S3.
  • Modifiez le préfixe de clé S3.
  • Supprimez les fichiers qui se trouvent dans le compartiment S3 de destination.
  • Incluez l'option ALLOWOVERWRITE dans la commande UNLOAD.

Créer un nouveau compartiment S3 ou utiliser un autre compartiment S3

  1. Créez un nouveau compartiment S3 ou choisissez un autre compartiment S3.
  2. Mettez à jour la politique de compartiment du nouveau compartiment S3 ou d'un autre compartiment S3 pour inclure les autorisations suivantes :
{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket2/*",  --> Additional permission for new bucket
                "arn:aws:s3:::testbucket2"       
            ]
        }
    ]
}

3. Utilisez le nouveau chemin du compartiment dans la commande UNLOAD.
Exemple de commande :

unload ('select * from test_unload')   
to 's3://testbucket2/unload/test_unload_file1'
iam_role 'arn:aws:iam::0123456789:role/redshift_role';

Modifier le préfixe de clé S3

Lorsque vous exécutez la commande UNLOAD, modifiez le préfixe de clé du compartiment S3 dans le chemin S3.

Exemple de commande qui inclut unload2 comme préfixe modifié :

unload ('select * from test_unload')   
to 's3://testbucket/unload2/test_unload_file1'
iam_role 'arn:aws:iam::0123456789:role/redshift_role';

Pour plus d'informations, consultez la section Organisation des objets à l'aide de préfixes.

Supprimer les fichiers qui se trouvent dans le compartiment S3 de destination

Important : Lorsque vous utilisez l'option CLEANPATH pour supprimer des fichiers, vous les supprimez définitivement et vous ne pouvez pas les récupérer. De même, si vous spécifiez l'option ALLOWOVERWRITE, vous ne pouvez pas spécifier l'option CLEANPATH.

Pour utiliser l'option CLEANPATH, vous devez disposer de l'autorisation s3:DeleteObject sur le compartiment S3.

Exemple de politique d'autorisations :

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:DeleteObject"  --> Additional Action added for delete object
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

Pour supprimer les fichiers existants uniquement des dossiers de partition, incluez PARTITION BY.

Exemple de commande UNLOAD qui inclut CLEANPATH et PARTITION BY :

unload ('select * from test_unload')  
to 's3://testbucket/unload/test_unload_file1
iam_role 'arn:aws:iam::0123456789:role/redshift_role'
partition by (col1,col2) include
CLEANPATH;

Remarque : Si vous ne souhaitez pas supprimer les colonnes de partition des fichiers déchargés, spécifiez PARTITION BY à l'aide de l'option INCLUDE.

Utilisez l'option ALLOWOVERWRITE

Si la commande UNLOAD détecte des fichiers susceptibles d'être remplacés, l'opération de déchargement échoue. Lorsque vous incluez ALLOVERWRITE dans la commande, UNLOAD remplace les fichiers existants, y compris le fichier manifeste.

Pour utiliser l'option ALLOWOVERWRITE, vous devez disposer de l'autorisation s3:PutObject sur le compartiment S3.

Exemple de politique d'autorisations :

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:PutObject"  --> Additional Action added for overwriting objects
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

Exemple de commande UNLOAD qui inclut l'option ALLOWOVERWRITE :

unload ('select * from test_unload')   
to 's3://testbucket/unload/test_unload_file1
iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite;

Informations connexes

Autoriser Amazon Redshift à accéder aux services AWS en votre nom

Comment empêcher le chargement d'objets non chiffrés vers Amazon S3

Les requêtes semblent se bloquer et ne parviennent parfois pas à atteindre le cluster

Déchargement de fichiers de données chiffrés

Politiques et autorisations dans Amazon S3

AWS OFFICIELA mis à jour il y a 8 mois