ablog

不器用で落着きのない技術者のメモ

Amazon Redshift から Amazon S3 へ UNLOAD 時に s3:ListBucket 権限が必要

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 エラーを回避する