Terraform でEC2 Instance Connect Endpointを作成してみました。

2023.07.07

こんにちは、クラスメソッドのヌヌです。

EC2 Instance Connect Endpointを作成できるTerraformのアップデートがありましたので、やってみました。

TerraformのEIC Endpointについて

事前確認

EC2 Instance Connect EndpointはAWS Provider 5.6.0以上のバージョンから作成可能です。 そのため、Terraformで EIC Endpointを作成する前、Providerのバージョンを確認してください。

中身について

EIC Endpointのリソースタイプは aws_ec2_instance_connect_endpointです。次のようにコードを作成できます。

# main.tf

resource "aws_ec2_instance_connect_endpoint" "eic_test" {
    subnet_id = aws_subnet.test_private_subnet.id # 必須
    security_group_ids = [aws_security_group.ssh_eic.id] # オブション
    preserve_client_ip = true # オブション

    tags = { # オブション
        Name = "名前"
    }
}
  • subnet_id(必須):必須入力項目です。エンドポイントを作成するサブネットIDを定義します。
  • security_group_ids:エンドポイントに適用するセキュリティグループです。何も定義しない場合、VPCのデフォルトセキュリティグループが適用されます。
  • preserve_client_ip:クライアントIPアドレスを保存可否を定義します。デフォルトはtrue です。
  • tag:タグを作成します。

やってみました

コード作成

terraform {
    required_providers {
        aws = ">= 5.6.0"
    }
}

provider "aws" {
    region = "ap-northeast-1"
}

resource "aws_vpc" "test" { 
    cidr_block = "172.31.0.0/16"
}

resource "aws_subnet" "test_private_subnet" {
    vpc_id            = aws_vpc.test.id
    cidr_block        = "172.31.0.0/24"
    availability_zone = "ap-northeast-1a"
}

resource "aws_route_table" "private_rt" {
    vpc_id = aws_vpc.test.id
}

resource "aws_ec2_instance_connect_endpoint" "test_eic" {
    subnet_id = aws_subnet.test_private_subnet.id # 必須
    security_group_ids = [aws_security_group.ssh_eic.id] # オブション
    preserve_client_ip = true # オブション

    tags = { # オブション
        Name = "eic-test"
    }
}

# EIC Endpointのセキュリティグループ
resource "aws_security_group" "ssh_eic" {
    name        = "test-eic-sg"
    description = "EIC Security Group For Test"
    vpc_id            = aws_vpc.test.id

    ingress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["x.x.x.x/x"]
    }

    egress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

resource "aws_instance" "test" {
    ami           = "ami-0cfc97bf81f2eadc4"
    instance_type = "t2.micro"
    subnet_id = aws_subnet.test_private_subnet.id
    security_groups = [aws_security_group.ssh_ec2.id]
}

resource "aws_security_group" "ssh_ec2" {
    name        = "test-ec2-sg"
    description = "EC2 Instance Security Group For Test"
    vpc_id            = aws_vpc.test.id

    ingress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["x.x.x.x/x"]
    }

    egress {
        from_port   = 22
        to_port     = 22
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

デプロイ

次のコマンドを実行して作成したTerraformコードをデプロイします。

$ terraform init
$ terraform plan
$ terraform apply

接続確認

デプロイが完了できたら次のコマンドを入力して、接続を確認します。

$ aws ec2-instance-connect ssh --instance-id インスタンスID --connection-type eice

最後に

EIC Endpointがリリーズされてからあまり経ってないですがすぐTerraformで使えることができてるTerraformの速度に驚きました。

EIC EndpointもTerraformで作成しましょう!

参照

https://github.com/hashicorp/terraform-provider-aws/blob/main/website/docs/r/ec2_instance_connect_endpoint.html.markdown