我已经在一个Terraform计划中创建了VPC,子网和安全组(我们将其称为Plan A
)。它执行得很好,并且状态也存储在远程S3后端中。
现在,我有一个新的Terraform计划(我们称为Plan B
),在该计划中需要启动EC2实例。为此,我需要从Plan A
Terraform输出中获取VPC,子网ID。
有推荐的方法吗?
答案 0 :(得分:2)
如果您使用唯一的标签(例如:名称)创建了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
...
}
注意:很容易修改您的旧资源,使其包含Name标签(或任何标签)
答案 1 :(得分:1)
有两种主要方法可以在Terraform中传递事物的输出。
第一种也是最古老的方法是使用remote state feature来获取其他状态文件中的输出。
第二种更新的方法是使用提供商的data sources,该提供商向提供商公开只读请求以获取有关资源的信息。
通过此操作,您将使用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)}"
}
这会将单个EC2实例放置在VPC中标记为Tier
= Private
的3个子网中的每个子网中,其中{{1} }变量。
显然,您可以通过使用aws_ami
data source并根据某些过滤条件来获取要使用的AMI ID,来进一步推动此操作。否则,这也有助于删除您可能在Terraform代码中可能拥有的更多魔术变量。