使用Flysystem在AWS S3创建目录时遭遇AccessDenied错误求助
使用Flysystem操作AWS S3创建目录时出现AccessDenied的问题
问题详情
使用Flysystem操作AWS S3存储桶时,能正常上传文件,但创建images/blog这类目录时,频繁返回AccessDenied错误。存储桶已开启“阻止所有公开访问”,相关权限配置如下:
存储桶策略
{ "Version": "2008-10-17", "Id": "PolicyForCloudFrontPrivateContent", "Statement": [ { "Sid": "AllowCloudFrontServicePrincipal", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-local-bucket/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::***:distribution/***" } } }, { "Sid": "2", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::***:user/local" }, "Action": "s3:*", "Resource": "arn:aws:s3:::my-local-bucket/*" } ] }
IAM local用户策略
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:*", "s3-object-lambda:*" ], "Resource": "*" } ] }
具体错误信息
Error executing "PutObject" on "https://s3.eu-west-2.amazonaws.com/my-local-bucket/images/blog/"; AWS HTTP error: Client error: `PUT https://s3.eu-west-2.amazonaws.com/my-local-bucket/images/blog/` resulted in a `403 Forbidden` response: <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>***(truncated...) AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>***</RequestId><HostId>***</HostId></Error>
原因分析及解决办法
核心原因
AWS S3本身不存在真实的“目录”,所谓目录是通过带斜杠后缀的空对象模拟实现的。Flysystem创建目录时,本质是发送PutObject请求上传一个名为images/blog/的空对象。
你的存储桶策略中,给local用户授权的Resource是arn:aws:s3:::my-local-bucket/*,仅覆盖了存储桶下的对象,但创建空目录对象时,S3会额外校验对存储桶本身(arn:aws:s3:::my-local-bucket)的操作权限,导致权限不足。
解决办法
更新存储桶策略,添加存储桶级权限
修改第二个Statement的Resource,同时包含存储桶本身和所有对象:"Resource": [ "arn:aws:s3:::my-local-bucket", "arn:aws:s3:::my-local-bucket/*" ]确保用户拥有存储桶及所有对象的完整操作权限。
跳过目录创建,直接上传带路径的文件
S3不需要提前创建目录,直接上传images/blog/photo.jpg这类带完整路径的文件,S3会自动生成对应的目录结构用于展示。可以调整Flysystem配置,禁用自动创建目录的逻辑,或者上传时直接指定完整文件路径。排查其他限制因素
- 确认存储桶未开启对象锁等特殊配置;
- 检查是否存在IAM权限边界、组织SCP限制了用户的S3操作;
- 验证当前使用的AWS凭证确实属于local用户,未混用其他角色或用户的凭证。
内容的提问来源于stack exchange,提问作者Sebastian Sulinski
相关产品推荐
相关产品推荐

