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

Terraform配置S3存储桶双生命周期规则是否生效的疑问

S3存储桶生命周期策略配置验证

问题描述

我有个名为my-bucket的S3存储桶,桶里有不少对象和文件夹,其中包含TestDataQA子文件夹。我想配置生命周期策略,让桶里非TestDataQA文件夹的对象30天后自动删除,TestDataQA文件夹内的对象则10000天后再删除。

我已经写了下面这段Terraform代码,并且成功执行了plan和apply,但不确定这个配置能不能按预期工作,会不会误删TestDataQA里的对象?

resource "aws_s3control_bucket_lifecycle_configuration" "my-lifecycle-conf" {
  bucket = "my-bucket"
    
  rule {
    id = "thousands-days-data"
    expiration {
      days = 10000
    }
    filter {
      prefix = "TestDataQA/"
    }
    status = "Enabled"
  }
    
  rule {
    id = "30-days-data"
    expiration {
      days = 30
    }
    status = "Enabled"
  }
}

问题分析

当前配置肯定会误删TestDataQA里的对象,原因如下:

  • S3的生命周期规则是只要对象匹配规则就会触发,一个对象可以同时匹配多个规则。
  • TestDataQA/路径下的对象会同时命中两个规则:第一个规则匹配TestDataQA/前缀,第二个规则没有任何过滤条件,相当于匹配所有对象。
  • 当同一个对象被多个过期规则匹配时,S3会执行过期时间最短的那个规则,也就是30天后就删除TestDataQA里的对象,完全不符合你的预期。

正确配置方案

你需要修改第二个规则,添加过滤条件排除TestDataQA/前缀的对象。利用S3生命周期规则的not过滤条件,让第二个规则只作用于非TestDataQA路径下的对象:

resource "aws_s3control_bucket_lifecycle_configuration" "my-lifecycle-conf" {
  bucket = "my-bucket"
    
  rule {
    id = "thousands-days-data"
    expiration {
      days = 10000
    }
    filter {
      prefix = "TestDataQA/"
    }
    status = "Enabled"
  }
    
  rule {
    id = "30-days-data"
    expiration {
      days = 30
    }
    filter {
      not {
        prefix = "TestDataQA/"
      }
    }
    status = "Enabled"
  }
}

验证逻辑

  • TestDataQA/下的对象:只会匹配第一个规则,10000天后过期删除。
  • 其他路径的对象:只会匹配第二个规则,30天后过期删除。
  • 这样就能实现你想要的差异化过期策略了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:16:01