인프라 구축기
인프라 구축기 (5)까지 작성된 아키텍처를 구성하기 위한 작업이 이루어졌다면, (6)부터는 구성된 서비스를 운영하기 위한 작업을 다룬다. 그중에서 가장 중요한 것이 로컬에서 Private Subnet에 위치하는 EC2의 Airflow Web Server에 접근할 수 있도록 하는 것이다. 이전에 구상 단계에서 ALB, 포트포워딩, Nginx를 활용하는 방법이 있었는데, 여기서는 Nginx를 활용해 구성하였다.
보안 그룹 변경 사항
security_group.tf
- Bastion Host와 Private Subnet EC2의 보안 그룹에 HTTP(80) 및 HTTPS(443) 포트 추가
- Bastion Host에서 Private Subnet EC2의 웹 서버로 접근하려면 HTTP와 HTTPS 포트 열어야 함
- 기존에 존재하는 airflow_web_access_sg에 두 개 (80, 443)의 포트를 추가
resource "aws_security_group_rule" "airflow_web_access_http_ipv4" {
type = "ingress"
security_group_id = aws_security_group.airflow_web_access_sg.id
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = [
"0.0.0.0/0",
]
}
resource "aws_security_group_rule" "airflow_web_access_https_ipv4" {
type = "ingress"
security_group_id = aws_security_group.airflow_web_access_sg.id
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = [
"0.0.0.0/0",
]
}
ec2.tf
- airflow의 경우 airflow_web_access_sg가 이미 적용돼 있었기에 bastion Host만 추가로 적용
# bastion host
resource "aws_instance" "bastion_host" {
ami = "ami-040c33c6a51fd5d96"
instance_type = "t2.micro"
subnet_id = var.public_subnet_2a_1_id
key_name = "popboard-bastion-host-keypair"
associate_public_ip_address = true
vpc_security_group_ids = [
var.bastion_host_ssh_access_sg_id,
var.airflow_web_access_sg_id, # 추가된 코드
var.all_outbound_traffic_sg_id
]
root_block_device {
volume_type = "gp3"
volume_size = 8
delete_on_termination = true
}
tags = {
Name = "popboard-bastion-host"
}
}
Bastion Host 작업 사항
nginx 설치
sudo apt update
sudo apt install nginx
nginx 코드 작성
sudo nano /etc/nginx/sites-available/default
server {
listen 80;
listen 8080;
server_name <bastion_host의 public_ip or elastic_ip>;
location / {
proxy_pass <private_subnet의 private_ip>:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
nginx 실행
sudo nginx -t # 설정 테스트
sudo systemctl restart nginx # 서비스 재시작
Private subnet EC2 (Airflow)
웹 서버 동작 확인
sudo docker ps
curl <private_subnet의 private_ip>:8080
마무리
Airflow Web server 접속
http://<Bastion_host의 public_ip or elastic_ip>
고민 과정
bastion host -> Privaet Subnet EC2 연결 과정
- Private Subnet EC2에만 8080 port 적용 (보안 그룹 수정 전)
- Private Subnet EC2에서는 curl 정상 작동, 그러나 Bastion Host에서는 동작 X
- http 포트인 80을 보안 그룹에 추가하지 않아서 발생한 결과
- airflow_web_access_sg에 http, https 포트 추가 후 Bastion Host 인바운드 그룹에 추가
- Bastion Host에서도 Private Subnet EC2와 같은 curl 결과 확인
- Nginx의 동작 과정을 제대로 알지 못해 주소 창에 Private Subnet의 IP 입력
- Nginx의 Reverse Proxy 개념을 간단히 숙지한 뒤 Bastion Host의 public ip로 접속
HTTP vs HTTPS
- 현재 HTTP와 HTTPS 차이는 단순히 보안 수준의 차이로만 알고 있음
- 각 프로토콜의 특징을 알아본 뒤 가능하다면 HTTPS로 변경해 보안 강화
Reference
'Infra > [인프라 구축기] Terraform 활용 AWS 인프라 구축' 카테고리의 다른 글
인프라 구축기 (8) - Lambda를 활용한 AWS 인스턴스 시작, 중지 자동화 (1) | 2024.10.19 |
---|---|
인프라 구축기 (7) - Airflow 및 Redshift 사용자 생성, 권한 설정 (1) | 2024.10.18 |
인프라 구축기 (5) - Private Subnet EC2에서 다른 Subnet의 인스턴스 접근 확인 (0) | 2024.10.11 |
인프라 구축기 (4) - Bastion Host에서 Private Subnet 접근 확인 (5) | 2024.10.09 |
인프라 구축기 (3) - Terraform을 활용한 Instance, Storage 구성 (0) | 2024.10.06 |