Como posso solucionar os problemas com o comando UNLOAD no Amazon Redshift?

6 minuto de leitura
0

Eu gostaria de utilizar o comando UNLOAD para extrair dados do meu cluster no Amazon Redshift para o Amazon Simple Storage Service (Amazon S3). Entretanto, eu recebo uma mensagem de erro.

Breve descrição

Ao executar o comando UNLOAD, você poderá receber uma mensagem de erro semelhante a uma das seguintes:

  • “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”
  • “[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,”
  • “ERROR: Specified unload destination on S3 is not empty. Consider using a different bucket / prefix, manually removing the target files in S3, or using the ALLOWOVERWRITE option.”

Para resolver o problema, execute uma das seguintes ações com base na mensagem de erro recebida:

  • Autorize o banco de dados a assumir o perfil do AWS Identity and Access Management (AWS IAM).
  • Conceda às suas operações do Amazon S3 as permissões adequadas.
  • Remova ou sobrescreva os objetos no bucket de destino. Altere o prefixo da chave S3. Ou utilize um bucket diferente.

Resolução

Dê autorização para banco de dados assumir o perfil do IAM

Para resolver esse problema, relacione o perfil do IAM com o cluster no Amazon Redshift. Ao incluir o perfil do IAM no comando UNLOAD, certifique-se de que não haja espaços em branco. Além disso, não se esqueça de utilizar a relação de confiança correta para o perfil do IAM, na qual você atribui ao cluster no Amazon Redshift.

Conceda às suas operações do Amazon S3 as permissões adequadas

Caso receba um erro de 403 Access Denied no bucket do S3, conceda às operações da API do S3 as permissões adequadas.

Exemplo de política:

{
"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/*"
      ]
    }
  ]
}

Caso estiver utilizando criptografia do lado do servidor, com chaves de criptografia gerenciadas do Amazon S3 (SSE-S3), seu bucket do S3 criptografará cada objeto com uma chave única.

Para criptografar os dados extraídos em repouso, execute o seguinte comando para definir o parâmetro s3:x-amz-server-side-encryption em sua política de bucket do S3 como true:

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

Execute o comando a seguir para confirmar se você criptografou KMS\ _KEY\ _ID, assim você poderá extrair os dados criptografados para o bucket do 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;

Para buckets S3 que você criptografou com uma chave-raiz do AWS Key Management Service (AWS KMS), adicione as seguintes permissões de política do IAM:

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

Resolver problemas de bucket

Quando estiver tentando extrair arquivos em uma pasta onde o mesmo nome de arquivo já existe, você receberá uma mensagem de erro.

Para resolver esse erro, realize uma das ações a seguir:

  • Crie um novo bucket do S3 ou utilize um bucket do S3 diferente.
  • Altere o prefixo da chave S3.
  • Remova os arquivos que estão no bucket do S3 de destino.
  • Inclua a opção ALLOWOVERWRITE no comando UNLOAD.

Crie um novo bucket do S3 ou utilize um bucket do S3 diferente

  1. Crie um novo bucket do S3 ou escolha um bucket S3 diferente.
  2. Atualize a política de bucket do novo bucket do S3 ou de um diferente para incluir as seguintes permissões:
{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket2/*",  --> Additional permission for new bucket
                "arn:aws:s3:::testbucket2"       
            ]
        }
    ]
}

3. Utilize o novo caminho para o bucket a partir do comando UNLOAD.
Exemplo de comando:

unload ('select * from test_unload')   
to 's3://testbucket2/unload/test_unload_file1'
iam_role 'arn:aws:iam::0123456789:role/redshift_role';

Altere o prefixo da chave S3

Ao executar o comando UNLOAD, altere o prefixo da chave do bucket do S3 no caminho do S3.

Exemplo de comando que inclui unload2 como prefixo alterado:

unload ('select * from test_unload')   
to 's3://testbucket/unload2/test_unload_file1'
iam_role 'arn:aws:iam::0123456789:role/redshift_role';

Para mais informações, consulte Como organizar objetos utilizando prefixos.

Remova os arquivos que estão no bucket do S3 de destino

Importante: Ao utilizar a opção CLEANPATH para remover arquivos, você os exclui permanentemente e não será capaz de recuperá-los. Além disso, se você especificar a opção ALLOWOVERWRITE, você não poderá especificar a opção CLEANPATH.

Para utilizar a opção CLEANPATH, você precisará ter a permissão s3:DeleteObject no bucket do S3.

Exemplo de política de permissões:

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:DeleteObject"  --> Additional Action added for delete object
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

Para remover arquivos existentes apenas das pastas de partição, inclua PARTITION BY.

Exemplo de comando UNLOAD que inclui CLEANPATH e PARTITION BY:

unload ('select * from test_unload')  
to 's3://testbucket/unload/test_unload_file1
iam_role 'arn:aws:iam::0123456789:role/redshift_role'
partition by (col1,col2) include
CLEANPATH;

Observação: Caso não queira remover as colunas de partição dos arquivos extraídos, especifique PARTITION BY com a opção INCLUDE.

Utilize a opção ALLOWOVERWRITE

Caso o comando UNLOAD encontre arquivos que possam ser sobrescritos, a operação de extração falhará. Quando incluir ALLOWOVERWRITE no comando, UNLOAD irá sobrescrever os arquivos existentes, incluindo o arquivo de manifesto.

Para utilizar a opção ALLOWOVERWRITE, você precisará ter a permissão s3:PutObject no bucket do S3.

Exemplo de política de permissões:

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": [
        {
            "Sid": "ExampleStatement01",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::0123456789:user/<UserName>"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetBucketLocation",
                "s3:ListBucket",
                "s3:PutObject"  --> Additional Action added for overwriting objects
            ],
            "Resource": [
                "arn:aws:s3:::testbucket/*",
                "arn:aws:s3:::testbucket"
            ]
        }
    ]
}

Exemplo de comando UNLOAD que inclui a opção ALLOWOVERWRITE:

unload ('select * from test_unload')   
to 's3://testbucket/unload/test_unload_file1
iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite;

Informações relacionadas

Autorização ao Amazon Redshift para acessar os serviços da AWS em seu nome

Como evitar o upload de objetos não criptografados para o Amazon S3

As consultas parecem travar e, às vezes, não conseguem acessar o cluster

Extraindo arquivos de dados criptografados

Políticas e permissões no Amazon S3

AWS OFICIAL
AWS OFICIALAtualizada há 2 meses