AWS

AWS VPN 가상 사설 네트워크, AWS가 확인한 액세스 리소스

devfinger 2024. 10. 22. 20:00

VPN

가상 사설 네트워크(VPN)
  • 고객 게이트웨이
  • 가상 프라이빗 게이트웨이
  • Site-to-Site VPN 연결
  • Client VPN 엔드포인트
AWS가 확인한 액세스
  • 확인된 액세스 인스턴스
  • 확인된 액세스 신뢰 공급자
  • 확인된 액세스 그룹
  • 확인된 액세스 엔드포인트

 

1. 고객 게이트웨이 (Customer Gateway)

필수 항목:

  • bgp_asn: BGP ASN 번호 (필수)
  • ip_address: 고객 게이트웨이의 IP 주소 (필수)

선택 항목:

  • tags: 태그 (선택적)

리소스 이름: aws_customer_gateway

resource "aws_customer_gateway" "main_customer_gateway" {
  bgp_asn    = 65000                   # 필수: BGP ASN
  ip_address = "203.0.113.12"           # 필수: 고객 게이트웨이 IP 주소
  type       = "ipsec.1"                # 필수: 고객 게이트웨이 타입 (ipsec.1)

  tags = {
    Name = "MainCustomerGateway"        # 옵션: 태그
  }
}

 

2. 가상 프라이빗 게이트웨이 (Virtual Private Gateway)

필수 항목:

  • vpc_id: VPC ID (필수)

선택 항목:

  • amazon_side_asn: Amazon의 BGP ASN (선택적)
  • tags: 태그 (선택적)

리소스 이름: aws_vpn_gateway

resource "aws_vpn_gateway" "main_vpg" {
  vpc_id = aws_vpc.main_vpc.id          # 필수: 연결할 VPC ID

  # 옵션: Amazon 쪽 ASN 값
  amazon_side_asn = 64512

  tags = {
    Name = "MainVPNGateway"             # 옵션: 태그
  }
}

 

3. Site-to-Site VPN 연결 (Site-to-Site VPN Connection)

필수 항목:

  • customer_gateway_id: 고객 게이트웨이 ID (필수)
  • vpn_gateway_id: VPN 게이트웨이 ID (필수)

선택 항목:

  • static_routes_only: 정적 라우트만 사용할지 여부 (선택적)
  • tunnel_options: VPN 터널 옵션 (선택적)

리소스 이름: aws_vpn_connection

resource "aws_vpn_connection" "main_vpn_connection" {
  customer_gateway_id = aws_customer_gateway.main_customer_gateway.id   # 필수: 고객 게이트웨이 ID
  vpn_gateway_id      = aws_vpn_gateway.main_vpg.id                      # 필수: VPN 게이트웨이 ID
  type                = "ipsec.1"                                        # 필수: 타입

  static_routes_only = false                                              # 옵션: 정적 라우트만 사용 여부

  # 옵션: 터널 옵션 설정
  tunnel1_preshared_key = "somepresharedkey1"
  tunnel2_preshared_key = "somepresharedkey2"

  tags = {
    Name = "MainVPNConnection"                                          # 옵션: 태그
  }
}

 

4. Client VPN 엔드포인트 (Client VPN Endpoint)

필수 항목:

  • server_certificate_arn: VPN 서버에 사용할 인증서 ARN (필수)
  • authentication_options: 인증 옵션 (필수)
  • connection_log_options: 연결 로그 옵션 (필수)

선택 항목:

  • split_tunnel: 스플릿 터널 사용 여부 (선택적)
  • tags: 태그 (선택적)

리소스 이름: aws_ec2_client_vpn_endpoint

resource "aws_ec2_client_vpn_endpoint" "main_client_vpn" {
  description = "Client VPN for corporate use"                         # 옵션: 설명
  server_certificate_arn = "arn:aws:acm:region:account-id:certificate/id"  # 필수: 인증서 ARN

  # 필수: 인증 옵션 설정
  authentication_options {
    type = "certificate-authentication"
    root_certificate_chain_arn = "arn:aws:acm:region:account-id:certificate/root-cert-id"
  }

  # 필수: 연결 로그 옵션 설정
  connection_log_options {
    cloudwatch_log_group  = "ClientVPNLogs"
    cloudwatch_log_stream = "Stream1"
    enabled               = true
  }

  # 옵션: 스플릿 터널 여부
  split_tunnel = false

  tags = {
    Name = "MainClientVPN"                                               # 옵션: 태그
  }
}

 

5. 확인된 액세스 인스턴스 (Verified Access Instance)

필수 항목:

  • verified_access_trust_provider_ids: 신뢰 공급자 ID 목록 (필수)
  • verified_access_instance_id: 액세스 인스턴스 ID (필수)

리소스 이름: aws_verified_access_instance

resource "aws_verified_access_instance" "main_verified_access_instance" {
  description = "Main Verified Access Instance"                      # 옵션: 설명

  # 필수: 신뢰 공급자 ID 목록
  verified_access_trust_provider_ids = [
    aws_verified_access_trust_provider.main_trust_provider.id
  ]

  tags = {
    Name = "MainVerifiedAccessInstance"                               # 옵션: 태그
  }
}

 

6. 확인된 액세스 신뢰 공급자 (Verified Access Trust Provider)

필수 항목:

  • type: 신뢰 공급자 타입 (필수)
  • verified_access_trust_provider_id: 공급자 ID (필수)

리소스 이름: aws_verified_access_trust_provider

resource "aws_verified_access_trust_provider" "main_trust_provider" {
  type = "oidc"                                                         # 필수: 신뢰 공급자 타입 (OIDC)

  oidc_options {
    issuer = "https://example.com"                                       # 필수: OIDC 공급자 주소
    client_id = "client123"                                               # 필수: 클라이언트 ID
  }

  tags = {
    Name = "MainTrustProvider"                                            # 옵션: 태그
  }
}

 

7. 확인된 액세스 그룹 (Verified Access Group)

필수 항목:

  • verified_access_instance_id: 액세스 인스턴스 ID (필수)

리소스 이름: aws_verified_access_group

resource "aws_verified_access_group" "main_access_group" {
  verified_access_instance_id = aws_verified_access_instance.main_verified_access_instance.id  # 필수: 액세스 인스턴스 ID

  tags = {
    Name = "MainVerifiedAccessGroup"                                     # 옵션: 태그
  }
}

 

8. 확인된 액세스 엔드포인트 (Verified Access Endpoint)

필수 항목:

  • verified_access_group_id: 액세스 그룹 ID (필수)
  • load_balancer_options: 로드 밸런서 옵션 (필수)

리소스 이름: aws_verified_access_endpoint

resource "aws_verified_access_endpoint" "main_verified_access_endpoint" {
  verified_access_group_id = aws_verified_access_group.main_access_group.id   # 필수: 액세스 그룹 ID

  # 필수: 로드 밸런서 옵션 설정
  load_balancer_options {
    protocol = "https"
    port     = 443
  }

  tags = {
    Name = "MainVerifiedAccessEndpoint"                                       # 옵션: 태그
  }
}

 

각 리소스는 AWS의 네트워크 보안 및 VPN 기능을 관리하는 데 중요한 역할을 한다. Terraform을 사용해 각 리소스를 정의할 때, 필수 및 선택 입력 파라미터를 신중히 선택해야 하며, 각 리소스는 특정 시나리오에 맞게 조정될 수 있다.