You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)的操作权限,导致权限不足。

解决办法

  1. 更新存储桶策略,添加存储桶级权限
    修改第二个Statement的Resource,同时包含存储桶本身和所有对象:

    "Resource": [
        "arn:aws:s3:::my-local-bucket",
        "arn:aws:s3:::my-local-bucket/*"
    ]
    

    确保用户拥有存储桶及所有对象的完整操作权限。

  2. 跳过目录创建,直接上传带路径的文件
    S3不需要提前创建目录,直接上传images/blog/photo.jpg这类带完整路径的文件,S3会自动生成对应的目录结构用于展示。可以调整Flysystem配置,禁用自动创建目录的逻辑,或者上传时直接指定完整文件路径。

  3. 排查其他限制因素

    • 确认存储桶未开启对象锁等特殊配置;
    • 检查是否存在IAM权限边界、组织SCP限制了用户的S3操作;
    • 验证当前使用的AWS凭证确实属于local用户,未混用其他角色或用户的凭证。

内容的提问来源于stack exchange,提问作者Sebastian Sulinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:01:02