Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何對 Amazon Redshift 中 UNLOAD 命令的問題進行疑難排解?
我想要使用 UNLOAD 命令將資料從我的 Amazon Redshift 叢集卸載到 Amazon Simple Storage Service (Amazon S3)。但是,我收到錯誤訊息。
簡短描述
執行 UNLOAD 命令時,您可能會收到類似以下內容之一的錯誤訊息:
- 「錯誤: 使用者 arn:aws:redshift:us-west-2:account-id:dbuser:cluster-identifier/dbuser 使用者名稱無權承擔 IAM 角色 arn:aws:iam::account-id:role/Role name」
- 「[Amazon](500310) 無效操作: S3ServiceException:拒絕存取,狀態 403,AccessDenied,」
- 「錯誤: S3 上指定的卸載目的地不是空的。考慮使用不同的儲存貯體/首碼,手動刪除 S3 中的目標檔案,或使用 ALLOWOVERWRITE 選項。」
若要解決此問題,請根據收到的錯誤訊息執行下列其中一個動作:
- 授權資料庫承擔 AWS Identity and Access Management (IAM) 角色。
- 授予您的 Amazon S3 作業適當的權限。
- 移除或覆寫目的地儲存貯體中的物件。變更 S3 金鑰首碼。或者,使用其他的儲存貯體。
解決方法
授權資料庫承擔 IAM 角色
若要解決此問題,請將 IAM 角色與您的 Amazon Redshift 叢集關聯。當您在 UNLOAD 命令中包含 IAM 角色時,請確保沒有結尾空格。此外,請確定對指派給 Amazon Redshift 叢集的 IAM 角色使用正確的信任關係。
授予您的 Amazon S3 作業適當的權限
如果您從 S3 儲存貯體收到 403 拒絕存取錯誤,請授予您的 S3 API 作業適當的權限。
政策範例:
{ "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/*" ] } ] }
如果您使用具有 Amazon S3 受管加密金鑰 (SSE-S3) 的伺服器端加密,那麼您的 S3 儲存貯體會使用唯一金鑰加密每個物件。
若要靜態加密卸載的資料,請執行以下命令將 S3 儲存貯體政策中的 s3:x-amz-server-side-encryption 參數設為 True:
"Condition": { "Null": { "s3:x-amz-server-side-encryption": "true" }
執行以下命令以確認您是否已加密 KMS_KEY_ID,以便您可以將加密資料卸載到您的 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;
對於使用 AWS Key Management Service (KMS) 根金鑰加密的 S3 儲存貯體,請新增下列 IAM 政策權限:
"Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ]
解決儲存貯體問題
當您嘗試卸載資料夾中存在相同檔案名稱的檔案時,您會收到錯誤訊息。
若要解決此錯誤,請執行下列其中一個動作:
- 建立新的 S3 儲存貯體,或使用其他 S3 儲存貯體。
- 變更 S3 金鑰首碼。
- 移除目的地 S3 儲存貯體中的檔案。
- 在 UNLOAD 命令中加入 ALLOWOVERWRITE 選項。
建立新的 S3 儲存貯體,或使用其他 S3 儲存貯體
- 建立新的 S3 儲存貯體,或選擇其他 S3 儲存貯體。
- 更新新的或不同 S3 儲存貯體的儲存貯體政策,以包含以下權限:
{ "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.在 UNLOAD 命令中使用新的儲存貯體路徑。
命令範例:
unload ('select * from test_unload') to 's3://testbucket2/unload/test_unload_file1' iam_role 'arn:aws:iam::0123456789:role/redshift_role';
變更 S3 金鑰首碼
執行 ** UNLOAD ** 命令時,請變更 S3 路徑中的 S3 儲存貯體金鑰首碼。
加入 unload2 作為變更後首碼的命令範例:
unload ('select * from test_unload') to 's3://testbucket/unload2/test_unload_file1' iam_role 'arn:aws:iam::0123456789:role/redshift_role';
如需詳細資訊,請參閱使用首碼組織物件。
移除目的地 S3 儲存貯體中的檔案
**重要:**當您使用 CLEANPATH 選項移除檔案時,您將永久刪除這些檔案並且無法復原它們。另外,如果您指定了 ALLOWOVERWRITE 選項,那麼您就無法指定 CLEANPATH 選項。
若要使用 CLEANPATH 選項,您必須擁有 S3 儲存貯體的 s3:DeleteObject 權限。
權限政策範例:
{ "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" ] } ] }
若要僅從分區資料夾中移除現有檔案,請包含 PARTITION BY。
包含 CLEANPATH 和 PARTITION BY 的 UNLOAD 命令範例:
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;
**注意:**如果您不想從已卸載檔案中移除分區資料欄,請使用 INCLUDE 選項指定 PARTITION BY。
使用 ALLOWOVERWRITE 選項
如果 UNLOAD 命令找到可能覆寫的檔案,則卸載作業會失敗。當您在命令中包含 ALLOWOVERWRITE 時,UNLOAD 會覆寫現有檔案,包括清單檔案。
若要使用 ALLOWOVERWRITE 選項,您必須擁有 S3 儲存貯體的 s3:PutObject 權限。
權限政策範例:
{ "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" ] } ] }
包含 ALLOWOVERWRITE 選項的 UNLOAD 命令範例:
unload ('select * from test_unload') to 's3://testbucket/unload/test_unload_file1 iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite;
相關資訊

相關內容
- 已提問 7 個月前lg...
- 已提問 9 個月前lg...
- 已提問 2 年前lg...