아래는 두 개의 가용 영역(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"
#}
###################################################################
설명
- VPC 및 서브넷
- VPC를 만들고 2개의 가용 영역(AZ)에 퍼블릭 및 여러 프라이빗 서브넷을 구성
- Lambda, EC2, Aurora Serverless DB 각각에 대한 별도의 프라이빗 서브넷 생성
- 인터넷 게이트웨이
- 퍼블릭 서브넷에서 외부로 나가는 트래픽을 위해 인터넷 게이트웨이를 설정하고 라우팅 테이블 연결
- ALB (애플리케이션 로드 밸런서)
- 외부 트래픽을 받아 EC2 인스턴스와 같은 내부 자원으로 전달하는 역할
- Route 53
- 도메인 이름을 설정하고, ALB와 연결하여 app.mydomain.com 도메인으로 접근할 수 있도록 구성
외부 연결 테스트 방법
- DNS를 통한 연결
- app.mydomain.com 도메인 이름으로 ALB에 연결할 수 있다. Route 53 설정이 완료된 후, 브라우저에서 app.mydomain.com으로 접근하여 연결을 테스트
- IP 또는 AWS 주소 사용
- ALB의 DNS 주소 (aws_lb.app_alb.dns_name)를 통해 직접 접근할 수도 있다. AWS 콘솔이나 Terraform 출력에서 ALB의 DNS 이름을 확인하고 브라우저에서 접근
추가 고려 사항
- Lambda 및 Aurora Serverless DB와의 연결을 위해서는 VPC 내부에서 필요한 권한과 설정을 추가로 할 수 있다.
- EC2 인스턴스에 SSH 접속을 허용하거나 필요한 경우 Bastion Host 설정을 추가하는 것도 고려할 수 있다.
위 설정으로 VPC 내의 네트워크 구성을 완료하고 외부에서 접근할 수 있게 되며, 이를 통해 서버와 애플리케이션이 정상적으로 동작하는지 테스트할 수 있다.
'AWS' 카테고리의 다른 글
AWS Lambda 에 HTTPS 인증서 적용하기 (0) | 2024.10.24 |
---|---|
AWS Route53 records, alias_records, subject_alternative_names 설명 (0) | 2024.10.24 |
AWS KMS(Key Management Service) IaC 사용법과 예시 (0) | 2024.10.23 |
AWS 사용자 관리 정책 aws_iam_policy와 aws_iam_role_policy_attachment 사용법 (1) | 2024.10.23 |
AWS Roles(역할) aws_iam_role의 assume_role_policy 사용법 (0) | 2024.10.23 |