web-dev-qa-db-ja.com

Terraform:複数のサブネットをルートテーブルに関連付ける方法は?

Terraformv.0.11.7を使用しています。

4つのサブネット(2つのパブリックサブネット、2つのプライベートサブネット)を作成したい

これがvars.tfの内容です

variable "region" {
  default = "ap-south-1"
}

variable "AMI_id" {
  type = "map"
  default = "AMI-d783a9b8"
}

variable "credentials" {
  default = "/root/.aws/credentials"
}

variable "vpc_cidr" {
  default = "10.0.0.0/16"
}

variable "pub_subnet_aza_cidr" {
  default = "10.0.10.0/24"
}

variable "pub_subnet_azc_cidr" {
  default = "10.0.20.0/24"
}

variable "pri_subnet_aza_cidr" {
  default = "10.0.30.0/24"
}

variable "pri_subnet_azc_cidr" {
  default = "10.0.40.0/24"
}

Main.tf内で、最初の2つのパブリックサブネットをパブリックルートテーブルに関連付けたいのですが、どうすればよいですか?

resource "aws_subnet" "pub_subnet_aza" {
  vpc_cidr = "{aws_vpc.vpc.id}"
  cidr_block = "${var.pub_subnet_aza_cidr}"
  tags {
    Name = "Pub-Sunet-A"
 }
  availability_zone = "${data.aws_availability_zone.available.name[0]}"
}

resource "aws_subnet" "pub_subnet_azc" {
  vpc_cidr = "{aws_vpc.vpc.id}"
  cidr_block = "${var.pub_subnet_azc_cidr}"
  tags {
   Name = "Pub-Subnet-C"
}
  availability_zone = "${data.aws_availability_zone.available.name[2]}"
}

resource "aws_route_table_association" "public" {
  subnet_id = "${aws_subnet.pub_subnet_aza.id}"  # How to put pub_subnet_azc.id into here?
  route_table_id = "${aws_route_table.public.id}"
}
4
The One

サブネットのリストを使用して、変数の量を減らすことをお勧めします。次に、count = length(var.subnets)を使用してルートテーブルアソシエーションリソースの2つのインスタンスを取得し、サブネットリストから正しいインスタンスを選択することもできます。

_variable "subnet_cidrs_public" {
  description = "Subnet CIDRs for public subnets (length must match configured availability_zones)"
  # this could be further simplified / computed using cidrsubnet() etc.
  # https://www.terraform.io/docs/configuration/interpolation.html#cidrsubnet-iprange-newbits-netnum-
  default = ["10.0.10.0/24", "10.0.20.0/24"]
  type = "list"
}

resource "aws_subnet" "public" {
  count = "${length(var.subnet_cidrs_public)}"

  vpc_id = "${aws_vpc.main.id}"
  cidr_block = "${var.subnet_cidrs_public[count.index]}"
  availability_zone = "${var.availability_zones[count.index]}"
}

resource "aws_route_table_association" "public" {
  count = "${length(var.subnet_cidrs_public)}"

  subnet_id      = "${element(aws_subnet.public.*.id, count.index)}"
  route_table_id = "${aws_route_table.public.id}"
}
_

dataを介してアベイラビリティーゾーンを読んでいるようですが、これは問題なく、引き続き実行できます。サブネットとAZの間の関連付けを何らかの方法で設定する必要があります。それはあなたに任せます。

確かにもっとエレガントなのは、そのリージョンのすべてのAZでサブネットをプロビジョニングすることです。 cidrsubnet() を使用してサブネットのアドレス空間を計算すると、残りすべてのドライバーとしてlength(data.availability_zones)を使用できます。複雑すぎてはいけません。

完全なコードは次のとおりです。

_provider "aws" {
  region = "eu-west-1"
}

variable "availability_zones" {
  description = "AZs in this region to use"
  default = ["eu-west-1a", "eu-west-1c"]
  type = "list"
}

variable "vpc_cidr" {
  default = "10.0.0.0/16"
}

variable "subnet_cidrs_public" {
  description = "Subnet CIDRs for public subnets (length must match configured availability_zones)"
  # this could be further simplified / computed using cidrsubnet() etc.
  # https://www.terraform.io/docs/configuration/interpolation.html#cidrsubnet-iprange-newbits-netnum-
  default = ["10.0.10.0/24", "10.0.20.0/24"]
  type = "list"
}

resource "aws_vpc" "main" {
  cidr_block = "${var.vpc_cidr}"
  tags {
    Name = "stackoverflow-51739482"
  }
}

resource "aws_subnet" "public" {
  count = "${length(var.subnet_cidrs_public)}"

  vpc_id = "${aws_vpc.main.id}"
  cidr_block = "${var.subnet_cidrs_public[count.index]}"
  availability_zone = "${var.availability_zones[count.index]}"
}

resource "aws_route_table" "public" {
  vpc_id = "${aws_vpc.main.id}"

  tags {
    Name = "public"
  }
}

resource "aws_route_table_association" "public" {
  count = "${length(var.subnet_cidrs_public)}"

  subnet_id      = "${element(aws_subnet.public.*.id, count.index)}"
  route_table_id = "${aws_route_table.public.id}"
}
_
9
StephenKing