S3のファイルコピーでAccessDeniedが発生した原因と解決方法
はじめに
こんにちは、クロスインダストリー第1本部の竹村です。
Amazon S3で「既存のオブジェクトをコピーして別名で保存する」という、ごく一般的な処理を行っていたのですが、ある時を境にAccessDenied(アクセス拒否)が発生し、処理が失敗するようになりました。
今回はその原因と解決方法を紹介したいと思います。
前提と発生した課題
処理の前提
バケットのオブジェクトをコピーして同じバケット内にアーカイブする処理があり、アクセス元のIAMポリシーでは以下の基本的な権限を設定していました:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::my-test-bucket" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::my-test-bucket/*" } ] }
これまではこの権限で正常に動作していました。
発生した課題
突然、同じ設定でファイルコピー処理がAccessDeniedエラーで失敗するようになりました。
aws s3 cp s3://my-test-bucket/test.txt s3://my-test-bucket/copied-success.txt --profile test-user
エラー:
copy failed: s3://my-test-bucket/test.txt to s3://my-test-bucket/copied-success.txt An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied
CloudTrailログを確認すると、以下のエラーが記録されていました:
{ "eventTime": "2026-03-01T07:44:43Z", "eventName": "CopyObject", "errorCode": "AccessDenied", "errorMessage": "Access Denied", "requestParameters": { "bucketName": "my-test-bucket", "key": "copied-success.txt", "x-amz-copy-source": "my-test-bucket/test.txt" }, "responseElements": null }
原因調査と解決方法
AWSドキュメントの調査
AWS公式ドキュメントを調べた結果、以下の記述を発見しました:
オブジェクトタグのあるオブジェクトをコピーするには、IAM ID にs3:GetObjectTagging と s3:PutObjectTagging の権限が必要です。ソースオブジェクトに対する s3:GetObjectTagging 権限と宛先バケット内のオブジェクトに対する s3:PutObjectTagging 権限が必要です。
参考:Amazon S3 ユーザーガイド - オブジェクトタグの管理
原因
実はこのエラーが発生する少し前に、このバケットのオブジェクトに自動でタグづけをする処理を入れていました。つまり、オブジェクトにタグが付くようになったため、これまで問題なかったIAMの権限が不足するようになったのです。
S3でファイルコピーを行う際、オブジェクトにタグが付与されている場合、AWS内部ではタグ情報も含む完全なオブジェクト複製を行っています。そのため、以下の権限が必要になります:
s3:GetObject- 元ファイルの内容にアクセスs3:PutObject- コピー先でファイルを作成s3:GetObjectTagging- 元ファイルのタグ情報を読み取りs3:PutObjectTagging- 新しいファイルにタグ情報を設定
解決策の実装
IAMポリシーに不足していたタグ関連権限を追加しました:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": "arn:aws:s3:::my-test-bucket" }, { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:GetObjectTagging", "s3:PutObjectTagging" ], "Resource": "arn:aws:s3:::my-test-bucket/*" } ] }
追加した権限:
- s3:GetObjectTagging: 元ファイルのタグ情報を取得
- s3:PutObjectTagging: 新しいファイルにタグ情報を設定
結果
タグ権限を追加した後、同じコピー操作を再実行:
aws s3 cp s3://my-test-bucket/test.txt s3://my-test-bucket/copied-success.txt --profile test-user
結果:
copy: s3://my-test-bucket/test.txt to s3://my-test-bucket/copied-success.txt
エラーが出なくなり、コピーが成功するようになりました。
タグ情報も正しく継承されていることを確認:
aws s3api get-object-tagging --bucket my-test-bucket --key copied-success.txt --profile test-user
まとめ
今回は自動タグ付け機能を追加したことで、これまで動いていたS3のファイルコピー処理が突然失敗するようになった事例を共有させていただきました。 今回の経験を踏まえて、今後はバケットの設定やオブジェクトに変更を加える際は、関連する権限についても合わせて確認するようにしたいと思います。
竹村綾香(記事一覧)
2024年5月入社。オンプレミスのネットワークエンジニアからクラウドエンジニアに転身しました!好きな食べ物はラーメン二郎です