【问题标题】:How to use the VPC id and subnets id values which were created from one Terraform plan to in another Terraform plan如何使用从一个 Terraform 计划创建到另一个 Terraform 计划的 VPC id 和子网 id 值
【发布时间】:2019-02-04 01:08:32
【问题描述】:
我在一个 Terraform 计划中创建了 VPC、子网和安全组(我们称之为Plan A)。它执行得很好,状态也存储在远程 S3 后端。
现在我有一个新的 Terraform 计划(我们称之为Plan B),我需要在其中启动一个 EC2 实例。为此,我需要从Plan A Terraform 输出中获取 VPC、子网 ID。
有推荐的方法吗?
【问题讨论】:
标签:
amazon-web-services
terraform
terraform-provider-aws
【解决方案1】:
如果您使用唯一标签(例如:名称)创建了 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
...
}
注意:修改旧资源以包含名称标签(或任何标签)很容易
【解决方案2】:
在 Terraform 中传递事物输出的主要方式有 2 种。
第一种也是最古老的方法是使用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)}"
}
这将在您的 3 个子网中分别放置一个 EC2 实例,这些子网在 VPC 中用Tier = Private 标记,Name 标记值由vpc 变量提供。
显然,您可以通过使用aws_ami data source 进一步推动此操作,还可以根据某些过滤条件获取您想要使用的 AMI ID。这也有助于删除您在 Terraform 代码中可能拥有的一些更神奇的变量。