如何将s3 bucket实际配置的lifecycle_rule与terraform脚本同步



该规则是在AWS控制台中手动设置的。我想在我的地形脚本中同步它。

我在地形脚本中定义了以下内容:

resource "aws_s3_bucket" "bucketname" {
bucket = "${local.bucket_name}"
acl = "private"
force_destroy = "false"
acceleration_status = "Enabled"
lifecycle_rule {
enabled = true,
transition {
days = 30
storage_class = "INTELLIGENT_TIERING"
}
}
lifecycle_rule {
enabled = true,
expiration {
days = 30
}
}
}

然而,当应用它时,它总是给我以下输出:

lifecycle_rule.0.transition.1300905083.date:          "" => ""
lifecycle_rule.0.transition.1300905083.days:          "" => "30"
lifecycle_rule.0.transition.1300905083.storage_class: "" => "INTELLIGENT_TIERING"
lifecycle_rule.0.transition.3021102259.date:          "" => ""
lifecycle_rule.0.transition.3021102259.days:          "0" => "0"
lifecycle_rule.0.transition.3021102259.storage_class: "INTELLIGENT_TIERING" => ""

我不确定这是什么行为,是不是试图删除现有的并重新创建它?

是否正在尝试删除现有的并重新创建它?

是。如果规则是在TF之外创建的,那么就TF而言,它们并不存在。因此,TF将取代现有的,因为它没有意识到它们。TF文件说明:

它[TF]不生成配置。

由于您的bucket在TF中没有生命周期,TF将其视为不存在。

当您使用任何IoC工具(TF、CloudFormation…(管理您的基础设施时,修改资源是一种的坏做法;"手动";,在这些工具之外。这导致了所谓的资源漂移,而这反过来又可能导致未来出现更多问题。

在您的情况下,您必须在TF中重新创建规则,这意味着手动规则将被替换,或者导入它们。但是,不能导入资源的单个属性。因此,您必须导入bucket。

看起来我只是在为days参数设置值时犯了一个愚蠢的错误。与手动更新相同的正确配置是:

resource "aws_s3_bucket" "bucketname" {
bucket = "${local.bucket_name}"
acl = "private"
force_destroy = "false"
acceleration_status = "Enabled"
lifecycle_rule {
enabled = true,
transition {
storage_class = "INTELLIGENT_TIERING"
}
}
lifecycle_rule {
enabled = true,
expiration {
days = 30
}
}
}

最新更新