Amazon Redshift での UNLOAD に関する問題のトラブルシューティング方法を教えてください。
最終更新日: 2020 年 9 月 25 日
簡単な説明
Amazon Redshift クラスターから Amazon S3 バケットにデータをアンロードすると、以下のエラーが発生することがあります。
DB ユーザーに AWS ID および 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>
[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,<br>
注意: S3 バケットにデータをアンロードする場合は、SELECT ステートメントで UNLOAD コマンドを使用します。(ロード中に使用されるデータ形式にかかわらず) テキストデータを区切り文字または固定長形式でアンロードします。圧縮された Gzip ファイルを保存するかどうかを指定することもできます。
解決方法
DB ユーザーに 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"
}
暗号化されたデータを S3 バケットに UNLOAD できるように、KMS_KEY_ID が暗号化されていることを確認します。
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"
]