【问题标题】:Why is terraform ignoring a manually created s3 bucket?为什么 terraform 忽略手动创建的 s3 存储桶?
【发布时间】:2019-12-18 23:35:16
【问题描述】:

我发现我的 aws 帐户中有一个不是由 terraform 创建的存储桶。

我想确保它在我的 terraform 存储库中进行了说明,但在添加它之前,我运行了 terraform plan 并得到以下响应:

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

这很奇怪,因为当我运行 aws s3 ls 时,我看到了存储桶:

#not real names from obvious reasons
2019-07-15 13:33:16 bucket-from-terrform
2019-07-15 13:19:26 terraform-state-bucket
2019-07-23 17:47:26 bucket-created-manually

更重要的是,当我添加一个名称与之前忽略的存储桶匹配的资源时,terraform 会尝试添加它(即使它已经存在)

发生了什么? terraform 忽略该存储桶的原因可能是什么?

【问题讨论】:

    标签: amazon-s3 terraform


    【解决方案1】:

    Terraform 是声明式的,您可以定义所需的资源,它会为您创建和管理它们。它只能管理它在州内知道的资源。要让 terraform 管理手动创建的资源,您可以import 进入状态。

    对于 s3 存储桶,您将通过存储桶名称 https://www.terraform.io/docs/providers/aws/r/s3_bucket.html#import 导入

    所以如果你的 terraform 看起来像

    resource "aws_s3_bucket" "my-bucket" {
      bucket = "bucket-created-manually"
      acl    = "private"
    }
    

    你会使用命令

    terraform import aws_s3_bucket.my-bucket bucket-created-manually
    

    然后在您下次运行计划时,terraform 会知道并能够管理它。

    【讨论】:

      【解决方案2】:

      Terraform 仅管理它创建的对象或显式导入 Terraform 的对象。这有几个不同的原因:

      • 这样您就可以逐步将 Terraform 引入现有系统。您可以通过将其用于一些新建基础设施或导入一小部分基础设施来进行试点,以便在“全力以赴”之前获得经验。

      • 这样您的系统就可以分解成许多独立的配置。除非您的系统相对较小/简单,否则不建议将整个基础架构置于一个单个 Terraform 配置中,因为这意味着任何更改都有影响整个系统的风险。相反,通常(并且推荐)使用几个单独的配置,通常按变化率划分。例如,虚拟网络拓扑在许多系统中往往变化不大,而计算集群的大小可能会随着需求的变化而更频繁地变化。

      • 这样您将来就可以从 Terraform 迁移,而不会尝试管理或破坏现在由其他工具或流程管理的基础架构。

      如果您有一个在 Terraform 之外创建的现有对象,并且您现在想用 Terraform 管理它,则需要将其导入 Terraform 以创建资源地址之间的关联Terraform 和远程系统中对象的 id。

      对于您的 S3 示例,导入过程可能如下所示:

      • 使用存储桶名称 bucket-created-manually 和适用于现有存储桶的任何其他设置在您的配置中写入 resource "aws_s3_bucket" "example" 块。
      • 在命令行中,运行terraform import 'aws_s3_bucket.example' 'bucket-created-manually'
      • 运行terraform plan 以验证配置是否与导入的远程对象匹配。如果不是,请调整配置以匹配远程对象或运行terraform apply 以更新远程对象以匹配配置,具体取决于您认为在您的情况下哪个“更正确”。

      【讨论】:

        猜你喜欢
        • 2021-08-14
        • 1970-01-01
        • 2022-11-03
        • 2021-10-21
        • 2020-08-21
        • 2020-03-29
        • 2022-01-16
        • 2021-03-24
        • 2020-03-23
        相关资源
        最近更新 更多