【问题标题】:How to sync lifecycle_rule of s3 bucket actual configuration with terraform script如何将 s3 存储桶实际配置的生命周期规则与 terraform 脚本同步
【发布时间】:2021-04-18 19:28:31
【问题描述】:

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

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

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" => ""

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

【问题讨论】:

    标签: amazon-web-services amazon-s3 terraform


    【解决方案1】:

    它是否试图删除现有的并重新创建它?

    是的。如果规则是在 TF 之外创建的,那么就 TF 而言,它们不存在。因此 TF 将替换现有的,因为它不知道它们。 TF docs 状态:

    它 [TF] 不生成配置。

    由于您的存储桶在 TF 中没有生命周期,因此 TF 将它们视为不存在。

    当您使用任何 IoC 工具(TF、CloudFormation 等)管理基础架构时,在这些工具之外“​​手动”修改资源是一种不好的做法。这会导致所谓的resource drift,这反过来又会导致未来出现更多问题。

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

    【讨论】:

    • 感谢您的意见!是的,我注意到这是某些资源的行为。但是,通常会有一个警告,它会明确说明资源将被销毁和创建。对于这个,它似乎只是更新它并创建一个新的,这是有道理的,因为我在配置中犯了一个错误。记下下面的答案。
    【解决方案2】:

    看起来我在为 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
        }
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-17
      • 2021-02-07
      • 2022-01-02
      • 1970-01-01
      • 2022-11-29
      • 2019-01-15
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多