Amazon Redshift から Amazon S3 へ UNLOAD 時には s3:PutObject 権限だけでよさそうだが、s3:ListBucket 権限も必要。allowoverwrite オプションをつけている場合は s3:PutObject 権限のみで UNLAOD できるが、allowoverwrite オプションをつけていない場合は s3:ListBucket を実行している模様。
s3:PutObject 権限のみの場合
- allowoverwrite オプションありは成功
dev=# unload ('select * from customer') dev-# to 's3://redshift-unload-copy/' dev-# allowoverwrite dev-# iam_role 'arn:aws:iam::234567890123:role/RedshiftUnloadCopy'; INFO: UNLOAD completed, 210000000 record(s) unloaded successfully. UNLOAD
- allowoverwrite オプションなしはエラー
dev=# unload ('select * from customer') dev-# to 's3://redshift-unload-copy/' dev-# iam_role 'arn:aws:iam::234567890123:role/RedshiftUnloadCopy'; ERROR: S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid ...,ExtRid ...,CanRetry 1 DETAIL: ----------------------------------------------- error: S3ServiceException:Access Denied,Status 403,Error AccessDenied,Rid ...,ExtRid ...,CanRetry 1 code: 8001 context: Listing bucket=redshift-unload-copy prefix= ★ Listing bucket でエラー query: 0 location: s3_utility.cpp:839 process: padbmaster [pid=20827] -----------------------------------------------
s3:ListBucket 権限を付与
- s3:ListBucket 権限を付与すると、allowoverwrite オプションなしでも成功
dev=# unload ('select * from customer') dev-# to 's3://redshift-unload-copy/' dev-# iam_role 'arn:aws:iam::234567890123:role/RedshiftUnloadCopy'; INFO: UNLOAD completed, 210000000 record(s) unloaded successfully. UNLOAD
参考
3. IAM ロールを作成したら、バケットへのアクセス許可を付与するポリシーをアタッチします。次の例のように、ポリシーを使用できます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1234537676482", "Action": [ "s3:ListBucket", "s3:PutObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::awsexamplebucket/*", "arn:aws:s3:::awsexamplebucket" ] } ] }クロスアカウント Amazon Redshift データファイルからの S3 Access Denied エラーを回避する