想删一张传错的图片,返回 AccessDenied,说明里提到 object is protected by object lock。桶的默认保留期是 30 天,模式是 COMPLIANCE。乍看像缓存或者权限的锅,追下去往往不是。
aws s3api get-object-retention --bucket b --key a.jpg aws s3api get-object-lock-configuration --bucket b aws s3api put-object-retention --bucket b --key a.jpg --retention "Mode=GOVERNANCE,RetainUntilDate=..."
追下去是这么回事:合规模式的保留期内,任何人包括账号所有者都不能删除或覆盖对象。这不是 IAM 权限问题,改策略也没用。锁定在对象写入时就生效,事后无法缩短保留期。
「对象锁 Object Lock」这类改动最怕改一半,回滚脚本先准备好,再动生产。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,先确认对象用的是 COMPLIANCE 还是 GOVERNANCE 模式;GOVERNANCE 模式有权限可以解除 但要显式授权;COMPLIANCE 只能等到期 没有绕过办法;以后上传前先确认桶的默认保留设置。
验收就看一点,GOVERNANCE 模式下带 bypass 权限能删掉对象,COMPLIANCE 模式删除仍返回 AccessDenied。
