【问题标题】:Terraform - AWS Multiple subnets issueTerraform - AWS 多个子网问题
【发布时间】:2019-11-27 09:04:10
【问题描述】:

我正在尝试部署多个 ec2 实例,其中每个 Web Server ec2 实例位于不同的子网中,而 Application Server 实例位于特定的子网中。

当使用 count 参数时,每个网络服务器都会正确部署在不同的子网中,但应用程序实例会部署在同一个子网中,而不是我在 “应用程序资源” 部分指定的两个子网中下面给出。

如何指定要在特定子网中创建的应用程序服务器,这些子网使用 count 参数创建,如下面的“公共子网资源”部分中指定。

.

变量声明:

variable "subnet_private_cidr" {
type = "list"
default = ["10.10.1.0/24", "10.10.2.0/24", "10.10.3.0/24", "10.10.4.0/24"]
}
variable "subnet_public_cidr" {
type = "list"
default = ["10.10.0.0/24", "10.10.5.0/24", "10.10.6.0/24", "10.10.7.0/24"] 
}
variable "azs" {
type = "list"
default = ["us-east-1a", "us-east-1b", "us-east-1c", "us-east-1d"]
}

公共子网资源:

resource "aws_subnet" "qasubnet_public" {
count = "${length(var.subnet_public_cidr)}"
vpc_id = "${aws_vpc.qa_vpc.id}"
cidr_block = "${element(var.subnet_public_cidr,count.index)}"
availability_zone = "${element(var.azs,count.index)}"
tags {
       Name = "QASUBNET_PUBLIC-${count.index+1}"
}
}

私有子网资源:

resource "aws_subnet" "qasubnet_private" {
count = "${length(var.subnet_private_cidr)}"
vpc_id = "${aws_vpc.qa_vpc.id}"
cidr_block = "${element(var.subnet_private_cidr,count.index)}"
availability_zone = "${element(var.azs,count.index)}"
tags { 
       Name = "QASUBNET_PRIVATE-${count.index+1}"
}
}

网络服务器资源:

resource "aws_instance" "webserver" {
count = "${length(var.subnet_public_cidr)}"
ami = "${var.webserver_ami}"
instance_type = "t2.medium"
vpc_security_group_ids = ["${aws_security_group.webserver.id}"]
key_name = "${var.aws_key_name}"
subnet_id = "${element(aws_subnet.qasubnet_public.*.id,count.index)}"
}

应用资源:

resource "aws_instance" "appserver" {
count = 2
ami = "${var.appserver_ami}"
instance_type = "t2.medium"
vpc_security_group_ids = ["${aws_security_group.appserver.id}"]
key_name = "${var.aws_key_name}"
subnet_id = "${element(aws_subnet.qasubnet_private.*.id,0)}"
subnet_id = "${element(aws_subnet.qasubnet_private.*.id,1)}"
}

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    我不确定你想在你的:

      subnet_id              = "${element(aws_subnet.qasubnet_private.*.id,0)}"
      subnet_id              = "${element(aws_subnet.qasubnet_private.*.id,1)}"`
    

    在您的资源“aws_instance.appserver”中,它应该只是一个 subnet_id 引用:

      subnet_id              = "${element(aws_subnet.qasubnet_private.*.id,count.index)}"
    

    使用计数语句,这将为每个子网提供一个实例。

    【讨论】:

    • 感谢@James Woolfenden。是的,我知道我指定的代码是错误的,我正在尝试解决这个问题。我在该部分中尝试做的是手动指定 2 个子网。 4 子网使用私有子网资源部分中的计数参数动态创建。如果我使用您指定的子网 ID,则应用服务器将在所有 4 个子网中创建,但我希望它只在 2 个子网中创建。
    • @Sreeraju V,James 的解决方案是您想要做的。如果 count 为 2,则 count.index 为 0,1。该代码将创建两个应用服务器实例,第一个将在私有子网 0 中,第二个将在私有子网 1 中。它不会创建 4 个实例。
    猜你喜欢
    • 2021-10-10
    • 2021-02-25
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2018-07-29
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多