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

Dernière mise à jour : 25/09/2020

J'essaie de décharger des données de mon cluster Amazon Redshift vers Amazon Simple Storage Service (Amazon S3). Toutefois, je reçois un message d'erreur. Comment résoudre ce problème ?

Brève description

Lorsque vous déchargez des données de votre cluster Amazon Redshift vers votre compartiment Amazon S3, vous pouvez rencontrer les erreurs suivantes :

L'utilisateur de la base de données n'est pas autorisé à endosser le rôle AWS Identity and Access Management (IAM)

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

403 Access Denied

[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,

Remarque : utilisez la commande UNLOAD avec l'instruction SELECT lorsque vous déchargez des données vers votre compartiment S3. Déchargez les données textuelles sous un format délimité ou à largeur fixe (quel que soit le format de données utilisé lors du chargement). Vous pouvez également spécifier si un fichier Gzip compressé doit être déposé.

Résolution

L'utilisateur de la base de données n'est pas autorisé à endosser le rôle IAM AWS

Si l'utilisateur de la base de données n'est pas autorisé à endosser le rôle IAM, vérifiez les points suivants :

403 Access Denied

Si vous recevez une erreur 403 Access Denied de votre compartiment S3, vérifiez que les autorisations appropriées sont accordées pour vos opérations d'API S3 :

  "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 par S3, votre compartiment S3 chiffre chacun de ses objets avec une clé unique. À titre de protection supplémentaire, la clé elle-même est également chiffrée à l'aide d'une clé principale qui est changée régulièrement. 

Pour chiffrer les données déchargées au repos, vérifiez que le paramètre s3:x-amz-server-side-encryption de votre stratégie de compartiment S3 est défini sur « true » :

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

Vérifiez si KMS_KEY_ID est bien chiffré afin que vous puissiez décharger les données chiffrées vers 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;

Si votre compartiment S3 est chiffré avec une clé principale d'AWS Key Management Service (AWS KMS), ajoutez les autorisations suivantes à votre stratégie IAM :

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