【问题标题】:What's the best practice to use created resources in Terraform?在 Terraform 中使用已创建资源的最佳实践是什么?
【发布时间】:2019-06-05 02:39:41
【问题描述】:

我将在 AWS 上启动一个新的 Terraform 项目。 VPC 已经创建,我想知道将它集成到我的代码中的最佳方式是什么。我是否必须再次创建它,Terraform 会检测到它并且不会覆盖它?还是我必须为此使用数据源?还是有其他最好的方法,比如 Terraform Import ?

我还希望将来能够在其他区域或其他账户中部署整个基础架构。

谢谢。

【问题讨论】:

标签: amazon-web-services terraform vpc


【解决方案1】:

在与现有对象集成时,您首先必须在两个选项之间做出决定:您可以将这些对象导入 Terraform 并使用 Terraform 来管理它们,或者您可以让它们由任何现有系统管理并使用它们在 Terraform 中的引用。


如果您希望使用 Terraform 来管理这些现有对象,您必须首先为对象编写配置,就像 Terraform 将自己创建它一样:

resource "aws_vpc" "example" {
  # fill in here all the same settings that the existing object already has

  cidr_block = "10.0.0.0/16"
}

# Can then use that vpc's id in other resources using:
#    aws_vpc.example.id

但是,您可以先运行terraform import,而不是立即运行terraform apply,以指示Terraform 使用AWS 分配的ID 将此资源块与现有VPC 相关联:

terraform import aws_vpc.example vpc-abcd1234

如果您随后运行terraform plan,您应该会看到不需要更改,因为 Terraform 检测到配置与现有对象匹配。如果 Terraform确实提出了一些更改,您可以通过运行 terraform apply 接受它们,或者继续更新配置,直到它与现有对象匹配。

完成此操作后,Terraform 将认为自己是 VPC 的所有者,因此如果配置建议它应该这样做,则计划在未来运行时更新或销毁它。如果任何其他系统之前管理过此 VPC,请务必阻止它这样做,否则此其他系统可能会与 Terraform 冲突。


如果您希望保留管理 VPC 的任何现有系统,您还可以使用 Data Sources 功能来查找现有 VPC,而无需由 Terraform 负责。

在这种情况下,您可以使用the aws_vpc data source,它可以通过各种属性查找 VPC。一个常见的选择是通过标签查找 VPC,假设您的环境有一个可预测的标签方案,允许您描述您正在寻找的单个 VPC:

data "aws_vpc" "example" {
  tags = {
    Name = "example-VPC-name"
  }
}

# Can then use that vpc's id in other resources using:
#    data.aws_vpc.example.id

在某些情况下,除了直接查询 AWS VPC API 之外,用户还会引入额外的间接查找 VPC 的方法。这是一个更高级的配置,这里的选项非常广泛,但例如,如果您使用 SSM 参数存储,您可以将 VPC 放入参数存储参数中并使用the aws_ssm_parameter data source 检索它。

如果管理 VPC 的现有系统是 CloudFormation,您还可以使用 aws_cloudformation_exportaws_cloudformation_stack 从 CloudFormation API 中检索信息。

【讨论】:

    【解决方案2】:

    如果您乐于通过 terraform 继续管理它,那么您可以将现有资源导入您的 terraform 状态。这是它的使用页面https://www.terraform.io/docs/import/usage.html

    您必须首先在配置中为 vpc 定义一个资源块。你可以这样做:

    resource "aws_vpc" "existing" {
      cidr_block       = "172.16.0.0/16"
    
      tags = {
        Name = "prod"
      }
    }
    

    然后在 cli 上运行命令

    terraform import aws_vpc.existing <vpc-id>
    

    确保之后运行 terraform 计划,因为 terraform 可能会尝试对其进行更改。您必须通过将所有必要的配置添加到 aws_vpc 资源来对其进行一些逆向工程。一旦对齐,terraform 将不会尝试更改它。然后,您可以重新使用它来部署到其他帐户和区域。

    正如您所建议的,您可以为 vpc 使用数据源。如果您想在 terraform 之外对其进行管理,这可能会很有用,而不是在没有经验的用户运行 vpc 时有可能破坏它。

    与我合作过的一些客户更喜欢在只有高级工程师才能访问的单独 terraform 脚本中管理 vpcs/子网(和其他核心基础架构)等资源。这样可以避免人们不小心破坏底层基础设施的灾难场景。

    我个人更喜欢在 git 存储库中管理我的所有 terraform 代码,然后使用 CI/CD 工具进行部署,即使它只是我自己的工作。有些人可能看不到花时间创建管道的价值,可能会坚持在本地运行。

    这篇文章对在自动化环境中运行 terraform 有一些很好的建议 https://learn.hashicorp.com/terraform/development/running-terraform-in-automation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 2013-05-17
      相关资源
      最近更新 更多