为什么terraform会忽略手动创建的s3存储桶?

时间:2019-08-12 11:27:51

标签: amazon-s3 terraform

我发现我的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忽略该存储桶的原因可能是什么?

2 个答案:

答案 0 :(得分:1)

Terraform是声明性的,您可以定义所需的资源,它将为您创建和管理它们。它只能管理状态内已知的资源。要允许terraform管理手动创建的资源,可以将它们import进入状态。

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

进行导入

所以,如果您的地形看起来像

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

您将使用命令

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

,然后下次您运行计划时,terraform将知道它并能够对其进行管理。

答案 1 :(得分:0)

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

  • 以便您可以将Terraform逐步引入到现有系统中。您可以通过将其用于某些未开发的基础架构或通过导入基础架构的一小部分来进行试用,以便在全面学习之前获得经验。

  • 以便您的系统可以分解为许多单独的配置。除非您的系统相对较小/简单,否则不建议将整个基础结构配置为单个 Terraform配置,因为这意味着任何更改都可能影响整个系统。取而代之的是,(建议使用)几个单独的配置,通常按变化率进行拆分。例如,在许多系统中,虚拟网络拓扑往往不经常更改,而计算群集的大小可能会根据更改的需求而更频繁地更改。

  • ,以便您将来可以从Terraform迁移 ,而无需尝试管理或破坏现在由其他工具或流程管理的基础结构。

如果您有一个在Terraform外部创建的现有对象,并且现在要使用 Terraform对其进行管理,则需要将其导入Terraform以便在以下位置创建资源地址之间的关联Terraform和远程系统中对象的ID。

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

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