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

问题描述 投票:0回答:2

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

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

谢谢。

amazon-web-services terraform vpc
2个回答
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,这可能很有用。

我曾与之合作过的一些客户更喜欢在高级工程师可以访问的单独的terraform脚本中管理vpcs / subnets(和其他核心基础架构)等资源。 这可以避免人们意外破坏底层基础设施的灾难情景。

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

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


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 import指示Terraform这个资源块使用现有VPC它由AWS分配的ID相关联:

terraform import aws_vpc.example vpc-abcd1234

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

一旦你完成了这个,Terraform将认为自己是VPC的所有者,因此如果配置建议应该这样做,它将计划在未来的运行中更新或销毁它。 如果任何其他系统以前管理过这个VPC,重要的是要阻止它这样做,否则这个其他系统可能会与Terraform发生冲突。


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

在这种情况下,您可以使用aws_vpc数据源 ,它可以通过各种属性查找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放入参数存储参数并使用aws_ssm_parameter数据源检索它。

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

© www.soinside.com 2019 - 2024. All rights reserved.