我将在AWS上启动一个新的Terraform项目。 VPC已经创建,我想知道什么是将其集成到我的代码中的最佳方法。我是否需要再次创建它,并且Terraform会检测到它并且不会覆盖它?还是我必须为此使用数据源?还是还有其他最佳方法,例如Terraform Import?
我还希望将来能够在其他地区或其他帐户中部署整个基础架构。
谢谢。
答案 0 :(得分:0)
如果您乐于通过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,则可能会破坏该vpc。
与我合作过的某些客户更喜欢在只有高级工程师才能访问的单独terraform脚本中管理vpcs /子网(和其他核心基础结构)之类的资源。这样可以避免人们意外毁坏基础设施的灾难情况。
我个人更喜欢在git存储库中管理我的所有Terraform代码,然后使用CI / CD工具对其进行部署,即使只是我自己在做。但是,有些人可能看不到花时间创建管道的价值,并且可能会坚持在本地运行。
这篇文章对在自动化环境https://learn.hashicorp.com/terraform/development/running-terraform-in-automation
中运行terraform提出了一些很好的建议答案 1 :(得分:0)
在与现有对象集成时,首先必须在两个选项之间做出选择:可以将这些对象导入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 apply
来指示Terraform使用AWS分配的ID将该资源块与现有VPC关联,而不是立即运行terraform import
:
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
在某些情况下,用户将引入其他间接方式来查找VPC,而不是直接查询AWS VPC API。这是一种更高级的配置,此处的选项相当广泛,但是例如,如果您正在使用SSM参数存储,则可以将VPC放入参数存储参数中,然后使用the aws_ssm_parameter
data source进行检索。
如果管理VPC的现有系统是CloudFormation,则还可以使用aws_cloudformation_export
或aws_cloudformation_stack
从CloudFormation API中检索信息。