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
相关产品推荐
相关产品推荐

