如何排查 Amazon Redshift 中的 UNLOAD 问题?

上次更新时间:2020 年 9 月 25 日

我正在尝试将数据从我的 Amazon Redshift 集群卸载到 Amazon Simple Storage Service (Amazon S3)。但发生了错误。如何排查此问题?
简短描述

将数据从 Amazon Redshift 集群卸载到 Amazon S3 存储桶时,您可能会遇到以下错误:

数据库用户无权代入 AWS Identity and Access Management (IAM) 角色错误

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> 4

403 访问被拒绝错误

(500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,

注意:将数据卸载到 S3 存储桶时,请使用带 SELECT 语句的 UNLOAD 命令。以分隔格式或固定宽度格式卸载文本数据(无论加载时使用的数据格式如何)。您还可以指定是否应该归档压缩的 Gzip 文件。

解决方法 数据库用户无权代入 AWS IAM 角色错误

如果数据库用户无权代入 IAM 角色,请检查以下内容:

验证 IAM 角色是否与您的 Amazon Redshift 集群相关联。
验证 UNLOAD 命令中使用的 IAM 角色中是否没有尾随空格。 验证分配给 Amazon Redshift 集群的 IAM 角色是否使用了正确的信任关系。 403 访问被拒绝错误

如果您收到来自 S3 存储桶的 403 访问被拒绝错误,请确认已为您的 S3 API 操作授予适当的权限:

  "Version": "2012-10-17",
  "Statement": ,
      "Resource": 
    }
  ]
}

如果您将服务器端加密与 S3 托管的加密密钥结合使用,则 S3 存储桶会使用唯一密钥对其每个对象进行加密。作为额外的保护措施,密钥本身也使用定期轮换的主密钥进行加密。

要加密已卸载的静态数据,请验证 S3 存储桶策略中的 s3:x-amz-server-side-encryption 参数是否设置为“true”:

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

确认KMS_KEY_ID已加密,以便您可以将加密的数据 UNLOAD 到 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;

如果您的 S3 存储桶使用 AWS Key Management Service (AWS KMS) 中的主密钥进行加密,请将以下权限添加到您的 IAM 策略中:

"Action":