BioErrorLog Tech Blog

試行錯誤の記録

S3 ListBucketsの実行に必要なIAM権限 | AWS

S3 ListBucketsの実行に必要なIAM PolicyのAction権限について整理します。

はじめに

おはよう。@bioerrorlogです。

S3のAPIを利用する際のIAM Policy設定にはしばしば悩まされます。 S3から提供されているAPIをそのままIAM Policyの"Action"として指定できないことが多いからです。

例えばS3のListBucketsを実行する際、IAM Policyの"Action"に"s3:ListBuckets"としてそのまま権限を指定することはできません。 IAM PolicyのActionテーブルには"s3:ListBuckets"は定義されていないからです。


[関連記事] IAM Policyの"Action"に指定できる権限の一覧はどこにあるのか


そこで今回は、S3のListBuckets実行に必要なIAM PolicyのAction権限について整理します。

検証方法

Lambdaからboto3のlist_buckets()を実行し、必要なIAM Policy権限を調べます。

f:id:BioErrorLog:20210123124952p:plain
LambdaからListBucketsを発行し、必要なIAM権限を調べる

Lambdaでは、以下のシンプルなコードを実行します:

import boto3

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    
    response = s3_client.list_buckets()
    print(response)
  • Lambda runtime:
    Python 3.8

  • boto3 version:
    boto3-1.15.16 botocore-1.18.16

S3 ListBucketsの実行に必要なIAM権限

結論

まず結論から言うと、必要なAction権限は以下の2つです:

  • "s3:ListBucket"
  • "s3:ListAllMyBuckets"

IAM Policyドキュメントは以下のようになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        }
    ]
}


以降、ListBucketsの実行に必要なIAM権限を検証していきます。

検証

まず、S3への権限を何も付与せずにLambdaを実行すると、以下のエラーが出力されます。

[ERROR] ClientError: An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied

当然ですが、AccessDeniedエラーが出ました。


次に、試しに"s3:ListBuckets"の権限を指定してみます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBuckets"
            ],
            "Resource": "*"
        }
    ]
}

こちらも当然、同様のAccessDeniedエラーが吐かれました。 "s3:ListBuckets"というActionは定義されていないからです。


次は、"s3:ListBucket"または"s3:ListAllMyBuckets"の権限をそれぞれ単体で付与して実行してみます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "*"
        }
    ]
}

または

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        }
    ]
}

しかし、どちらのケースも同様のAccessDeniedエラーが吐かれました。


そして、次のように"s3:ListBucket"と"s3:ListAllMyBuckets"の両方を許可してみます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        }
    ]
}

これでようやく、エラーなくlist_buckets()を実行することが出来ました。

おわりに

今回は、S3 ListBucketsの実行に必要なIAM権限をメモしました。

S3から提供されているAPIはそのままIAM Policyの"Action"として指定できないことが多いので、よくIAM Policyの設定には苦労します。 今回はListBuckets APIについて書きましたが、他にも紛らわしい権限設定のAPIがあります。

必要なAction権限をすぐに調べられる仕組みがあればよいのですが、、
もしあれば是非教えて貰いたいです。

[関連記事]
www.bioerrorlog.work

www.bioerrorlog.work

参考

ListBuckets - Amazon Simple Storage Service

S3 — Boto3 Docs 1.17.93 documentation

Actions, resources, and condition keys for Amazon S3 - Service Authorization Reference