Como resolvo erros de acesso negado usando o Redshift Spectrum com buckets do Amazon S3 na mesma conta do Amazon Redshift?

3 minuto de leitura
0

Quero acessar dados armazenados em buckets do Amazon Simple Storage Service (Amazon S3) na mesma conta que o meu cluster do Amazon Redshift. Também quero acessar os dados usando o Amazon Redshift Spectrum com o AWS Glue como meu catálogo de dados. Mas recebo erros de permissão.

Breve descrição

O perfil do AWS Identity and Access Management (IAM) anexado ao cluster do Redshift deve ter permissões nos serviços AWS Glue e S3. Se o perfil do IAM não tiver as permissões corretas, você poderá receber qualquer um dos seguintes erros:

Ao criar um 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

Ao tentar consultar uma tabela do 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

Ao tentar consultar uma tabela do Redshift Spectrum e o bucket do S3 está usando uma chave de criptografia do 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

Para resolver esses erros, você deve anexar uma política do IAM com as permissões necessárias ao perfil do IAM usado pelo Amazon Redshift. Se o bucket do S3 for criptografado usando uma chave do KMS, você também deverá anexar permissões para usar a chave.

Resolução

Anexe a política gerenciada pela AWS AWSGlueConsoleFullAccess ao perfil do IAM anexado ao cluster do Redshift.

Crie uma política do IAM usando o exemplo a seguir e anexe-a ao perfil do IAM anexado ao cluster do Redshift. Isso permite acesso de leitura ao bucket do S3 em que os dados estão armazenados:

Observação: substitua o nome do bucket pelo nome do seu bucket do 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 o bucket do S3 que o Redshift Spectrum está usando estiver criptografado usando uma chave de criptografia do AWS KMS, crie e anexe a seguinte política do IAM. Anexe a política ao perfil do IAM anexado ao cluster do Redshift. Essa política fornece acesso para que o Redshift Spectrum possa descriptografar os dados criptografados no Amazon S3. Veja a seguir um exemplo das permissões mínimas para permitir a descriptografia:

Observação: substitua a região pela região da AWS em que seu bucket do S3 está localizado, substitua o ID da conta da AWS pelo ID da sua conta e substitua o ID da chave do KMS pela chave de criptografia do 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>"
      ]
    }
  ]
}

Informações relacionadas

Como posso criar um acesso entre contas do Amazon Redshift Spectrum para o AWS Glue e o Amazon S3?

Políticas do IAM para o Amazon Redshift Spectrum

AWS OFICIAL
AWS OFICIALAtualizada há um ano