AWS

AWS VPC, 2개 AZ, Subnet, Internet G/W, Application LB, Route53, DirectConnect, Transit G/W 연결 IaC 테스트 방법

devfinger 2024. 10. 23. 21:33

아래는 두 개의 가용 영역(AZ)에 AWS VPC를 설정하고, 각각에 대해 퍼블릭 서브넷과 프라이빗 서브넷을 만들어 인터넷 게이트웨이, 애플리케이션 로드 밸런서(Application Load Balancer, ALB), Route 53을 설정하는 IaC 예시입니다. 외부에서 접근하는 방법도 설명하겠습니다.

VPC 및 서브넷 생성 (Terraform 예시)

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

# VPC 생성
resource "aws_vpc" "main_vpc" {
  cidr_block = "10.0.0.0/16"
  enable_dns_support = true
  enable_dns_hostnames = true
}

# Internet Gateway 생성
resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.main_vpc.id
}

# Public Subnet 생성 (AZ1, AZ2)
resource "aws_subnet" "public_subnet_az1" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.1.0/24"
  availability_zone = "ap-northeast-2a"
  map_public_ip_on_launch = true
}

resource "aws_subnet" "public_subnet_az2" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.2.0/24"
  availability_zone = "ap-northeast-2b"
  map_public_ip_on_launch = true
}

# Private Subnet (Lambda용, AZ1 & AZ2)
resource "aws_subnet" "private_lambda_subnet_az1" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.3.0/24"
  availability_zone = "ap-northeast-2a"
}

resource "aws_subnet" "private_lambda_subnet_az2" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.4.0/24"
  availability_zone = "ap-northeast-2b"
}

# Private Subnet (EC2용, AZ1 & AZ2)
resource "aws_subnet" "private_ec2_subnet_az1" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.5.0/24"
  availability_zone = "ap-northeast-2a"
}

resource "aws_subnet" "private_ec2_subnet_az2" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.6.0/24"
  availability_zone = "ap-northeast-2b"
}

# Private Subnet (Aurora용, AZ1 & AZ2)
resource "aws_subnet" "private_db_subnet_az1" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.7.0/24"
  availability_zone = "ap-northeast-2a"
}

resource "aws_subnet" "private_db_subnet_az2" {
  vpc_id = aws_vpc.main_vpc.id
  cidr_block = "10.0.8.0/24"
  availability_zone = "ap-northeast-2b"
}

# 라우팅 테이블 및 라우팅 설정
resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.main_vpc.id
}

resource "aws_route" "public_route" {
  route_table_id         = aws_route_table.public_rt.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.igw.id
}

resource "aws_route_table_association" "public_subnet_association_az1" {
  subnet_id      = aws_subnet.public_subnet_az1.id
  route_table_id = aws_route_table.public_rt.id
}

resource "aws_route_table_association" "public_subnet_association_az2" {
  subnet_id      = aws_subnet.public_subnet_az2.id
  route_table_id = aws_route_table.public_rt.id
}

# 애플리케이션 로드 밸런서(ALB)
resource "aws_lb" "app_alb" {
  name               = "app-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.alb_sg.id]
  subnets            = [aws_subnet.public_subnet_az1.id, aws_subnet.public_subnet_az2.id]
}

# ALB 리스너
resource "aws_lb_listener" "alb_listener" {
  load_balancer_arn = aws_lb.app_alb.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "forward"
    target_group_arn = aws_lb_target_group.app_tg.arn
  }
}

# ALB 대상 그룹
resource "aws_lb_target_group" "app_tg" {
  name        = "app-tg"
  port        = 80
  protocol    = "HTTP"
  vpc_id      = aws_vpc.main_vpc.id
  target_type = "instance"
}

# EC2 인스턴스
resource "aws_instance" "my_ec2_instance" {
  ami                         = "ami-0c55b159cbfafe1f0"  # Amazon Linux 2 AMI
  instance_type               = "t2.micro"
  subnet_id                   = aws_subnet.private_ec2_subnet_az1.id
  security_groups             = [aws_security_group.ec2_sg.id]
  associate_public_ip_address = false

  tags = {
    Name = "MyEC2Instance"
  }
}

# EC2 보안 그룹
resource "aws_security_group" "ec2_sg" {
  vpc_id = aws_vpc.main_vpc.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

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

# Route 53 설정
resource "aws_route53_zone" "main_zone" {
  name = "mydomain.com"
}

resource "aws_route53_record" "app_alb_record" {
  zone_id = aws_route53_zone.main_zone.zone_id
  name    = "app"
  type    = "A"
  alias {
    name                   = aws_lb.app_alb.dns_name
    zone_id                = aws_lb.app_alb.zone_id
    evaluate_target_health = true
  }
}

# Direct Connect Gateway 생성
resource "aws_dx_gateway" "dx_gateway" {
  name            = "my-dx-gateway"
  amazon_side_asn = "64512"
}

# Transit Gateway 생성
resource "aws_ec2_transit_gateway" "tgw" {
  description = "My Transit Gateway"
}

# Direct Connect Gateway와 Transit Gateway 연결
resource "aws_dx_gateway_association" "dx_tgw_assoc" {
  dx_gateway_id           = aws_dx_gateway.dx_gateway.id
  transit_gateway_id      = aws_ec2_transit_gateway.tgw.id
  allowed_prefixes        = ["10.0.0.0/16"]
}

# Transit Gateway VPC Attachment (VPC 연결)
resource "aws_ec2_transit_gateway_vpc_attachment" "tgw_vpc_attachment" {
  transit_gateway_id = aws_ec2_transit_gateway.tgw.id
  vpc_id             = aws_vpc.main_vpc.id
  subnet_ids         = [aws_subnet.private_ec2_subnet_az1.id, aws_subnet.private_ec2_subnet_az2.id]
}

#################################################################
## Virtual Private Gateway 생성 (VPC와 Direct Connect 연결)
#resource "aws_vpn_gateway" "vpg" {
#  vpc_id = aws_vpc.main_vpc.id
#  amazon_side_asn = "65000"
#}
#
## Direct Connect Gateway와 Virtual Private Gateway 연결
#resource "aws_dx_gateway_association" "dx_gateway_vpg_assoc" {
#  dx_gateway_id = aws_dx_gateway.dx_gateway.id
#  vpn_gateway_id = aws_vpn_gateway.vpg.id
#}
#
## Direct Connect Connection 생성 (테스트를 위해 가상 연결)
#resource "aws_dx_connection" "dx_conn" {
#  name        = "my-dx-connection"
#  bandwidth   = "1Gbps"
#  location    = "EqSe2"  # 위치 정보
#  provider_name = "MyDirectConnectProvider"
#}
#
## Direct Connect Virtual Interface 생성
#resource "aws_dx_private_virtual_interface" "dx_vif" {
#  connection_id    = aws_dx_connection.dx_conn.id
#  vlan             = 101
#  address_family   = "ipv4"
#  bgp_asn          = 65000
#  amazon_address   = "175.45.176.1/30"
#  customer_address = "175.45.176.2/30"
#}
###################################################################

 

설명

  1. VPC 및 서브넷
    • VPC를 만들고 2개의 가용 영역(AZ)에 퍼블릭 및 여러 프라이빗 서브넷을 구성
    • Lambda, EC2, Aurora Serverless DB 각각에 대한 별도의 프라이빗 서브넷 생성
  2. 인터넷 게이트웨이
    • 퍼블릭 서브넷에서 외부로 나가는 트래픽을 위해 인터넷 게이트웨이를 설정하고 라우팅 테이블 연결
  3. ALB (애플리케이션 로드 밸런서)
    • 외부 트래픽을 받아 EC2 인스턴스와 같은 내부 자원으로 전달하는 역할
  4. Route 53
    • 도메인 이름을 설정하고, ALB와 연결하여 app.mydomain.com 도메인으로 접근할 수 있도록 구성

외부 연결 테스트 방법

  1. DNS를 통한 연결
    • app.mydomain.com 도메인 이름으로 ALB에 연결할 수 있다. Route 53 설정이 완료된 후, 브라우저에서 app.mydomain.com으로 접근하여 연결을 테스트
  2. IP 또는 AWS 주소 사용
    • ALB의 DNS 주소 (aws_lb.app_alb.dns_name)를 통해 직접 접근할 수도 있다. AWS 콘솔이나 Terraform 출력에서 ALB의 DNS 이름을 확인하고 브라우저에서 접근

추가 고려 사항

  • Lambda 및 Aurora Serverless DB와의 연결을 위해서는 VPC 내부에서 필요한 권한과 설정을 추가로 할 수 있다.
  • EC2 인스턴스에 SSH 접속을 허용하거나 필요한 경우 Bastion Host 설정을 추가하는 것도 고려할 수 있다.

위 설정으로 VPC 내의 네트워크 구성을 완료하고 외부에서 접근할 수 있게 되며, 이를 통해 서버와 애플리케이션이 정상적으로 동작하는지 테스트할 수 있다.