Amazon Redshift での、UNLOAD コマンドに関する問題をトラブルシューティングする方法を教えてください。
UNLOAD コマンドを使用して Amazon Redshift クラスターから Amazon Simple Storage Service (Amazon S3) にデータをアンロードしたいのですが、エラーメッセージが表示されます。
簡単な説明
UNLOAD コマンドを実行すると、次のいずれかに類似したエラーメッセージが表示される場合があります。
- 「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」 (そのユーザーは IAM ロールの引き受けを許可されていません)
- 「[Amazon](500310) Invalid operation: S3ServiceException:Access Denied,Status 403,Error AccessDenied,」
- 「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」 (S3 で指定されたアンロード先が空ではありません。別のバケット/プレフィックスを使用するか、S3 内のターゲットファイルを手動で削除するか、ALLOWOVERWRITE オプションを使用することを検討してください)
問題を解決するには、表示されたエラーメッセージに応じて次のいずれかの手順を実行します。
- データベースに AWS Identity and Access Management (IAM) ロールの引き受けを許可します。
- Amazon S3 の操作に適切なアクセス許可を付与します。
- 宛先バケット内のオブジェクトを削除または上書きします。S3 のキープレフィックスを変更します。または、別のバケットを使用します。
解決策
データベースに IAM ロールを引き受けるためのアクセス許可を付与する
この問題を解決するには、IAM ロールを Amazon Redshift クラスターに関連付けます。UNLOAD コマンドに IAM ロールを含める際、末尾にスペースが入っていないことを確認してください。さらに、Amazon Redshift クラスターに割り当てる IAM ロールに正しい信頼関係を使用していることを確認してください。
Amazon S3 の操作に適切なアクセス許可を付与する
S3 バケットが 403 Access Denied エラーを返す場合は、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/*" ] } ] }
Amazon S3 マネージド暗号化キー (SSE-S3) でサーバー側の暗号化を使用している場合、S3 バケットは各オブジェクトを一意のキーで暗号化します。
アンロードされた保管中のデータを暗号化するには、次のコマンドを実行し、S3 バケットポリシーの s3:x-amz-server-side-encryption パラメータを true に設定します。
"Condition": { "Null": { "s3:x-amz-server-side-encryption": "true" }
次のコマンドを実行し、KMS_KEY_ID が暗号化済みであり、暗号化したデータを S3 バケットにアンロードできることを確認します。
unload ('select * from a') to 's3://mybucket/test/varchar/' iam_role 'arn:aws:iam::xxxxxx:role/RedshiftS3Access' ALLOWOVERWRITE CSV KMS_KEY_ID '11111111111111111111111111' encrypted;
AWS Key Management Service (AWS KMS) のルートキーで暗号化した S3 バケットには、次の IAM ポリシーアクセス許可を追加します。
"Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ]
バケットの問題を解決する
同じファイル名が含まれるフォルダ内のファイルをアンロードしようとすると、エラーメッセージが表示されます。
この問題を解決するには、次のいずれかの操作を行います。
- 新しい S3 バケットを作成するか、別の S3 バケットを使用してください。
- S3 キーのプレフィックスを変更します。
- 送信先の S3 バケットにあるファイルを削除します。
- UNLOAD コマンドに ALLOWOVERWRITE オプションを含めます。
新しい S3 バケットを作成するか、別の S3 バケットを使用する
- 新しい S3 バケットを作成するか、別の S3 バケットを選択します。
- 新規 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 コマンドで新しいバケットのパスを使用します。
コマンド例
unload ('select * from test_unload') to 's3://testbucket2/unload/test_unload_file1' iam_role 'arn:aws:iam::0123456789:role/redshift_role';
S3 キーのプレフィックスを変更する
UNLOAD コマンドを実行する際、S3 パスの S3 バケットキープレフィックスを変更します。
プレフィックスを unload2 に変更し、含めたコマンドの例
unload ('select * from test_unload') to 's3://testbucket/unload2/test_unload_file1' iam_role 'arn:aws:iam::0123456789:role/redshift_role';
詳細については、「プレフィックスを使用してオブジェクトを整理する」を参照してください。
送信先の S3 バケットにあるファイルを削除する
重要: CLEANPATH オプションを使用してファイルを削除すると、ファイルは完全に削除され、復元できなくなります。なお、ALLOWOVERWRITE オプションを指定した場合は、CLEANPATH オプションを指定できません。
CLEANPATH オプションを使用するには、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" ] } ] }
既存のファイルをパーティションフォルダのみから削除するには、PARTITION BY を含めます。
UNLOAD コマンドに CLEANPATH と PARTITION BY を含めた例
unload ('select * from test_unload') to 's3://testbucket/unload/test_unload_file1 iam_role 'arn:aws:iam::0123456789:role/redshift_role' partition by (col1,col2) include CLEANPATH;
注: アンロードしたファイルからパーティション列を削除したくない場合は、INCLUDE オプションで PARTITION BY を指定します。
ALLOWOVERWRITEオプションを使用する
UNLOAD コマンドにより上書きされる可能性のあるファイルが見つかった場合、アンロード操作は失敗します。コマンドに ALLOWOVERWRITE を含めると、UNLOAD はマニフェストファイルを含む既存のファイルを上書きします。
ALLOWOVERWRITE オプションを使用するには、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" ] } ] }
UNLOAD コマンドに ALLOWOVERWRITE オプションを含めた例
unload ('select * from test_unload') to 's3://testbucket/unload/test_unload_file1 iam_role 'arn:aws:iam::0123456789:role/redshift_role' allowoverwrite;
関連情報
Amazon Redshift がユーザーに代わって AWS サービスにアクセスできるようにする
暗号化されていないオブジェクトが Amazon S3 にアップロードされないようにする方法
