Comment résoudre les erreurs de refus d'accès à l'aide de Redshift Spectrum avec des compartiments Amazon S3 sur le même compte qu'Amazon Redshift ?

Dernière mise à jour : 17/11/2022

Je souhaite accéder aux données stockées dans les compartiments Amazon Simple Storage Service (Amazon S3) au sein du même compte que mon cluster Amazon Redshift. Je souhaite également accéder aux données en utilisant Amazon Redshift Spectrum avec AWS Glue comme catalogue de données. Mais je reçois des notifications d'erreurs d'autorisation.

Brève description

Le rôle AWS Identity and Access Management (IAM) associé au cluster Redshift doit disposer d'autorisations sur les services AWS Glue et S3. Si le rôle IAM ne dispose pas des autorisations appropriées, vous risquez de recevoir l'une des erreurs suivantes :

Lors de la création d'un schéma externe :

SQL Error [XX000]: ERROR: 
  User: arn:aws:sts::111111111111:assumed-role/KCARole/RedshiftIamRoleSession is not authorized to perform: glue:CreateDatabase on resource: arn:aws:glue:eu-west-1:111111111111:catalog because no identity-based policy allows the glue:CreateDatabase action

Lorsque vous essayez d'interroger une table Redshift Spectrum :

SQL Error [XX000]: ERROR: Spectrum Scan Error
  Detail: 
  -----------------------------------------------
  error:  Spectrum Scan Error
  code:      15007
  context:   Forbidden: HTTP response error code: 403 Message: AccessDenied Access Denied

Lorsque vous essayez d'interroger une table Redshift Spectrum alors que le compartiment S3 utilise une clé de chiffrement AWS KMS (Key Management Services) :

SQL Error [XX000]: ERROR: Spectrum Scan Error
  Detail: 
  -----------------------------------------------
  error:  Spectrum Scan Error
  code:      15007
  context:   Forbidden: HTTP response error code: 403 Message: AccessDenied The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access

Pour résoudre ces erreurs, vous devez associer une politique IAM avec les autorisations requises au rôle IAM utilisé par Amazon Redshift. Si le compartiment S3 est chiffré à l'aide d'une clé KMS, vous devez également associer des autorisations pour utiliser la clé.

Résolution

Associez la politique gérée par AWS AWSGlueConsoleFullAccess au rôle IAM associé au cluster Redshift.

Créez une politique IAM à l'aide de l'exemple suivant et associez la politique au rôle IAM associé au cluster Redshift. Cela permet d'accéder en lecture au compartiment S3 dans lequel les données sont stockées :

Remarque : remplacez le nom du compartiment par le nom de votre compartiment S3.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allows Redshift to Read S3 bucket specified",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::<bucket name>/*",
        "arn:aws:s3:::<bucket name>"
      ]
    }
  ]
}

Si le compartiment S3 utilisé par Redshift Spectrum est chiffré à l'aide d'une clé de chiffrement AWS KMS, créez et attachez la politique IAM suivante. Associez la politique au rôle IAM associé au cluster Redshift. Cette politique fournit un accès permettant à Redshift Spectrum de déchiffrer les données cryptées dans Amazon S3. Voici un exemple des autorisations minimales pour autoriser le déchiffrement :

Remarque : remplacez region (région) par la région AWS dans laquelle se trouve votre compartiment S3, remplacez AWS account ID (ID de compte AWS) par votre identifiant de compte et remplacez l'identifiant KMS key ID (ID de clé KMS) par la clé de cryptage KMS.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow Redshift to use the KMS key",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey"
      ],
      "Resource": [
        "arn:aws:kms:<region>:<AWS account ID>:key/<KMS key ID>"
      ]
    }
  ]
}

Cet article vous a-t-il été utile?


Besoin d'aide pour une question technique ou de facturation ?