Terraform code for AWS Client VPN Endpoint
in Development on DevOps
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
}
- 사용자가 정의한 인증서 명칭를 data source로 읽어온다.
data "aws_acm_certificate" "server" {
domain = "server"
}
data "aws_acm_certificate" "client" {
domain = "client1.domain.tld"
}
- 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
}
}
- 접근해야할 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
}
- 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를 다운로드 받아서 접속을 하면 된다.
이 글이 도움이 되셨다면 공감 및 광고 클릭을 부탁드립니다 :)