Wie behebe ich Zugriffsverweigerungsfehler, wenn ich Redshift Spectrum mit Amazon-S3-Buckets im selben Konto wie Amazon Redshift verwende?

Letzte Aktualisierung: 17.11.2022

Ich möchte auf Daten zugreifen, die in Amazon Simple Storage Service (Amazon S3)-Buckets innerhalb desselben Kontos wie mein Amazon-Redshift-Cluster gespeichert sind. Ich möchte auch mit Amazon Redshift Spectrum mit AWS Glue als Datenkatalog auf die Daten zugreifen. Aber ich erhalte Berechtigungsfehler.

Kurzbeschreibung

Die AWS Identity and Access Management (IAM)-Rolle, die dem Redshift-Cluster zugeordnet ist, muss über Berechtigungen für die AWS-Glue- und S3-Services verfügen. Wenn die IAM-Rolle nicht über die korrekten Berechtigungen verfügt, erhalten Sie möglicherweise eine der folgenden Fehler:

Beim Erstellen eines externen Schemas:

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

Wenn Sie versuchen, eine Redshift-Spectrum-Tabelle abzufragen:

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

Wenn Sie versuchen, eine Redshift-Spectrum-Tabelle abzufragen und der S3-Bucket einen Key Management Services (AWS KMS)-Verschlüsselungsschlüssel verwendet:

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

Um diese Fehler zu beheben, müssen Sie eine IAM-Richtlinie mit den erforderlichen Berechtigungen an die von Amazon Redshift verwendete IAM-Rolle anhängen. Wenn der S3-Bucket mit einem KMS-Schlüssel verschlüsselt ist, müssen Sie auch Berechtigungen zur Verwendung des Schlüssels anhängen.

Lösung

Hängen Sie die von AWS verwaltete Richtlinie AWSGlueConsoleFullAccess an die IAM-Rolle an, die dem Redshift-Cluster zugeordnet ist.

Erstellen Sie anhand des folgenden Beispiels eine IAM-Richtlinie und hängen Sie die Richtlinie an die IAM-Rolle an, die dem Redshift-Cluster zugeordnet ist. Dies ermöglicht den Lesezugriff auf den S3-Bucket, in dem die Daten gespeichert sind:

Hinweis: Ersetzen Sie den Bucket-Namen durch den Namen Ihres S3-Buckets.

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

Wenn der von Redshift Spectrum verwendete S3-Bucket mit einem AWS-KMS-Verschlüsselungsschlüssel verschlüsselt ist, erstellen Sie die folgende IAM-Richtlinie und hängen Sie sie an. Hängen Sie die Richtlinie an die IAM-Rolle an, die dem Redshift-Cluster zugeordnet ist. Diese Richtlinie bietet Zugriff, sodass Redshift Spectrum die verschlüsselten Daten in Amazon S3 entschlüsseln kann. Im Folgenden finden Sie ein Beispiel für die Mindestberechtigungen, die eine Entschlüsselung ermöglichen:

Hinweis: Ersetzen Sie die Region durch die AWS-Region, in der sich Ihr S3-Bucket befindet, ersetzen Sie die AWS-Konto-ID durch Ihre Konto-ID und ersetzen Sie die KMS-Schlüssel-ID durch den KMS-Verschlüsselungsschlüssel.

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