2017-04-24 98 views
2

我正在使用tf_aws_vpctf_aws_ec2 Terraform社区模块,但我正在努力获取应该用于在AWS VPC中创建EC2实例的subnet_id。从VPC Terraform社区模块获取subnet_id

在tf_aws_ec2模块文档中,他们说要在一个变量中定义它,但我无法从变量中获取它,因为直到我创建子网时才知道它的ID。

我正在尝试使用Terraform模块。我知道如何在不使用Terraform模块时做到这一点。

我该如何在VPC中创建一个EC2实例?

+0

您是否在同一目录中使用了这两个模块?那么你一次只应用Terraform来创建两者还是你将Terraform应用到多个目录? – ydaetskcoR

+0

我从github上下载它.. 使用他们的模块我main.tf –

回答

1

我要说的是,我不太相信这些模块真正提供的只是简单地使用资源,因为它们并没有为你做出任何有用的决定,所以我建议根本不使用它们。但是,如果您确实想要使用它们并且在相同的“级别”(即单个创建VPC和实例的单个terraform apply)上使用它们,那么您可以简单地使用模块输出并将它们传递给它们到EC2实例。

像这样的东西应该工作:

module "vpc" { 
    source = "github.com/terraform-community-modules/tf_aws_vpc" 

    name = "my-vpc" 

    cidr = "10.0.0.0/16" 
    private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"] 
    public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"] 

    enable_nat_gateway = "true" 

    azs  = ["us-west-2a", "us-west-2b", "us-west-2c"] 

    tags { 
    "Terraform" = "true" 
    "Environment" = "${var.environment}" 
    } 
} 

module "ec2_instance" { 
    source = "github.com/terraform-community-modules/tf_aws_ec2_instance" 
    instance_type = "${var.instance_type}" 
    instance_name = "${var.instance_name}" 
    ami_id = "${var.ami_id}" 
    aws_access_key = "${var.aws_access_key}" 
    aws_secret_key = "${var.aws_secret_key}" 
    aws_region = "${var.aws_region}" 
    subnet_id = "${element(module.vpc.private_subnets, 0)}" 
    number_of_instances = "${var.number_of_instances}" 
    user_data = "${var.user_data}" 
} 

这使用从VPC模块返回所有在VPC私人子网ID的列表中private_subnets output,然后使用element选择第一个。如果实例模块获取了一个子网ID列表来放置实例(通过全局遍历来遍历AZ遍历实例),那么您可以删除element函数。

如果您的Terraform在不同的目录中(因此您只需申请一次VPC,再次申请另一个目录以创建EC2实例),则需要使用remote_state data source访问VPC的输出。

+0

万一有人还在尝试,因为我是用subnet_id为例贝罗邻使其工作: 'subnet_id =“$ {元素(模块.vpc.private_subnets,0)}“' 非常感谢你的帮助。 它确实帮了我。 我会尝试按照您的建议使用,因为我不需要像EC2实例那样每次创建VPC。 正如我所说我是新手,我正在阅读文档并希望使用最佳实践。 你帮了很多忙。再次感谢你。 –