あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

【AWS】TerraformでTransitGateway構成を作ってみた


TerraformでTransitGateway構成を作ってみた

構成

こんな感じのを作って、EC2同士で疎通が取れることを確認します。

実践!

1.環境構築
1-1.下記ファイルを作成
verson.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  required_version = ">= 1.0.0"
}

variables.tf

variable "env" {
  type = map(any)
  default = {
    env = "test"
  }
}

variable "region" {
  description = "The AWS region to deploy resources in"
  type        = string
  default     = "ap-northeast-1"
}

variable "vpc_network" {
  type = map(any)

  default = {
    ser01 = "10.224.1.0/24"
    ser02 = "10.224.2.0/24"
  }
}

variable "area" {
  type = map(any)

  default = {
    region = "ap-northeast-1"
    az01   = "ap-northeast-1a"
    az02   = "ap-northeast-1c"
  }
}

variable "sub_network" {
  type = map(any)

  default = {
    sub-1-01 = "10.224.1.0/25"
    sub-1-02 = "10.224.1.128/25"

    sub-2-01 = "10.224.2.0/25"
    sub-2-02 = "10.224.2.128/25"
  }
}

provider.tf

provider "aws" {
  profile = "testvault"
  # region  = "us-east-1"
  region  = "ap-northeast-1"
}

data.tf

data "aws_caller_identity" "current" {}

main.tf

resource "aws_vpc" "vpc_1" {
    cidr_block = "${var.vpc_network["ser01"]}"

    tags = {
        Name = "${var.env["env"]}-vpc-1"
    }
}

resource "aws_vpc" "vpc_2" {
    cidr_block = "${var.vpc_network["ser02"]}"

    tags = {
        Name = "${var.env["env"]}-vpc-2"
    }
}

resource "aws_subnet" "subnet_1a" {
    vpc_id = aws_vpc.vpc_1.id
    cidr_block = "${var.sub_network["sub-1-01"]}"
    availability_zone = "${var.area["az01"]}"

    tags = {
        Name = "${var.env["env"]}-subnet-1a"
    }
}

resource "aws_subnet" "subnet_1c" {
    vpc_id = aws_vpc.vpc_1.id
    cidr_block = "${var.sub_network["sub-1-02"]}"
    availability_zone = "${var.area["az02"]}"

    tags = {
        Name = "${var.env["env"]}-subnet-1c"
    }
}

resource "aws_subnet" "subnet_2a" {
    vpc_id = aws_vpc.vpc_2.id
    cidr_block = "${var.sub_network["sub-2-01"]}"
    availability_zone = "${var.area["az01"]}"

    tags = {
        Name = "${var.env["env"]}-subnet-2a"
    }
}

resource "aws_subnet" "subnet_2c" {
    vpc_id = aws_vpc.vpc_2.id
    cidr_block = "${var.sub_network["sub-2-02"]}"
    availability_zone = "${var.area["az02"]}"

    tags = {
        Name = "${var.env["env"]}-subnet-2c"
    }
}

resource "aws_route_table" "rt_1" {
    vpc_id = aws_vpc.vpc_1.id

    route {
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.igw_1.id
    }

    route {
        cidr_block = "${var.vpc_network["ser02"]}"
        transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id
    }

    tags = {
        Name = "${var.env["env"]}-rt-1"
    }
}

resource "aws_route_table" "rt_2" {
    vpc_id = aws_vpc.vpc_2.id

    route {
        cidr_block = "0.0.0.0/0"
        gateway_id = aws_internet_gateway.igw_2.id
    }

    route {
        cidr_block = "${var.vpc_network["ser01"]}"
        transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id
    }

    tags = {
        Name = "${var.env["env"]}-rt-2"
    }
}

resource "aws_route_table_association" "rta_1a" {
    subnet_id = aws_subnet.subnet_1a.id
    route_table_id = aws_route_table.rt_1.id
}

resource "aws_route_table_association" "rta_1c" {
    subnet_id = aws_subnet.subnet_1c.id
    route_table_id = aws_route_table.rt_1.id
}

resource "aws_route_table_association" "rta_2a" {
    subnet_id = aws_subnet.subnet_2a.id
    route_table_id = aws_route_table.rt_2.id
}

resource "aws_route_table_association" "rta_2c" {
    subnet_id = aws_subnet.subnet_2c.id
    route_table_id = aws_route_table.rt_2.id
}

resource "aws_internet_gateway" "igw_1" {
    vpc_id = aws_vpc.vpc_1.id

    tags = {
        Name = "${var.env["env"]}-igw-1"
    }
}

resource "aws_internet_gateway" "igw_2" {
    vpc_id = aws_vpc.vpc_2.id

    tags = {
        Name = "${var.env["env"]}-igw-2"
    }
}

resource "aws_ec2_transit_gateway" "tgw_1" {
    description = "${var.env["env"]}-tgw-1"

    default_route_table_association = "disable"
    default_route_table_propagation = "disable"

    tags = {
        Name = "${var.env["env"]}-tgw-1"
    }
}

resource "aws_ec2_transit_gateway_vpc_attachment" "tgwa_1" {
    transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id
    vpc_id = aws_vpc.vpc_1.id
    subnet_ids = [aws_subnet.subnet_1a.id, aws_subnet.subnet_1c.id]

    tags = {
        Name = "${var.env["env"]}-tgwa-1"
    }
}

resource "aws_ec2_transit_gateway_vpc_attachment" "tgwa_2" {
    transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id
    vpc_id = aws_vpc.vpc_2.id
    subnet_ids = [aws_subnet.subnet_2a.id, aws_subnet.subnet_2c.id]

    tags = {
        Name = "${var.env["env"]}-tgwa-2"
    }
}

resource "aws_ec2_transit_gateway_route_table" "tgwr_1" {
    transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id

    tags = {
        Name ="${var.env["env"]}-tgwr-1"
    }
}

resource "aws_ec2_transit_gateway_route_table" "tgwr_2" {
    transit_gateway_id = aws_ec2_transit_gateway.tgw_1.id

    tags = {
        Name ="${var.env["env"]}-tgwr-2"
    }
}

resource "aws_ec2_transit_gateway_route" "tgw_route_vpc1_to_vpc2" {
    destination_cidr_block = "${var.vpc_network["ser02"]}"
    transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.tgwr_1.id
    transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.tgwa_2.id
}

resource "aws_ec2_transit_gateway_route" "tgw_route_vpc2_to_vpc1" {
    destination_cidr_block = "${var.vpc_network["ser01"]}"
    transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.tgwr_2.id
    transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.tgwa_1.id
}

resource "aws_ec2_transit_gateway_route_table_association" "tgw_assoc_1" {
    transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.tgwa_1.id
    transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.tgwr_1.id
}

resource "aws_ec2_transit_gateway_route_table_association" "tgw_assoc_2" {
    transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.tgwa_2.id
    transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.tgwr_2.id
}

resource "aws_security_group" "sg_1" {
    vpc_id = aws_vpc.vpc_1.id

    ingress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["${var.vpc_network["ser02"]}"]
    }

    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }

    tags = {
        Name = "${var.env["env"]}-sg-1"
    }
}

resource "aws_security_group" "sg_2" {
    vpc_id = aws_vpc.vpc_2.id

    ingress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["${var.vpc_network["ser01"]}"]
    }

    egress {
        from_port = 0
        to_port = 0
        protocol = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }

    tags = {
        Name = "${var.env["env"]}-sg-2"
    }
}

resource "aws_instance" "ec2_1" {
    ami = "ami-023ff3d4ab11b2525"
    instance_type = "t2.micro"
    subnet_id = aws_subnet.subnet_1a.id
    security_groups = [aws_security_group.sg_1.id]
    iam_instance_profile = aws_iam_instance_profile.instance_profile_1.name
    associate_public_ip_address = true

    tags = {
        Name = "${var.env["env"]}-ec2-1"
    }
}

resource "aws_instance" "ec2_2" {
    ami = "ami-023ff3d4ab11b2525"
    instance_type = "t2.micro"
    subnet_id = aws_subnet.subnet_2a.id
    security_groups = [aws_security_group.sg_2.id]
    iam_instance_profile = aws_iam_instance_profile.instance_profile_2.name
    associate_public_ip_address = true

    tags = {
        Name = "${var.env["env"]}-ec2-2"
    }
}

resource "aws_iam_instance_profile" "instance_profile_1" {
    name = "${var.env["env"]}-instance-profile-1"
    role = aws_iam_role.iamrole_1.name
}

resource "aws_iam_instance_profile" "instance_profile_2" {
    name = "${var.env["env"]}-instance-profile-2"
    role = aws_iam_role.iamrole_2.name
}

resource "aws_iam_role" "iamrole_1" {
    name = "${var.env["env"]}-iamrole-1"

    assume_role_policy = jsonencode({
        Version = "2012-10-17",
        Statement = [{
            Action = "sts:AssumeRole",
            Effect = "Allow",
            Principal = {
                Service = "ec2.amazonaws.com"
            }
        }]
    })
}

resource "aws_iam_role" "iamrole_2" {
    name = "${var.env["env"]}-iamrole-2"

    assume_role_policy = jsonencode({
        Version = "2012-10-17",
        Statement = [{
            Action = "sts:AssumeRole",
            Effect = "Allow",
            Principal = {
                Service = "ec2.amazonaws.com"
            }
        }]
    })
}

resource "aws_iam_role_policy_attachment" "ssm_policy_attachment-1" {
    role = aws_iam_role.iamrole_1.name
    policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

resource "aws_iam_role_policy_attachment" "ssm_policy_attachment-2" {
    role = aws_iam_role.iamrole_2.name
    policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}

1-2.terraform実行

> terraform fmt
> terraform init
> terraform plan
> terraform appy


2.動作確認
2-1.1側EC2のIPアドレス確認

2-2.2側EC2のIPアドレス確認

2-3.1側EC2へSSMで接続し、2側EC2にpingを実行、疎通が通ることを確認

2-4.2側EC2へSSMで接続し、1側EC2にpingを実行、疎通が通ることを確認


3.削除

> terraform destroy



感想

意外と作るリソースが多くて大変