[英]How to use the VPC id and subnets id values which were created from one Terraform plan to in another Terraform plan
我在一个 Terraform 计划(我们称之为Plan A
)中创建了 VPC、子网和安全组。 它执行得很好,状态也存储在远程 S3 后端中。
现在我有了一个新的 Terraform 计划(我们称之为Plan B
),我需要在其中启动一个 EC2 实例。 为此,我需要从Plan A
Terraform 输出中获取 VPC、子网 ID。
有没有推荐的方法来做到这一点?
在 Terraform 中有两种主要的方式来传递事物的输出。
第一种也是最古老的方法是使用远程状态功能在不同的状态文件中获取输出。
第二种更新的方法是使用提供者的 数据源,这些 数据源向提供者公开只读请求以获取有关资源的信息。
有了这个,您将使用aws_vpc
和aws_subnet_ids
数据源来检索有关相关子网 ID 的信息。
一个示例可能类似于aws_subnet_ids
文档中给出的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)}"
}
这将在 VPC 中标记为Tier
= Private
3 个子网中的每个子网中放置一个 EC2 实例,并使用vpc
变量提供的Name
标记值。
显然,您可以通过使用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
...
}
注意:修改旧资源以包含名称标签(或任何标签)很容易
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.