【问题标题】: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 代码中可能拥有的一些更神奇的变量。

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 2018-03-06
      • 2019-04-22
      • 2019-02-16
      • 2018-07-29
      • 2019-11-27
      • 2020-03-01
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多