在与现有对象集成时,您首先必须在两个选项之间做出决定:您可以将这些对象导入 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_export 或 aws_cloudformation_stack 从 CloudFormation API 中检索信息。