3

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

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

但是是否有可能创建一个类似的规则来删除任何不在key=value对中的对象?例如,每当我的对象被访问时,我都可以用当前日期的天数来更新它的标签,例如object-last-accessed=07-26-2019. 然后我可以创建一个每天删除当前 S3 生命周期策略的 Lambda 函数,然后创建一个新的生命周期策略,该策略在过去 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 天的对象不同)。

4

2 回答 2

1

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

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

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

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

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

现在设置生命周期规则以在 10 天(或任何您想要的)后删除带有“默认”标签的对象。添加附加规则以删除带有该日期后 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>
于 2020-05-19T13:20:48.940 回答
1

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

于 2020-05-21T09:19:38.543 回答