如何排查 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<b><br></b>
403 访问被拒绝错误
[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,<br>
注意:将数据卸载到 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": [
{
"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"
]