我正在使用tf_aws_vpc和tf_aws_ec2 Terraform社区模块但是我很难获得我应该用来在AWS VPC中创建EC2实例的subnet_id。
在tf_aws_ec2模块文档中,他们说要在变量中定义它,但我无法从变量中获取它,因为在创建子网之前我不知道它的ID。
我正在尝试使用Terraform模块。我不知道如何在不使用Terraform模块时这样做。
我应该如何在VPC中创建EC2实例?
答案 0 :(得分:1)
我之前要说的是,我并不太相信这些模块真正提供的只是简单地使用资源,因为他们并没有真正为你做出任何有用的决定。所以我建议不要使用它们。
但是,如果您确实想要使用它们,并且您在同一级别使用它们,那么#34; (意味着单个terraform apply
同时创建VPC和实例)然后您可以简单地使用模块输出并将它们传递给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模块中的private_subnets
output,它返回VPC中所有私有子网ID的列表,然后使用element
选择第一个。如果实例模块采用了一个子网ID列表来放置实例(通过它们遍历所有以在AZ之间传播实例),那么您可以删除element
函数。
如果您的Terraform位于不同的目录中(因此您为VPC申请一次,再在另一个目录中申请创建EC2实例),您需要使用remote_state
data source访问VPC的输出