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

AWS S3存储图片自行删除问题排查与解决请求

问题

使用Python Django框架搭建服务器,通过AWS S3存储上传的图片,借助django-storages库处理S3相关操作。目前遇到的问题是:图片会自行消失(非Django服务器操作),但数据库中仍保留图片的URL。已将S3存储桶策略修改为仅允许s3:GetObject操作,但问题依旧存在。

相关配置

settings.py中的django-storages配置

AWS_SECRET_ACCESS_KEY = S3['secret_key']
AWS_REGION = 'ap-northeast-2'
AWS_STORAGE_BUCKET_NAME = 'loopusimage'
AWS_S3_CUSTOM_DOMAIN = '%s.s3.%s.amazonaws.com' % (
    AWS_STORAGE_BUCKET_NAME, AWS_REGION)
AWS_DEFAULT_ACL = None
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024000000
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024000000
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage  # 注意:此处缺少闭合单引号,属于语法错误

修改后的S3存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::loopusimage/*"
        }
    ]
}

排查与解决建议

  • 优先定位删除操作来源
    启用AWS CloudTrail追踪S3桶的所有API操作,找到触发s3:DeleteObject/s3:DeleteObjectVersion请求的实体(IAM用户、角色、服务等);同时开启S3桶的访问日志,记录所有请求细节,确认删除操作的发起方。
  • 检查IAM权限配置
    确认Django服务使用的AWS_SECRET_ACCESS_KEY对应的IAM用户/角色,是否被授予了s3:DeleteObject等删除类权限;同时排查其他有权限访问该桶的IAM实体(如其他团队成员账号、关联的EC2/Lambda角色),是否存在不必要的删除权限。
  • 检查S3桶的生命周期规则与版本控制
    查看桶是否配置了生命周期规则,比如设置了自动删除过期文件、过渡到归档存储后删除源文件等规则;若开启了版本控制,可在S3控制台查看历史版本,确认是否是当前版本被删除。
  • 修正settings.py语法错误
    配置中DEFAULT_FILE_STORAGE末尾缺少闭合单引号,会导致Django加载存储后端失败,可能引发异常行为,修正为:
    DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
    
  • 验证存储桶策略有效性
    桶策略仅限制了公开的s3:GetObject权限,但桶的所有者默认拥有所有权限,若有其他IAM权限允许删除操作,桶策略不会覆盖这些权限。可使用IAM Access Analyzer验证桶策略是否符合预期。
  • 排查第三方工具/服务
    确认是否有其他工具(如备份同步软件、CDN服务)或内部服务,被授权访问该S3桶并执行了删除操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:20:33