如何使用从一个 Terraform 计划创建到另一个 Terraform 计划的 VPC id 和子网 id 值

Anj*_*H N 5 amazon-web-services terraform terraform-provider-aws

我已经在一个 Terraform 计划中创建了 VPC、子网和安全组(我们称之为Plan A)。它执行得很好,状态也存储在远程 S3 后端。

现在我有了一个新的 Terraform 计划(我们称之为Plan B),我需要在其中启动一个 EC2 实例。为此,我需要从Plan ATerraform 输出中获取 VPC、子网 ID 。

有没有推荐的方法来做到这一点?

yda*_*coR 6

在 Terraform 中有两种主要的方式来传递事物的输出。

第一种也是最古老的方法是使用远程状态功能在不同的状态文件中获取输出。

第二种更新的方法是使用提供者的数据源,这些数据源向提供者公开只读请求以获取有关资源的信息。

有了这个,您将使用aws_vpcaws_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)}"
}
Run Code Online (Sandbox Code Playgroud)

这将在 VPC 中用Tier=标记的 3 个子网中的每个子网中放置一个 EC2 实例,Private并使用Name变量提供的标记值vpc

显然,您可以通过使用aws_ami数据源还根据某些过滤条件获取要使用的 AMI ID 来进一步推动这一点。这也有助于删除一些您可能在 Terraform 代码中拥有的更神奇的变量。


ofi*_*ule 5

如果您使用唯一标签(例如:名称)创建您的Plan A vpcsubnet,您可以使用以下示例轻松获取它们:

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
  ...
}
Run Code Online (Sandbox Code Playgroud)

注意:修改旧资源以包含名称标签(或任何标签)很容易