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

更换AWS区域部署Flask应用后遇S3 '不允许ACLs'报错求助

解决AWS Elastic Beanstalk部署Flask+S3应用时的"The bucket does not allow ACLs"错误

问题根源

你的代码大概率在上传S3对象时指定了ACL参数,而新区域的S3桶默认启用了Bucket owner enforced(桶所有者强制)模式,该模式会禁用ACLs,任何尝试设置ACL的操作都会触发报错。旧区域的桶可能是在该模式普及前创建的,或者当时的配置允许隐式权限,而新桶严格遵循了禁用ACLs的规则。

解决步骤

  • 移除boto3代码中的ACL参数
    找到所有调用S3上传方法(如put_object、upload_file、upload_fileobj)的代码,删除其中的ACL参数。比如:
    原代码:

    s3_client.put_object(
        Bucket="your-bucket-name",
        Key="path/to/image.jpg",
        Body=image_data,
        ACL="private"  # 这个参数要删掉
    )
    

    修改后:

    s3_client.put_object(
        Bucket="your-bucket-name",
        Key="path/to/image.jpg",
        Body=image_data
    )
    

    禁用ACLs的桶不需要设置ACL,对象的权限由IAM角色或桶策略直接控制。

  • 配置Elastic Beanstalk实例的IAM角色权限
    确保EB环境使用的EC2实例角色(通常是aws-elasticbeanstalk-ec2-role)拥有访问新S3桶的权限,添加如下IAM策略:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::your-new-bucket",
                    "arn:aws:s3:::your-new-bucket/*"
                ]
            }
        ]
    }
    

    不要依赖ACLs来控制对象访问,改用IAM权限或桶策略实现权限管控。

  • 确认S3桶的所有权设置
    进入新S3桶的权限设置,确认对象所有权为Bucket owner enforced(这是当前默认),保持阻止所有公共访问开启,ACLs禁用的状态即可,无需修改。

  • 验证boto3的区域配置
    确保代码中boto3客户端指定的区域与新S3桶的区域一致,比如:

    import boto3
    s3_client = boto3.client('s3', region_name='ap-southeast-1')  # 替换为你的新区域
    

    同时确保boto3使用EB实例的默认IAM角色认证,避免硬编码Access Key/Secret Key导致的权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:52:06