在 Terraform 中使用创建的资源的最佳实践是什么?

use*_*406 1 vpc amazon-web-services terraform

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

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

谢谢。

Mar*_*ins 5

在与现有对象集成时,您首先必须在两个选项之间做出决定:您可以将这些对象导入 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
Run Code Online (Sandbox Code Playgroud)

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

terraform import aws_vpc.example vpc-abcd1234
Run Code Online (Sandbox Code Playgroud)

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

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


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

在这种情况下,你可以使用aws_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
Run Code Online (Sandbox Code Playgroud)

在某些情况下,用户会引入额外的间接方式来查找 VPC,而不是直接查询 AWS VPC API。这是一种更先进的配置和这里的选项是相当广泛的,但例如,如果你正在使用你SSM参数商店可以放置VPC成参数存储参数,并使用检索它aws_ssm_parameter数据源

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