如何解決在與 Amazon Redshift 相同的帳戶中,使用 Redshift Spectrum 搭配 Amazon S3 儲存貯體時出現的存取遭拒錯誤?

上次更新日期︰2022 年 11 月 17 日

我想要在與 Amazon Redshift 叢集相同的帳戶中,存取存放在 Amazon Simple Storage Service (Amazon S3) 儲存貯體中的資料。我還想要使用 Amazon Redshift Spectrum 搭配 AWS Glue 做為我的資料型錄來存取資料。然而,我遇到了許可錯誤。

簡短描述

若 AWS Identity and Access Management (IAM) 角色連接至 Redshift 叢集,必須具有 AWS Glue 和 S3 服務的許可。如果 IAM 角色沒有正確的許可,您可能會收到以下任何錯誤:

建立外部結構描述時:

SQL Error [XX000]: ERROR: 
  User: arn:aws:sts::111111111111:assumed-role/KCARole/RedshiftIamRoleSession is not authorized to perform: glue:CreateDatabase on resource: arn:aws:glue:eu-west-1:111111111111:catalog because no identity-based policy allows the glue:CreateDatabase action

嘗試查詢 Redshift Spectrum 資料表時:

SQL Error [XX000]: ERROR: Spectrum Scan Error
  Detail: 
  -----------------------------------------------
  error:  Spectrum Scan Error
  code:      15007
  context:   Forbidden: HTTP response error code: 403 Message: AccessDenied Access Denied

嘗試查詢 Redshift Spectrum 資料表,且 S3 儲存貯體正在使用金鑰管理服務 (AWS KMS) 加密金鑰時:

SQL Error [XX000]: ERROR: Spectrum Scan Error
  Detail: 
  -----------------------------------------------
  error:  Spectrum Scan Error
  code:      15007
  context:   Forbidden: HTTP response error code: 403 Message: AccessDenied The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access

若要解決這些錯誤,必須將具有必要許可的 IAM 政策連接至 Amazon Redshift 使用的 IAM 角色。如果 S3 儲存貯體使用 KMS 金鑰加密,還必須連接許可才能使用金鑰。

解決方案

將 AWS 受管政策 AWSGlueConsoleFullAccess 連接至已連接 Redshift 叢集的 IAM 角色。

使用以下範例建立 IAM 政策,並將該政策連接至已連接 Redshift 叢集的 IAM 角色。這允許對存放資料的 S3 儲存貯體進行讀取:

注意:用您的 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>"
      ]
    }
  ]
}

如果 Redshift Spectrum 使用的 S3 儲存貯體透過 AWS KMS 加密金鑰進行加密,則請建立並連接下列 IAM 政策。將政策連接至已連接 Redshift 叢集的 IAM 角色。此政策會提供存取權,以便 Redshift Spectrum 可對 Amazon S3 中的加密資料進行解密。以下是允許解密的最低許可範例:

注意:用您的 S3 儲存貯體所在的 AWS 區域取代區域,用您的帳戶 ID 取代 AWS 帳戶 ID,並用 KMS 加密金鑰取代 KMS 金鑰 ID

{
  "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>"
      ]
    }
  ]
}