我想访问存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中的数据,这些数据与我的 Amazon Redshift 集群位于同一 AWS 账户中。我还想使用 AWS Glue 作为我的数据目录来访问 Amazon Redshift Spectrum 中的数据。但是,我收到了权限错误。
简短描述
附加到 Redshift 集群的 AWS Identity and Access Management (IAM) 角色必须拥有 AWS Glue 和 Amazon S3 的权限。如果 IAM 角色没有正确的权限,则您可能会收到错误消息。
创建外部架构时,可能会收到以下错误消息:
“SQL 错误 [XX000]: 错误: 用户 arn:aws:sts::111111111111:assumed-role/KCARole/RedshiftIamRoleSession 无权对资源 arn:aws:glue:eu-west-1:111111111111:catalog 执行 glue:CreateDatabase,因为没有基于身份的策略允许 glue:CreateDatabase 操作”
当您查询 Redshift Spectrum 表时,可能会收到以下错误消息:
“SQL 错误 [XX000]: 错误: Spectrum 扫描错误详细信息:----------------------------------------------- 错误: Spectrum 扫描错误代码: 15007 上下文: 禁止访问: HTTP 响应错误代码: 403 消息: AccessDenied 访问被拒绝”
当您查询 Redshift Spectrum 表并且 S3 存储桶使用 AWS Key Management Services (AWS KMS) 加密密钥时,可能会收到以下错误消息:
“SQL 错误 [XX000]: 错误: Spectrum 扫描错误详细信息:----------------------------------------------- 错误: Spectrum 扫描错误代码: 15007 上下文: 禁止访问: HTTP 响应错误代码: 403 消息: AccessDenied 加密文字指的是不存在、此区域不存在或者您无权访问的客户主密钥”
要解决这些错误,您必须向 Amazon Redshift 使用的 IAM 角色附加具有所需权限的 IAM 策略。如果您使用 AWS KMS 密钥加密 S3 存储桶,则还必须添加权限才能使用该密钥。
解决方法
创建 IAM 策略。然后,将以下策略附加到已附加到 Redshift 集群的 IAM 角色。
附加 AWSGlueConsoleFullAccess AWS 托管式策略。
使用允许对存储数据的 S3 存储桶进行读取访问的以下示例策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allows Redshift to Read S3 bucket specified",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket name/*",
"arn:aws:s3:::bucket name"
]
}
]
}
**注意:**将 bucket name 替换为您的 S3 存储桶的名称。
对于 AWS KMS 密钥加密存储桶,附加以下 IAM 策略,该策略提供最低权限,允许 Redshift Spectrum 解密 Amazon S3 中的加密数据:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow Redshift to use the KMS key",
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Resource": [
"arn:aws:kms:region:AWS account ID:key/KMS key ID"
]
}
]
}
**注意:**将 region 替换为您的 S3 存储桶所在的 AWS 区域。此外,将 AWS account ID 替换为您的账户 ID,将 KMS key ID 替换为 KMS 加密密钥。
相关信息
如何创建对 AWS Glue 和 Amazon S3 的 Amazon Redshift Spectrum 跨账户访问?
Amazon Redshift Spectrum 的 IAM 策略