Amazon Redshift クラスターと同じ AWS アカウント内の Amazon Simple Storage Service (Amazon S3) バケットに保存されているデータにアクセスしたいです。また、データカタログとして AWS Glue を使用して Amazon Redshift Spectrum のデータにアクセスしたいです。しかし、アクセス許可に関するエラーが発生しています。
簡単な説明
Redshift クラスターにアタッチする AWS Identity and Access Management (IAM) ロールには、AWS Glue と Amazon 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 Key Management Service (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 (暗号文が参照するカスタマーマスターキーは、存在しないか、リージョン内にありません。または、アクセスが許可されていません)
これらのエラーを解決するには、Amazon Redshift が使用する IAM ロールに対し、必要なアクセス許可を含む IAM ポリシーをアタッチする必要があります。S3 バケットが AWS KMS キーを使用して暗号化されている場合は、そのキーを使用するためのアクセス許可も追加する必要があります。
解決策
IAM ポリシーを作成します。次に、Redshift クラスターにアタッチされている IAM ロールに以下のポリシーをアタッチします。
AWS マネージドポリシー AWSGlueConsoleFullAccess をアタッチします。
データを保存する 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 ポリシー