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

Amazon s3 为什么terraform会忽略手动创建的s3存储桶?,amazon-s3,terraform,Amazon S3,Terraform,我发现我的aws帐户中有一个不是terraform创建的bucket 我想确保它已在我的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

我发现我的aws帐户中有一个不是terraform创建的bucket

我想确保它已在我的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时,我看到了bucket:

#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
更重要的是,当我添加一个名称与之前忽略的bucket匹配的资源时,terraform会尝试添加它,即使它已经存在


发生了什么事?terraform忽略该bucket的原因可能是什么?

terraform是声明性的,您可以定义所需的资源,它将为您创建和管理这些资源。它只能在州内管理它知道的资源。要允许terraform管理手动创建的资源,您可以将它们转换为状态

对于s3 bucket,您可以通过bucket名称导入

所以如果你的地形看起来像

资源aws_s3_桶我的桶{ bucket=手动创建的bucket acl=专用 } 你应该使用这个命令

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

下一次运行计划时,terraform将了解并能够管理它。

terraform是声明性的,您可以定义所需的资源,它将为您创建和管理这些资源。它只能在州内管理它知道的资源。要允许terraform管理手动创建的资源,您可以将它们转换为状态

对于s3 bucket,您可以通过bucket名称导入

所以如果你的地形看起来像

资源aws_s3_桶我的桶{ bucket=手动创建的bucket acl=专用 } 你应该使用这个命令

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

下一次运行计划时,terraform将了解并能够管理它。

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

这样你就可以逐渐地将地形引入到现有的系统中。您可以将其用于一些绿地基础设施,或者导入一小部分基础设施,以便在投入使用之前获得经验,从而对其进行试验

因此,您的系统可以分解为许多单独的配置。除非您的系统相对较小/简单,否则不建议将整个基础设施置于单个地形配置中,因为这意味着任何更改都有可能影响整个系统。相反,它是常见的,建议使用几种不同的配置,通常按变化率划分。例如,在许多系统中,虚拟网络拓扑往往很少改变,而计算集群的大小可能会随着需求的变化而更频繁地改变

因此,您可以在将来从Terraform迁移出去,而无需尝试管理或破坏现在由其他工具或流程管理的基础设施

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

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

使用手动创建的bucket名称bucket和应用于现有bucket的任何其他设置,在配置中编写资源aws_s3_bucket示例块。 在命令行中,运行terraform导入“aws\U s3\U bucket.示例”“手动创建的bucket”。 运行terraform plan以验证配置是否与导入的远程对象匹配。如果不是,请调整配置以匹配远程对象或运行TrRAFrm应用程序以更新远程对象以匹配配置,这取决于您认为在您的情况下哪个更正确。
Terraform只管理它创建的或显式导入Terraform的对象。这有几个不同的原因:

这样你就可以逐渐地将地形引入到现有的系统中。您可以将其用于一些绿地基础设施,或者导入一小部分基础设施,以便在投入使用之前获得经验,从而对其进行试验

因此,您的系统可以分解为许多单独的配置。除非您的系统相对较小/简单,否则不建议将整个基础设施置于单个地形配置中,因为这意味着任何更改都有可能影响整个系统。相反,它是常见的,建议使用几种不同的配置,通常按变化率划分。例如,在许多系统中,虚拟网络拓扑往往很少改变,而计算集群的大小可能会随着需求的变化而更频繁地改变

因此,您可以在将来从Terraform迁移出去,而无需尝试管理或破坏现在由其他工具或流程管理的基础设施

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

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

使用手动创建的bucket名称bucket和应用于现有bucket的任何其他设置,在配置中编写资源aws_s3_bucket示例块。 在命令行中,运行terraform导入“aws\U s3\U bucket.示例”“手动创建的bucket”。 运行terraform plan以验证配置是否与导入的远程对象匹配。如果不是,请调整配置以匹配远程对象或运行TrRAFrm应用程序以更新远程对象以匹配配置,这取决于您认为在您的情况下哪个更正确。