2017-04-24 105 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。 正如我所說我是新手,我正在閱讀文檔並希望使用最佳實踐。 你幫了很多忙。再次感謝你。 –