0

我想使用 lambda 和 boto3 向 S3 存储桶添加多个生命周期规则。但是,使用 boto3,它似乎只允许您添加 1 个生命周期规则,这也会覆盖已经存在的规则。

例如,执行以下操作只会覆盖我拥有的任何预先存在的规则以及新编写的规则,并且只保留列表中的最后一个:

bucket_name = "test-bucket"
folder_paths = ["test_folder","test_folder1", "test_folder2"]
expiration = 1

for folder_path in folder_paths:
    client = boto3.client('s3')
    response = client.put_bucket_lifecycle_configuration(
        Bucket=bucket_name,
        LifecycleConfiguration={
            'Rules': [
                {
                    'Expiration': {
                        'Days': expiration
                    },
                    'ID': folder_path,
                    'Filter': {
                        'Prefix': folder_path
                    },
                    'Status': 'Enabled'
                }
            ]
        }
    )

当然,使用 AWS 控制台可以在一个存储桶上添加多个单独的 S3 生命周期配置。

与 类似put_bucket_lifecycle_configuration,我也尝试过put_bucket_lifecycle,这给了我相同的结果。

有什么方法可以使用 boto3 在存储桶上添加多个 S3 生命周期配置?我错过了一些明显的东西吗?

任何帮助表示赞赏,并提前感谢!

4

1 回答 1

3

当然,使用 AWS 控制台可以在一个存储桶上添加多个单独的 S3 生命周期配置。

每个存储桶都有 1 个生命周期配置,最多可以有 1000 条规则。您的控制台可能会显示类似的内容:

在此处输入图像描述

这些不是不同的生命周期配置,它们是同一生命周期配置的不同规则部分。

在输入中,put_bucket_lifecycle_configuration我们可以看到我们可以传递一个规则列表,其中可以包含 1 个或更多(最多 1000 个)规则。

for folder_path in folder_paths:
    client = boto3.client('s3')
    response = client.put_bucket_lifecycle_configuration(
        Bucket=bucket_name,
        LifecycleConfiguration={
            'Rules': [
                {
                    'Expiration': {
                        'Days': expiration
                    },
                    'ID': id_rule_1,
                    'Filter': {
                        'Prefix': folder_path
                    },
                    'Status': 'Enabled'
                },
                {
                    'Expiration': {
                        'Days': expiration2
                    },
                    'ID': id_rule_2,
                    'Filter': {
                        'Prefix': folder_path2
                    },
                    'Status': 'Enabled'
                },
             ...
            ]
        }
    )

正如文档所说,put_bucket_lifecycle_configuration为存储桶创建新的生命周期配置或替换现有的生命周期配置。 ”如果要更新生命周期配置,则必须使用get_bucket_lifecycle_configuration检索现有规则,修改它们然后使用put_bucket_lifecycle_configuration覆盖现有配置。

于 2022-01-17T00:31:49.443 回答