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

时间:2018-08-29 09:33:23

标签: amazon-web-services terraform

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

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

有推荐的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您使用唯一的标签(例如:名称)创建了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
  ...
}

注意:很容易修改您的旧资源,使其包含Name标签(或任何标签)

答案 1 :(得分:1)

有两种主要方法可以在Terraform中传递事物的输出。

第一种也是最古老的方法是使用remote state feature来获取其他状态文件中的输出。

第二种更新的方法是使用提供商的data sources,该提供商向提供商公开只读请求以获取有关资源的信息。

通过此操作,您将使用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)}"
}

这会将单个EC2实例放置在VPC中标记为Tier = Private的3个子网中的每个子网中,其中{{1} }变量。

显然,您可以通过使用aws_ami data source并根据某些过滤条件来获取要使用的AMI ID,来进一步推动此操作。否则,这也有助于删除您可能在Terraform代码中可能拥有的更多魔术变量。

相关问题