我在一个 Terraform 计划中创建了 VPC、子网和安全组(我们称之为Plan A
)。它执行得很好,状态也存储在远程 S3 后端。
现在我有一个新的 Terraform 计划(我们称之为Plan B
),我需要在其中启动一个 EC2 实例。为此,我需要从Plan A
Terraform 输出中获取 VPC、子网 ID。
有推荐的方法吗?
我在一个 Terraform 计划中创建了 VPC、子网和安全组(我们称之为Plan A
)。它执行得很好,状态也存储在远程 S3 后端。
现在我有一个新的 Terraform 计划(我们称之为Plan B
),我需要在其中启动一个 EC2 实例。为此,我需要从Plan A
Terraform 输出中获取 VPC、子网 ID。
有推荐的方法吗?
在 Terraform 中有 2 种主要的方式来传递事物的输出。
第一种也是最古老的方法是使用远程状态功能来获取不同状态文件中的输出。
第二种较新的方法是使用提供者的数据源,向提供者公开只读请求以获取有关资源的信息。
这样,您将使用aws_vpc
和aws_subnet_ids
数据源来检索有关相关子网 ID 的信息。
一个示例可能类似于aws_subnet_ids
文档中给出的示例:
variable "vpc" {}
variable "ami" {}
data "aws_vpc" "selected" {
tags {
Name = "${var.vpc}"
}
}
data "aws_subnet_ids" "private" {
vpc_id = "${data.aws_vpc.selected.id}"
tags {
Tier = "Private"
}
}
resource "aws_instance" "app" {
count = "3"
ami = "${var.ami}"
instance_type = "t2.micro"
subnet_id = "${element(data.aws_subnet_ids.private.ids, count.index)}"
}
这将在您的 3 个子网中的每一个中放置一个 EC2 实例,这些子网在 VPC 中用Tier
=标记,并带有变量提供的标记值。Private
Name
vpc
aws_ami
显然,您可以通过使用数据源来进一步推动这一点,以根据某些过滤条件获取您想要使用的 AMI ID。这也有助于删除您在 Terraform 代码中可能拥有的一些更神奇的变量。
如果您使用唯一标签(例如:名称)创建了Plan A
vpc
和subnet
,则可以使用以下示例轻松获取它们:
data "aws_vpc" "selected" {
filter {
name = "tag:Name"
values = ["my_vpc_name"]
}
}
data "aws_subnet" "selected" {
filter {
name = "tag:Name"
values = ["my_subnet_name"]
}
}
resource "aws_security_group" "sg" {
vpc_id = data.aws_vpc.selected.id
...
}
resource "aws_instance" "instance" {
vpc_security_group_ids = [ aws_security_group.sg.id ]
subnet_id = data.aws_subnet.selected.id
...
}
注意:修改旧资源以包含名称标签(或任何标签)很容易