Amazon Redshift での UNLOAD に関する問題をトラブルシューティングするにはどうすればよいですか?
Amazon Redshift クラスターから Amazon Simple Storage Service (Amazon S3) にデータをアンロードしようとしています。しかし、エラーが発生します。これをトラブルシューティングするにはどうすればよいですか?
簡単な説明
Amazon Redshift クラスターから Amazon S3 バケットにデータをアンロードすると、次のエラーが発生することがあります。
DB ユーザーに 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>
403 アクセス拒否エラー
[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,
注意: S3 バケットにデータをアンロードする場合は、SELECT ステートメントで UNLOAD コマンドを使用します。(ロード中に使用されるデータ形式にかかわらず) テキストデータを区切り文字または固定長形式でアンロードします。圧縮された gzip ファイルを保存するかどうかを指定することもできます。
S3 で指定されたアンロード先が空ではない
ERROR: Specified unload destination on S3 is not empty. Consider using a different bucket / prefix, manually removing the target files in S3, or using the ALLOWOVERWRITE option.
このエラーは、同じ UNLOAD コマンドを実行して、データファイルが既に存在する同じフォルダ内のファイルをアンロードしようとしたときに発生する可能性があります。
例えば、次のコマンドを 2 回実行すると、このエラーが発生します。
unload ('select * from test_unload') to 's3://testbucket/unload/test_unload_file1' iam_role 'arn:aws:iam::0123456789:role/redshift_role';
解決方法
DB ユーザーに AWS IAM ロールを引き受ける権限がない旨のエラー
データベースユーザーが IAM ロールを引き受ける権限がない場合は、次を確認してください。
- IAM ロールが Amazon Redshift クラスターに関連付けられていることを確認します。
- UNLOAD コマンドで使用される IAM ロールの末尾にスペースがないことを確認します。
- Amazon Redshift クラスターに割り当てられた IAM ロールが正しい信頼関係を使用していることを確認します。
403 アクセス拒否エラー
S3 バケットから「403 Access Denied」(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" ]
S3 で指定されたアンロード先が空ではない
「specified unload destination on S3 is not empty」(S3 で指定されたアンロード先は空ではありません) というエラーは、同じファイル名が存在するフォルダ内のファイルを UNLOAD しようとした場合に発生します。
エラーメッセージを解決するには、次のいずれかのオプションを選択してください。
- 新しい Amazon S3 バケットを作成するか、別の S3 バケットを使用する
- S3 キープレフィックスを変更する
- アンロード先の Amazon S3 バケットに存在するファイルをクリーンアップする
- UNLOAD コマンドで ALLOWOVERWRITE オプションを使用する
新しい Amazon S3 バケットを作成するか、別の S3 バケットを使用する
1. 新しい S3 バケットを作成するか、別の既存の S3 バケットを指定します。
2. 新規または既存のバケットの S3 バケットのバケットポリシーを更新します。次のサンプルポリシーを許可ポリシーとして追加する必要があります。
{ "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "ExampleStatement01", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::0123456789:user/<UserName>" }, "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::testbucket/*", "arn:aws:s3:::testbucket", "arn:aws:s3:::testbucket2/*", --> Additional permission for new bucket "arn:aws:s3:::testbucket2" ] } ] }
3. UNLOAD コマンドで新しいバケットパスを使用します。次の例では、s3://testbucket2/unload/test_unload_file1 が新しいバケットパスです。
iam_role 'arn:aws:iam::0123456789:role/redshift_role'; unload ('select * from test_unload') to 's3://testbucket2/unload/test_unload_file1'
S3 キープレフィックスを変更する
UNLOAD コマンドを使用するときに、S3 パスの S3 バケットキープレフィックスを変更します。次の例では、unload2 が変更されたプレフィックスです。
iam_role 'arn:aws:iam::0123456789:role/redshift_role'; unload ('select * from test_unload') to 's3://testbucket/unload2/test_unload_file1'
詳細については、「プレフィックスを使用してオブジェクトを整理する」を参照してください。
アンロード先の Amazon S3 バケットに存在するファイルをクリーンアップする
CLEANPATH オプションを使用して、TO 句で指定された Amazon S3 パスにある既存のファイルを削除してから、指定された場所にファイルをアンロードします。PARTITION BY 句を含めると、既存のファイルはパーティションフォルダからのみ削除されます。これにより、Amazon S3 バケットは UNLOAD オペレーションによって生成された新しいファイルを受け取ることができます。
重要: CLEANPATH オプションを使用して削除されたファイルは完全に削除され、復元することはできません。
CLEANPATH オプションを使用するには、Amazon S3 バケットに対する s3:DeleteObject 許可が必要です。次のサンプルポリシーを許可ポリシーとして追加する必要があります。
{ "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "ExampleStatement01", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::0123456789:user/<UserName>" }, "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:DeleteObject" --> Additional Action added for delete object ], "Resource": [ "arn:aws:s3:::testbucket/*", "arn:aws:s3:::testbucket" ] } ] }
注: ALLOWOVERWRITE オプションを指定した場合、CLEANPATH オプションは指定できません。
UNLOAD コマンドで ALLOWOVERWRITE オプションを使用する
UNLOAD コマンドは、上書きする可能性のあるファイルが見つかると失敗します。ALLOWOVERWRITE が指定されている場合、UNLOAD はマニフェストファイルを含む既存のファイルを上書きします。次の例では、以前のファイルが上書きされ、バケットが新しいレコードで更新されます。
iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite; unload ('select * from test_unload') to 's3://testbucket/unload/test_unload_file1'
ALLOWOVERWRITE オプションを使用するには、Amazon S3 バケットに対する s3:PutObject 許可が必要です。次のサンプルポリシーを許可ポリシーとして追加する必要があります。
{ "Version": "2012-10-17", "Id": "ExamplePolicy01", "Statement": [ { "Sid": "ExampleStatement01", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::0123456789:user/<UserName>" }, "Action": [ "s3:GetObject", "s3:GetBucketLocation", "s3:ListBucket", "s3:PutObject" --> Additional Action added for overwriting objects ], "Resource": [ "arn:aws:s3:::testbucket/*", "arn:aws:s3:::testbucket" ] } ] }
関連情報
Amazon Redshift がお客様の代わりに他の AWS のサービスにアクセスすることを許可する
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 1年前lg...
- 質問済み 1年前lg...
- 承認された回答質問済み 10ヶ月前lg...
- AWS公式更新しました 10ヶ月前