如何排查 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 访问被拒绝错误

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

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

解决方法

数据库用户无权代入 AWS IAM 角色错误

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

403 访问被拒绝错误

如果您收到来自 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/*"
      ]
    }
  ]
}

如果您将服务器端加密与 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": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]