S3 生命周期策略删除没有特定标记值的所有对象

S3 Lifecycle Policy Delete All Objects WITHOUT A Certain Tag Value

在阅读 this S3 Lifecycle Policy document 时,我发现可以删除包含特定 key=value 对的 S3 对象,例如

<LifecycleConfiguration>
    <Rule>
        <Filter>
           <Tag>
              <Key>key</Key>
              <Value>value</Value>
           </Tag>
        </Filter>
        transition/expiration actions.
        ...
    </Rule>
</LifecycleConfiguration>

但是是否可以创建一个类似的规则来删除 key=value 对中的任何对象 NOT?例如,无论何时访问我的对象,我都可以使用当前日期更新它的标签,例如 object-last-accessed=07-26-2019。然后我可以创建一个 Lambda 函数,每天删除当前的 S3 生命周期策略,然后创建一个新的生命周期策略,其中每一天都有一个最近 30 天的标签,然后我的生命周期策略将自动删除在最近 30 天;访问时间超过 30 天的任何内容的日期值都将早于生命周期策略中的任何值,因此它将被删除。

这是我想要的示例(注意我添加了所需的字段 <exclude>

<LifecycleConfiguration>
    <Rule>
        <Filter>
           <exclude>
              <Tag>
                 <Key>last-accessed</Key>
                 <Value>07-30-2019</Value>
              </Tag>
              ...
              <Tag>
                 <Key>last-accessed</Key>
                 <Value>07-01-2019</Value>
              </Tag>
           <exclude>
        </Filter>
        transition/expiration actions.
        ...
    </Rule>
</LifecycleConfiguration>

是否可以像我虚构的 <exclude> 值一样?我想删除过去 30 天内未访问过的所有 S3 对象(这与超过 30 天的对象不同)。

据我了解,这是可能的,但需要通过不同的机制。

我的解决方案是采用稍微不同的方法,为每个对象设置一个标签,然后根据需要更改该标签。 因此,在您的实例中,当创建对象时,将对象上次访问设置为 "default" 通过 S3 触发器对一段 Lambda 或当对象写入 S3 时执行此操作。

访问对象时,将标签值更新为当前日期。

如果您已经有一个装满对象的存储桶,您可以使用 S3 批处理将标签设置为当前日期,并将其用作增量参考点,从中假定文件是上次访问的

https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html

现在设置生命周期规则以在 10 天(或任何您想要的)后删除带有 "default" 标签的对象。 添加附加规则以删除带有日期标记的文件,该日期在该日期之后 10 天。您需要定期更新生命周期规则,但一次可以创建 1000 个。 该文档提供了规则的正式细节 https://docs.aws.amazon.com/AmazonS3/latest/API/API_LifecycleRule.html 我建议这样

<LifecycleConfiguration>
    <Rule>
        <ID>LastAccessed Default Rule</ID>
        <Filter>
            <Tag>
                <Key>object-last-accessed</Key>
                <Value>default</Value>
            </Tag>
        </Filter>
        <Status>Enabled</Status>
        <Expiration>
            <Days>10</Days> 
        </Expiration>
    </Rule>
    <Rule>
        <ID>Last Accessed 2020-05-19 Rule</ID>
        <Filter>
            <Tag>
                <Key>object-last-accessed</Key>
                <Value>2020-05-19</Value>
            </Tag>
        </Filter>
        <Status>Enabled</Status>
        <Expiration>
            <Date>2020-05-29</Date> 
        </Expiration>
    </Rule>
</LifecycleConfiguration>

进一步阅读,当我遇到这个问题时,另一种方法是只使用对象锁定保留模式,它允许您在存储桶上设置默认保留,然后将该保留期更改为文件被访问。这适用于版本级别,即每个版本保留一段时间而不是整个文件,因此可能不适合所有人。 https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock-overview.html#object-lock-retention-modes

中有更多详细信息