Come posso risolvere i problemi relativi al comando UNLOAD in Amazon Redshift?

5 minuti di lettura
0

Desidero utilizzare il comando UNLOAD per scaricare dati dal mio cluster Amazon Redshift ad Amazon Simple Storage Service (Amazon S3). Tuttavia, ricevo un messaggio di errore.

Breve descrizione

Quando esegui il comando UNLOAD, potresti ricevere un messaggio di errore simile a uno dei seguenti:

  • "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."

Per risolvere il problema, intraprendi una delle seguenti azioni in base al messaggio di errore che ricevi:

  • Autorizza il database ad assumere il ruolo AWS Identity and Access Management (AWS IAM).
  • Concedi alle operazioni Amazon S3 le autorizzazioni appropriate.
  • Rimuovi o sovrascrivi gli oggetti nel bucket di destinazione. Modifica il prefisso della chiave S3. Oppure utilizza un bucket diverso.

Risoluzione

Autorizza il database ad assumere il ruolo IAM

Per risolvere il problema, associa il ruolo IAM al cluster Amazon Redshift. Quando includi il ruolo IAM nel comando UNLOAD, assicurati che non ci siano spazi finali. Inoltre, assicurati di utilizzare la relazione di attendibilità corretta per il ruolo IAM assegnato al cluster Amazon Redshift.

Concedi alle operazioni Amazon S3 le autorizzazioni appropriate

Se ricevi un errore 403 Access Denied dal bucket S3, concedi alle operazioni API S3 le autorizzazioni appropriate.

Esempio di policy:

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

Se utilizzi la crittografia lato server con chiavi di crittografia gestite Amazon S3 (SSE-S3), il bucket S3 crittografa ogni oggetto con una chiave univoca.

Per crittografare i dati scaricati a riposo, imposta il parametro s3:x-amz-server-side-encryption della policy del bucket S3 su true eseguendo questo comando:

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

Esegui questo comando per verificare di aver crittografato KMS_KEY_ID in modo da poter scaricare i dati crittografati nel bucket 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;

Per i bucket S3 crittografati con una chiave root del Servizio AWS di gestione delle chiavi (AWS KMS), aggiungi le seguenti autorizzazioni alla policy IAM:

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

Risolvi i problemi del bucket

Quando tenti di scaricare file in una cartella in cui è presente lo stesso nome di file, viene visualizzato un messaggio di errore.

Per risolvere il problema, intraprendi una delle seguenti azioni:

  • Crea un nuovo bucket S3 o utilizza un bucket S3 diverso.
  • Modifica il prefisso della chiave S3.
  • Rimuovi i file che si trovano nel bucket S3 di destinazione.
  • Includi l'opzione ALLOWOVERWRITE nel comando UNLOAD.

Crea un nuovo bucket S3 o utilizza un bucket S3 diverso

  1. Crea un nuovo bucket S3 o scegli un bucket S3 diverso.
  2. Aggiorna la policy del bucket S3 nuovo o diverso includendo le seguenti autorizzazioni:
{
    "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. Utilizza il percorso del nuovo bucket nel comando UNLOAD.
Esempio di comando:

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

Modifica il prefisso della chiave S3

Quando esegui il comando UNLOAD, modifica il prefisso della chiave del bucket S3 nel percorso S3.

Esempio di comando che include unload2 come prefisso modificato:

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

Per ulteriori informazioni, consulta Organizzazione degli oggetti utilizzando i prefissi.

Rimuovi i file che si trovano nel bucket S3 di destinazione

Importante: quando utilizzi l'opzione CLEANPATH per rimuovere i file, li elimini definitivamente e non puoi recuperarli. Inoltre, se specifichi l'opzione ALLOWOVERWRITE, non puoi specificare l'opzione CLEANPATH.

Per utilizzare l'opzione CLEANPATH, devi disporre dell'autorizzazione s3:DeleteObject sul bucket S3.

Esempio di policy di autorizzazione:

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

Per rimuovere i file esistenti solo dalle cartelle delle partizioni, includi PARTITION BY.

Esempio di comando UNLOAD che include 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;

Nota: se non desideri rimuovere le colonne delle partizioni dai file scaricati, specifica PARTITION BY con l'opzione INCLUDE.

Utilizza l'opzione ALLOWOVERWRITE

Se il comando UNLOAD trova file che potrebbe sovrascrivere, l'operazione di scaricamento non riesce. Quando includi ALLOWOVERWRITE nel comando, UNLOAD sovrascrive i file esistenti, incluso il file manifesto.

Per utilizzare l'opzione ALLOWOVERWRITE, devi disporre dell'autorizzazione s3:PutObject sul bucket S3.

Esempio di policy di autorizzazione:

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

Esempio di comando UNLOAD che include l'opzione ALLOWOVERWRITE:

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

Informazioni correlate

Autorizzazione di Amazon Redshift ad accedere ai servizi AWS per tuo conto

How to Prevent Uploads of Unencrypted Objects to Amazon S3 (Come impedire il caricamento di oggetti non crittografati su Amazon S3)

Query bloccate e talvolta impossibilitate a raggiungere il cluster

Scaricamento di file di dati crittografati

Policy e autorizzazioni in Amazon S3

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 mesi fa