🗂

[Amplify]boto3でS3のオブジェクトを操作するときの権限を付与する。

2024/05/21に公開

はじめに

Pythonでboto3を使用してS3バケットのオブジェクトを操作するときに、エラーにハマったので、メモとして残しておきます。

エラーの内容

boto3を使用して、S3のオブジェクトを操作しようとしたときに、以下のエラーが発生した。

An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied"

このエラーはS3のオブジェクトを操作するにあたって、権限が足りていないことが原因です。
しかし、以下のように権限は付与されていました。

{
 "Version": "2012-10-17",
 "Statement": [
    {
        "Action": [
            "s3:GetObject",
            "s3:ListObject"
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/folderA/folderB",
            "arn:aws:s3:::bucket-name/folderC/folderD",
            "arn:aws:s3:::bucket-name/folderE/folderF"
        ],
        "Effect": "Allow"
    }
 ]
}

ここでなぜ権限が付与されていないのかで詰まりました。

解決方法

以下のサイトに解決方法が書いてありました。

https://awsjp.com/AWS/Faq/c/Access-Denied-Remove-S3Object-5416.html

ポリシーは以下のように、「/」をつけないARNと、「/」をつけるARNを記述しなければいけないみたいです。

{
 "Version": "2012-10-17",
 "Statement": [
    {
        "Action": [
            "s3:GetObject",
            "s3:ListObject"
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/folderA/folderB",
            "arn:aws:s3:::bucket-name/folderC/folderD",
            "arn:aws:s3:::bucket-name/folderE/folderF",
            "arn:aws:s3:::bucket-name/folderA/folderB/*",
            "arn:aws:s3:::bucket-name/folderC/folderD/*",
            "arn:aws:s3:::bucket-name/folderE/folderF/*"
        ],
        "Effect": "Allow"
    }
 ]
}

Discussion