¿Cómo soluciono los problemas con el comando UNLOAD en Amazon Redshift?

6 minutos de lectura
0

Quiero usar el comando UNLOAD para descargar datos de mi clúster de Amazon Redshift a Amazon Simple Storage Service (Amazon S3). Sin embargo, recibo un mensaje de error.

Descripción breve

Al ejecutar el comando UNLOAD, es posible que recibas un mensaje de error similar a uno de los siguientes:

  • “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” (error: el nombre de usuario arn:aws:redshift:us-west-2:account-id:dbuser:cluster-identifier/dbuser no está autorizado a asumir el rol de IAM arn:aws:iam::account-id:role/nombre del rol).
  • “[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied” ([Amazon](500310) Operación no válida: excepción del servicio S3: acceso denegado, estado 403, error de acceso denegado).
  • “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” (ERROR: El destino de descarga especificado en S3 no está vacío. Considera usar un bucket o prefijo diferente, eliminar manualmente los archivos de destino en S3 o usar la opción ALLOWOVERWRITE).

Para resolver el problema, realiza una de las siguientes acciones en función del mensaje de error que recibas:

  • Autoriza a la base de datos para que asuma el rol de AWS Identity and Access Management (IAM).
  • Concede los permisos adecuados a las operaciones de Amazon S3.
  • Elimina o sobrescribe los objetos del bucket de destino. Cambia el prefijo de la clave de S3. O bien, usa un bucket diferente.

Resolución

Autorización de la base de datos para que asuma el rol de IAM

Para resolver este problema, asocia el rol de IAM a tu clúster de Amazon Redshift. Al incluir el rol de IAM en el comando UNLOAD, asegúrate de que no haya espacios finales. Además, asegúrate de utilizar la relación de confianza correcta para el rol de IAM que asignes al clúster de Amazon Redshift.

Concesión de los permisos adecuados a las operaciones de Amazon S3

Si recibes un error 403 Access Denied en tu bucket de S3, concede los permisos adecuados a tus operaciones de la API de S3.

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

Si utilizas el cifrado del lado del servidor con claves de cifrado administradas de Amazon S3 (SSE-S3), tu bucket de S3 cifrará cada objeto con una clave única.

Para cifrar los datos en reposo descargados, ejecuta el siguiente comando para establecer el parámetro s3:x-amz-server-side-encryption en tu política de bucket de S3 en true:

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

Ejecuta el siguiente comando para confirmar que hayas cifrado KMS_KEY_ID para poder descargar los datos cifrados en tu bucket de 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;

En el caso de los buckets de S3 que hayas cifrado con una clave raíz de AWS Key Management Service (AWS KMS), añade los siguientes permisos de política de IAM:

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

Resolución de problemas con los buckets

Cuando intentas descargar archivos en una carpeta en la que hay un archivo con el mismo nombre, recibes un mensaje de error.

Para solucionar este problema, toma una de estas medidas:

  • Crea un nuevo bucket de S3 o utiliza un bucket de S3 diferente.
  • Cambia el prefijo de la clave de S3.
  • Elimina los archivos que se encuentran en el bucket de S3 de destino.
  • Incluye la opción ALLOWOVERWRITE en el comando UNLOAD.

Creación de un nuevo bucket de S3 o uso de un bucket de S3 diferente

  1. Crea un nuevo bucket de S3 o elige un bucket de S3 diferente.
  2. Actualiza la política de bucket del nuevo bucket de S3 o uno diferente para incluir los siguientes permisos:
{
    "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. Utiliza la ruta del nuevo bucket en el comando UNLOAD.
Ejemplo de comando:

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

Cambio del prefijo de la clave de S3

Cuando ejecutes el comando UNLOAD, cambia el prefijo de la clave del bucket de S3 en la ruta de S3.

Ejemplo de comando que incluye unload2 como prefijo modificado:

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

Para obtener más información, consulta Organizar objetos con prefijos.

Eliminación de los archivos que se encuentran en el bucket de S3 de destino

Importante: Cuando usas la opción CLEANPATH para eliminar archivos, los eliminas permanentemente y no puedes recuperarlos. Además, si especificas la opción ALLOWOVERWRITE, no podrás especificar la opción CLEANPATH.

Para usar la opción CLEANPATH, debes tener el permiso s3:DeleteObject en el bucket de S3.

Ejemplo de política de permisos:

{
    "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 eliminar los archivos existentes solo de las carpetas de particiones, incluye PARTITION BY.

Ejemplo del comando UNLOAD con CLEANPATH y 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;

Nota: Si no deseas eliminar las columnas de partición de los archivos descargados, especifica PARTITION BY con la opción INCLUDE.

Uso de la opción ALLOWOVERWRITE

Si el comando UNLOAD encuentra archivos que podría sobrescribir, se produce un error en la operación de descarga. Al incluir ALLOWOVERWRITE en el comando, UNLOAD sobrescribe los archivos existentes, incluido el archivo de manifiesto.

Para usar la opción ALLOWOVERWRITE, debes tener el permiso s3:PutObject en el bucket de S3.

Ejemplo de política de permisos:

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

Ejemplo de comando UNLOAD con la opción ALLOWOVERWRITE:

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

Información relacionada

Autorización a Amazon Redshift para obtener acceso a los servicios de AWS en tu nombre

How to prevent uploads of unencrypted objects to Amazon S3 (Cómo evitar que se suban objetos no cifrados a Amazon S3)

Falta de respuesta de las consultas y pérdidas de consultas antes de llegar al clúster

Descarga de archivos de datos cifrados

Políticas y permisos en Amazon S3

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 2 meses