Amazon web services 如何使用Terraform管理数百个AWS S3存储桶
我希望使用Terraform管理数百个AWS S3 bucket,并希望通过定义bucket名称的可变列表数组以及一些其他S3资源特定参数来创建所有这些bucket,使用for_循环遍历该列表,然后使用该数组的结果来定义bucket配置。我们遇到的问题是生命周期规则。根据bucket需求,我们的bucket有几个不同的生命周期规则,但在1000个bucket中,我们可能有10个不同的生命周期规则。使用aws cli管理bucket生命周期非常简单,这是它自己的特定命令:Amazon web services 如何使用Terraform管理数百个AWS S3存储桶,amazon-web-services,amazon-s3,terraform,lifecycle,Amazon Web Services,Amazon S3,Terraform,Lifecycle,我希望使用Terraform管理数百个AWS S3 bucket,并希望通过定义bucket名称的可变列表数组以及一些其他S3资源特定参数来创建所有这些bucket,使用for_循环遍历该列表,然后使用该数组的结果来定义bucket配置。我们遇到的问题是生命周期规则。根据bucket需求,我们的bucket有几个不同的生命周期规则,但在1000个bucket中,我们可能有10个不同的生命周期规则。使用aws cli管理bucket生命周期非常简单,这是它自己的特定命令: aws s3api pu
aws s3api put-bucket-lifecycle-configuration --bucket my-bucket --lifecycle-configuration file://lifecycle_1.json
我们可以从lifecycle_X.json文件的简短列表中选择修改规则
我们遇到的问题是,地形资源“aws_s3_bucket”中的lifecycle属性不是或不能是模板?显然,它是版本11中的一个模板,但由于版本12,它必须是一些代码块。我想做的是这样的:
locals {
lifecycle_rule_1 = [
id = "rule1"
prefix = ""
enabled = true
expiration = [
{
days = 30
}
]
lifecycle_rule_2 = [
id = "rule2"
prefix = ""
enabled = true
expiration = [
{
days = 60
}
]
}
resource "aws_s3_bucket" "bucket" {
for_each = locals.bucket_definitions
bucket = "my-bucket"
acl = "private"
lifecycle_rule = [locals.lifecycle_rule_1]
}
这里有没有人提出过类似的问题和解决方案?
谢谢遗憾的是,这种功能不受支持。GitHub上已经有了未来的请求:
另一种方法是使用自定义解决方案来设置生命周期,例如通过AWS CLI或通过AWS SDK使用。您可以在
本地
中创建映射,如下所示:
locals {
lifecycle_rules = {
lifecycle_rule_1 = {
id = "rule1"
prefix = ""
enabled = true
expiration = [
{
days = 30
}
]
}
lifecycle_rule_2 = {
id = "rule2"
prefix = ""
enabled = true
expiration = [
{
days = 60
}
]
}
}
}
然后像这样使用它们:
resource "aws_s3_bucket" "bucket" {
for_each = local.bucket_definitions
bucket = each.value.bucket
acl = each.value.acl
lifecycle_rule {
id = local.lifecycle_rules[each.value.lifecycle_rule_name].id
prefix = local.lifecycle_rules[each.value.lifecycle_rule_name].prefix
enabled = local.lifecycle_rules[each.value.lifecycle_rule_name].enabled
expiration = local.lifecycle_rules[each.value.lifecycle_rule_name].expiration
}
}
基本上,您需要在local.bucket\u定义.lifecycle\u规则\u名称
中创建完全相同的名称之间的映射,以与上面在local.lifecycle\u规则
中定义的映射键相匹配此外,您可能需要在lifecycle_规则映射中有一些默认值,以防您的一些规则使用的属性不完全相同