Direkt zum Inhalt

Wie behebe ich Probleme mit dem Befehl UNLOAD in Amazon Redshift?

Lesedauer: 5 Minute
0

Ich möchte den Befehl UNLOAD verwenden, um Daten von meinem Amazon-Redshift-Cluster auf Amazon Simple Storage Service (Amazon S3) zu entladen. Ich erhalte jedoch eine Fehlermeldung.

Kurzbeschreibung

Wenn du den Befehl UNLOAD ausführst, wird möglicherweise eine Fehlermeldung angezeigt, die einer der folgenden ähnelt:

  • „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.“

Um das Problem zu beheben, führe auf der Grundlage der Fehlermeldung, die du erhältst, eine der folgenden Maßnahmen durch:

  • Autorisiere die Datenbank, die Rolle des AWS Identity and Access Management (IAM) zu übernehmen.
  • Erteile deinen Amazon-S3-Vorgängen die entsprechenden Berechtigungen.
  • Entferne oder überschreibe die Objekte im Ziel-Bucket. Ändere das S3-Schlüsselpräfix. Oder verwende einen anderen Bucket.

Lösung

Datenbank autorisieren, um die IAM-Rolle zu übernehmen

Um dieses Problem zu lösen, verknüpfe die IAM-Rolle mit deinem Amazon-Redshift-Cluster. Wenn du die IAM-Rolle in den UNLOAD-Befehl aufnimmst, stelle sicher, dass keine Leerzeichen am Ende stehen. Stelle außerdem sicher, dass du die richtige Vertrauensbeziehung für die IAM-Rolle verwendest, die du dem Amazon-Redshift-Cluster zuweist.

Amazon-S3-Vorgängen die entsprechenden Berechtigungen erteilen

Wenn du von deinem S3-Bucket den Fehler 403 Access Denied error from your S3 bucket erhältst, gewähre deinen S3-API-Vorgängen die entsprechenden Berechtigungen.

Beispiel für eine Richtlinie:

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

Wenn du serverseitige Verschlüsselung mit von Amazon S3 verwalteten Verschlüsselungsschlüsseln (SSE-S3) verwendest, verschlüsselt dein S3-Bucket jedes Objekt mit einem eindeutigen Schlüssel.

Um die entladenen Daten im Ruhezustand zu verschlüsseln, führe den folgenden Befehl aus, um den Parameter s3:x-amz-server-side-encryption in deiner S3-Bucket-Richtlinie auf true zu setzen:

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

Führe den folgenden Befehl aus, um zu bestätigen, dass du KMS_KEY_ID verschlüsselt hast, damit du die verschlüsselten Daten in deinen S3-Bucket entladen kannst:

unload ('select * from a') to 's3://mybucket/test/varchar/' iam_role 'arn:aws:iam::xxxxxx:role/RedshiftS3Access' ALLOWOVERWRITE CSV
KMS_KEY_ID '11111111111111111111111111'
encrypted;

Füge für S3-Buckets, die du mit einem Root-Schlüssel von AWS Key Management Service (AWS KMS) verschlüsselt hast, die folgenden IAM-Richtlinienberechtigungen hinzu:

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

Bucket-Probleme lösen

Wenn du versuchst, Dateien in einem Ordner zu entladen, in dem derselbe Dateiname existiert, erhältst du eine Fehlermeldung.

Gehe wie folgt vor, um dieses Problem zu beheben:

  • Erstelle einen neuen S3-Bucket oder verwende einen anderen S3-Bucket.
  • Ändere das S3-Schlüsselpräfix.
  • Entferne die Dateien, die sich im Ziel-S3-Bucket befinden.
  • Schließe die Option ALLOWOVERWRITE in den Befehl UNLOAD ein.

Erstelle einen neuen S3-Bucket oder verwende einen anderen S3-Bucket

  1. Erstelle einen neuen S3-Bucket oder wähle einen anderen S3-Bucket aus.
  2. Aktualisiere die Bucket-Richtlinie des neuen oder eines anderen S3-Buckets, um die folgenden Berechtigungen einzuschließen:
{
    "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. Verwende den neuen Bucket-Pfad im UNLOAD-Befehl.
Beispielbefehl:

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

S3-Schlüsselpräfix ändern

Wenn du den Befehl UNLOAD ausführst, änderst du das S3-Bucket-Schlüsselpräfix im S3-Pfad.

Beispielbefehl, der unload2 als geändertes Präfix enthält:

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

Weitere Informationen findest du unter Organisation von Objekten mit Präfixen.

Entferne die Dateien, die sich im Ziel-S3-Bucket befinden

Wichtig: Wenn du die CLEANPATH-Option verwendest, um Dateien zu entfernen, löschst du die Dateien dauerhaft und kannst sie nicht wiederherstellen. Außerdem kannst du die Option CLEANPATH nicht angeben, wenn du die Option ALLOWOVERWRITE angibst.

Um die CLEANPATH-Option verwenden zu können, benötigst du die s3:DeleteObject-Berechtigung für den S3-Bucket.

Beispiel für eine Berechtigungsrichtlinie:

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

Um vorhandene Dateien nur aus den Partitionsordnern zu entfernen, schließe PARTITION BY ein.

Beispiel für einen UNLOAD-Befehl, der CLEANPATH und PARTITION BY enthält:

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;

Hinweis: Wenn du die Partitionsspalten nicht aus den entladenen Dateien entfernen möchtest, gib PARTITION BY mit der INCLUDE-Option an.

Verwende die Option ALLOVERWRITE

Wenn der Befehl UNLOAD Dateien findet, die er möglicherweise überschreibt, schlägt der Entladevorgang fehl. Wenn du ALLOWOVERWRITE in den Befehl aufnimmst, überschreibt UNLOAD vorhandene Dateien, einschließlich der Manifestdatei.

Um die ALLOWOVERWRITE-Option verwenden zu können, benötigst du die s3:PutObject-Berechtigung für den S3-Bucket.

Beispiel für eine Berechtigungsrichtlinie:

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

Beispiel für einen UNLOAD-Befehl, der die Option ALLOVERWRITE enthält:

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

Ähnliche Informationen

Autorisierung von Amazon Redshift für den Zugriff auf AWS-Services in deinem Namen

So verhinderst du das Hochladen unverschlüsselter Objekte auf Amazon S3

Abfragen scheinen hängen zu bleiben und erreichen den Cluster manchmal nicht

Verschlüsselte Datendateien entladen

Richtlinien und Berechtigungen in Amazon S3

AWS OFFICIALAktualisiert vor 7 Monaten