Terraform code for AWS Client VPN Endpoint


AWS Client VPN Endpoint를 Terraform으로 생성하기

AWS Client VPN Endpoint Hands-on 글에서 VPN Endpoint를 생성하는 법을 소개하였다. 이걸 Terraform Code로 구현해보았다.

먼저, 해당 코드에서 사용할 variable들을 정의한다.

variable vpn_subnets {
  type = map(object({
    cidr_block           = string
    availability_zone    = string
  }))

  description = "at least /22"

  default = {
    "vpn" = {
      cidr_block          = "10.0.253.0/22",
      "availability_zone" = "ap-northeast-2a"
    }
  }
}

variable subnet_ids {
  type = list(string)
}

variable vpc_cidr_block {
  type = string
}

  1. 사용자가 정의한 인증서 명칭를 data source로 읽어온다.
data "aws_acm_certificate" "server" {
  domain = "server"
}

data "aws_acm_certificate" "client" {
  domain = "client1.domain.tld"
}
  1. vpn endpoint를 생성한다.
resource "aws_ec2_client_vpn_endpoint" this {
  for_each = var.vpn_subnets

  server_certificate_arn = data.aws_acm_certificate.server.arn
  client_cidr_block      = each.value.cidr_block
  dns_servers = [
    "8.8.8.8"
  ]

  authentication_options {
    type                       = "certificate-authentication"
    root_certificate_chain_arn = data.aws_acm_certificate.client.arn
  }

  connection_log_options {
    enabled = false
  }

  tags = {
    Name = each.key
  }
}
  1. 접근해야할 subnet들과 연결한다.

먼저 생성할 vpn endpoint x subent 의 combination을 local variable로 만든 뒤, vpn endpoint와 연결하고, VPC 에서의 인증도 설정해줘야 한다.

locals {
    vpn_subnets = flatten([for vpn_key, vpn_value in var.vpn_subnets : [
        for i in range(0, length(var.subnet_ids)) : [
            {
                "vpn_id" = aws_ec2_client_vpn_endpoint.this[vpn_key].id,
                "subnet_id" = var.subnet_ids[i]
            }
        ]
    ]])
}

resource "aws_ec2_client_vpn_network_association" this {
  count = length(local.vpn_subnets)

  client_vpn_endpoint_id = local.vpn_subnets[count.index].vpn_id
  subnet_id              = local.vpn_subnets[count.index].subnet_id
}

resource "aws_ec2_client_vpn_authorization_rule" "vpc" {
  for_each = var.vpn_subnets

  client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.this[each.key].id
  target_network_cidr    = var.vpc_cidr_block
  authorize_all_groups   = true
}
  1. Internet에 접근해야 할 경우 아래 설정들을 추가해야 한다.
resource "aws_ec2_client_vpn_authorization_rule" "internet" {
  for_each = var.vpn_subnets

  client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.this[each.key].id
  target_network_cidr    = "0.0.0.0/0"
  authorize_all_groups   = true
}

resource "aws_ec2_client_vpn_route" this {
  count = length(local.vpn_subnets)

  client_vpn_endpoint_id = local.vpn_subnets[count.index].vpn_id
  destination_cidr_block = "0.0.0.0/0"
  target_vpc_subnet_id   = local.vpn_subnets[count.index].subnet_id
  description            = "Internet"
}

이렇게 생성한 다음 AWS Client VPN Endpoint Hands-on 에서 소개한 것처럼 콘솔에서 설정 파일을 다운로드 받아서 인증서 정보를 추가한 뒤 OpenVPN client를 다운로드 받아서 접속을 하면 된다.

이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)