Come posso risolvere gli errori di accesso negato utilizzando Redshift Spectrum con i bucket Amazon S3 nello stesso account di Amazon Redshift?

Ultimo aggiornamento: 17/11/2022

Desidero accedere ai dati archiviati nei bucket Amazon Simple Storage Service (Amazon S3) all'interno dello stesso account del mio cluster Amazon Redshift. Desidero inoltre accedere ai dati utilizzando Amazon Redshift Spectrum con AWS Glue come catalogo dati. Tuttavia, ricevo errori di autorizzazione.

Breve descrizione

Il ruolo AWS Identity and Access Management (IAM) associato al cluster Redshift deve disporre delle autorizzazioni sui servizi AWS Glue ed S3. Se il ruolo IAM non dispone delle autorizzazioni corrette, potresti ricevere uno dei seguenti errori:

Quando si crea uno schema esterno:

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

Quando si tenta di eseguire una query su una tabella 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

Quando si tenta di eseguire una query su una tabella Redshift Spectrum e il bucket S3 utilizza una chiave di crittografia Key Management Services (AWS KMS):

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

Per risolvere questi errori, è necessario allegare una policy IAM con le autorizzazioni necessarie al ruolo IAM utilizzato da Amazon Redshift. Se il bucket S3 è crittografato utilizzando una chiave KMS, è necessario allegare anche le autorizzazioni per utilizzare la chiave.

Risoluzione

Allega la policy gestita da AWS AWSGlueConsolefullAccess al ruolo IAM collegato al cluster Redshift.

Crea una policy IAM utilizzando l'esempio seguente e allega la policy al ruolo IAM collegato al cluster Redshift. Ciò consente l'accesso in lettura al bucket S3 in cui sono archiviati i dati:

Nota: sostituisci il nome del bucket con il nome del tuo bucket 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>"
      ]
    }
  ]
}

Se il bucket S3 utilizzato da Redshift Spectrum è crittografato utilizzando una chiave di crittografia AWS KMS, crea e allega la seguente policy IAM. Allega la policy al ruolo IAM associato al cluster Redshift. Questa policy fornisce l'accesso in modo che Redshift Spectrum possa decrittografare i dati crittografati in Amazon S3. Di seguito è riportato un esempio delle autorizzazioni minime per consentire la decrittografia:

Nota: sostituisci regione con la Regione AWS in cui si trova il bucket S3, sostituisci ID dell'account AWS con l'ID del tuo account e sostituisci ID della chiave KMS con la chiave di crittografia 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>"
      ]
    }
  ]
}