¿Cómo resuelvo los errores de acceso denegado utilizando Redshift Spectrum con buckets de Amazon S3 en la misma cuenta que Amazon Redshift?

3 minutos de lectura
0

Quiero acceder a los datos almacenados en los buckets de Amazon Simple Storage Service (Amazon S3) dentro de la misma cuenta que mi clúster de Amazon Redshift. También quiero acceder a los datos usando Amazon Redshift Spectrum con AWS Glue como mi catálogo de datos. Sin embargo, aparecen errores de permisos.

Descripción breve

El rol de AWS Identity and Access Management (IAM) que se asocia al clúster de Redshift, debe tener permisos sobre los servicios de AWS Glue y S3. En caso de que el rol de IAM no tenga los permisos correctos, podría recibir alguno de los siguientes errores:

Al crear un esquema externo:

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

Al intentar consultar una tabla de 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

Al intentar consultar una tabla Redshift Spectrum y el bucket de S3 está utilizando una clave de cifrado de los servicios de administración de claves (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

Para resolver estos errores, debe asociar una política de IAM con los permisos necesarios al rol de IAM que utiliza Amazon Redshift. Si el bucket de S3 está cifrado mediante una clave KMS, también debe asociar permisos para utilizar la clave.

Resolución

Asocie la política administrada por AWS AWSGlueConsoleFullAccess al rol de IAM que está asociado al clúster de Redshift.

Cree una política de IAM utilizando el siguiente ejemplo y asocie la política al rol de IAM que está asociado al clúster de Redshift. Esto permite el acceso de lectura al bucket de S3 donde se almacenan los datos:

Nota: Sustituya el bucket name (nombre del bucket*)* por el nombre de su 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>"
      ]
    }
  ]
}

Si el bucket de S3 que utiliza Redshift Spectrum está cifrado mediante una clave de cifrado de AWS KMS, cree y asocie la siguiente política de IAM. Asocie la política al rol de IAM que está asociado al clúster de Redshift. Esta política proporciona acceso para que Redshift Spectrum pueda descifrar los datos cifrados en Amazon S3. A continuación se muestra un ejemplo de los permisos mínimos para permitir el descifrado:

Nota: Sustituya region (región) por la región de AWS en la que se encuentra su bucket de S3, sustituya AWS account ID (ID de cuenta de AWS) por el identificador de su cuenta y sustituya KMS key ID (ID de clave de KMS) por la clave de cifrado de 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>"
      ]
    }
  ]
}

Información relacionada

¿Cómo puedo crear un acceso entre cuentas de Amazon Redshift Spectrum a AWS Glue y Amazon S3?

Políticas de IAM para Amazon Redshift Spectrum

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año