[AWS] ALB 이용해서 AWS로 서비스 배포하기

2025. 10. 17. 11:33·DevOps

최근 AI를 이용한 업무 자동화라는 것에 약간의 관심이 생겨서 찾아보게 되었다.

개발 환경에 AI를 도입하는 것에 가장 접근하기 쉬운 방법인 것 같다.

 

AI를 이용한 업무 자동화를 하려면, 이벤트 트리거를 감지하고 처리하는 일련의 과정이기 때문에 AI 서버를 켜놓아야 한다.

그래서 AI 서비스를 AWS를 활용하여 띄우는 것을 먼저 정리해보려고 한다.

 

크게 다음과 같이 구성하려고 한다.

  • VPC 내부에 Public/Private Subnet을 분리해 보안 계층화
  • NAT로 Private Outbound 허용
  • Bastion으로 SSH 진입 통로 확보
  • ALB로 HTTPS 수신 및 Redirect
  • nginx로 내부 Docker 포트 프록시 처리

 

🎯 VPC 생성

우선 VPC를 생성해 보자. AWS 콘솔 검색창에서 VPC를 검색해서 Create VPC를 눌러주고, VPC and more를 눌러준다.

나는 이름을 그냥 기본 값인 project로 했는데, 목적에 맞게 바꿔도 된다.

여기서 중요한 것은! 아래 그림처럼 NAT 게이트웨이를 활성화해야 한다는 것이다. 나중에 넣으려면 귀찮다... 🥲

이렇게 NAT 게이트웨이를 미리 체크해 준 후에 Create VPC을 누른다.

조금 기다리다 보면... 생성이 완료되고, View VPC를 눌러서 빠져나온다. Your VPCs를 눌러서 내 VPC 목록을 살펴보면 이렇게 잘 생성된 것을 확인할 수 있다.

 

🎯 EC2 생성

이제 EC2 인스턴스를 만들어주자. 인스턴스를 총 2개 만들건데, 하나는 Bastion, 하나는 서비스다.

1. Bastion

먼저 Bastion Host를 만들어주자.

서비스는 보통 Private Subnet에서 돌아가는데, 이제 VPC 외부에서 Private Subnet에 접근해야 하는 경우 직접 접근할 수 있는 방법이 없다! 이때 Bastion Host를 거쳐서 Private Subnet에 접근할 수 있다.

즉, Bastion Host란 Public Subnet에 위치하며 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 해준다.

 

인스턴스 이름(project-bastion)을 써주고, 개인의 취향에 맞는 OS를 골라보자. 나는 Ubuntu가 익숙해서 Ubuntu를 선택했다.

스크롤을 내려서, 이미지와 인스턴스 유형을 골라주자. 꼭! Free tier eligible인 걸 골라서 돈이 새어나가는 것을 막자... 🥲

키 페어는 이미 만들어 놓은 거 써도 되지만, 나는 새로 만들어줬다.

그냥 이름만 작성해 주고, 키 페어 유형은 RSA, 프라이빗 키 파일 방식은 .pem 그대로 두고 생성해 줬다.

Key pair (login)에서는 앞서 생성한 키 페어를 선택해 준 후, 이제 네트워크 설정을 해준다.

기본값으로 하지 말고 Edit을 눌러서, 앞서 생성한 VPC를 선택해 주자.

그리고 이 인스턴스는 bastion이니까 Public Subnet에 있어야 한다. Subnet 중에서 public을 선택해 주자.

Public IP까지 자동 지정해 준 후, 이제 Security group을 만들어보자. 우선 이름을 적어준다.

인바운드 규칙의 경우, bastion의 내부로 접근하는 건 소스 코드에 접근할 일 밖에 없으니까 22번 포트(ssh)만 뚫어주면 된다. Source type을 My IP로 변경해 주자.

나머지는 그대로 두고 Launch!

 

2. 서비스

이제 서비스가 돌아갈 인스턴스를 만들어준다. bastion과 똑같이 하되, 다음 부분에만 신경 써서 만들어보자.

  • 인스턴스 이름: project-container
  • 키 페어: project-key-pair  → bastion과 동일해야 ssh 포워딩이 가능함!
  • 서브넷: private
  • Public IP: Disable → 필요 없음!

Security group 설정을 하기에 앞서, 이 인스턴스는 bastion과만 통신하게끔 설정할 것이다.

우선 새 창을 열어서 다음을 확인하자. EC2에서 아까 만들어놓은 bastion의 Instance ID를 클릭한다.

클릭하면 인스턴스의 상세 정보를 볼 수 있는데, 여기서 Private IPv4 주소를 복사해 준다.

이 주소를 통해서 bastion만 접근이 가능하게 설정해 줄 것이다.

이제 다시 Security group 설정으로 돌아가서 다음과 같이 설정해 준다.

우선 이름은 새로운 Security group을 생성하게끔 해줬고, project-container-sg라고 이름을 지어줬다.

인바운드 규칙은 다음과 같이 아까 복사해 놓은 IP 주소를 Source에 입력하여 설정해 준다.

ALB 관련 인바운드 규칙은 나중에 지정해 주자. 일단 이대로 launch!

 

🎯 SSH 접근

우선 bastion에 먼저 접근해 보자. 아래 순서대로 접근해서 Connect 클릭

SSH Clinet를 누르면 다음과 같이 접속할 수 있는 주소가 나온다.

키 페어로 이미 접속한 적이 있으면 아래 ssh -i ... 여기로 바로 접속하면 된다.

하지만 나는 키 페어를 방금 만들었으니까 그  위에 쓰여있는 대로 단계를 거쳐야 한다.

  1. 터미널을 열고
  2. 키 페어가 있는 디렉토리(나의 경우에는 Downloads)로 이동
  3. 키 페어에 대해 권한 부여
  4. ssh 접속

 

잘 들어와 진 것을 확인했으면, 이제 매번 키 페어를 이용해서 접속하지 않아도 되게끔 키 페어를 등록해 주자.

다시 bastion을 빠져나와서, ssh-add -K 키페어이름 명령을 주면 등록이 된다.

이제 ssh-add를 했기 때문에, -i 옵션 없이 ssh ubuntu@<IP> 명령만 주면 접속이 가능하다. 일단 ssh -A ubuntu@<IP>로 -A 옵션을 주고 실행해 보자.

이제 이 bastion 서버 안에서 서비스 인스턴스에 접속해보려고 한다.

아까 ssh 명령에서 -A 옵션으로 인해 키가 전달된다. 따라서 그냥 다음과 같이 서비스 인스턴스 IP를 가지고 ssh ubuntu@<IP> 명령만 주면 된다.

 

🌱 Docker 설치하기

이제 Private 환경에 있는 서비스 인스턴스까지 잘 접속이 되었으니, 여기서 Docker를 이용해서 AI 서비스를 돌려보자.

Ubuntu 환경에서 Docker를 돌리기 위해 https://docs.docker.com/engine/install/ubuntu/ 에 있는 대로 다음 명령어를 입력한다.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# Install the Docker package
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Verify that the installation is successful by running the hello-world image
sudo docker run hello-world

 

🌱 n8n 서비스 설치하기

n8n이라는 AI 서비스를 돌려보려고 한다. https://docs.n8n.io/hosting/installation/docker/ 에 있는 대로 다음 명령어를 입력한다.

이때 https 환경에서도 접속할 수 있도록 세팅할 거기 때문에 포트를 변경하고 관련 환경변수를 추가해 줬다.

  • -p 5678:443
  • N8N_PROTOCOL="https"
  • N8N_HOST="내 도메인 주소"
sudo docker volume create n8n_data

sudo docker run -d -it --rm \
 --name n8n \
 -p 5678:443 \
 -e GENERIC_TIMEZONE="Asia/Seoul" \
 -e TZ="Asia/Seoul" \
 -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true \
 -e N8N_RUNNERS_ENABLED=true \
 -e N8N_PROTOCOL="https" \
 -e N8N_HOST="내 도메인 주소" \
 -v n8n_data:/home/node/.n8n \
 docker.n8n.io/n8nio/n8n

 

🌱 nginx 설치하기

nginx도 깔아주자.

#설치
sudo apt-get install nginx

#확인
curl localhost:80

80번으로 찍었을 때 html 화면이 잘 나온다. 우리는 도커로 바꿔줘야 하기 때문에 터미널에 다음 명령을 입력해서 설정을 수정한다.

sudo vim /etc/nginx/sites-enabled/default

# 원본
location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
}

# 아래와 같이 수정
location / {
        proxy_pass http://localhost:5678;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1; # Required for WebSocket
        proxy_set_header Upgrade $http_upgrade; # Required for WebSocket
        proxy_set_header Connection "upgrade"; # Required for WebSocket
}

 

🎯 ALB 설정

이제 ALB(Application Load Balancer)를 설정해 주자. ALB는 외부에서 요청이 들어오면 서비스 인스턴스의 80번 포트로 연결해주는 역할을 한다.

AWS Console 창에서 Load balancers를 검색해서 EC2 feature의 로드 밸런서에 들어간다.

Create Load balancers를 클릭해서 로드 밸런서를 만들어주자.

우리는 Application Load balancer를 만들 거니까 클릭해 주고, 외부에서 요청을 받아서 접속하는 거기 때문에 다음은 그대로 설정해 준다.

  • Scheme: Internet-facing
  • Load balancer IP address type: IPv4

VPC의 경우 앞서 생성한 VPC(project-vpc)를 선택하고, 다음과 같이 AZ and subnets는 둘 다 public으로 설정해 준다.

그다음으로, Security groups은 create a new security group을 클릭해서 새로 만들어줘야 한다.

Security group 이름을 주고, VPC도 앞서 만든 VPC로 설정해 준다.

그리고 application load balancer니까 어디서든(Anywhere) https 통신으로 접속할 수 있게끔 인바운드 규칙을 정해준다.

아웃바운드는 설정 안 해도 된다.

이제 아까 ALB 설정으로 돌아와서 새로고침 버튼을 클릭하면 막 생성한 security group이 보인다.

이제 Listeners and routing을 설정해 주자. 우리는 HTTPS랑 통신할 거니까 프로토콜은 HTTPS로 바꿔준다.

이렇게 바꾸면 라우팅 액션을 선택할 수 있는데, 타깃 그룹이 현재 없기 때문에 create target group을 선택해서 만들어주자.

이 ALB는 수신 트래픽을 받기 때문에 http 통신이 필요하다. 다음과 같이 설정해 준다.

  • Choose a target type: Instances
  • Target group name: project-tg
  • Protocol: HTTP, Port: 80

80번 포트로 요청이 들어오면 서비스가 돌아가는 인스턴스로 연결해 줄 거기 때문에 next를 눌러서 나오는 화면에서 서비스 인스턴스를 골라주고 Include as pending below를 누른 후 create target group을 클릭한다.

다시 ALB 설정으로 돌아와서 새로고침 버튼을 클릭하면 새로 만든 타깃 그룹이 보인다. 이를 클릭해서 설정해 준다.

이제 Secure listener settings를 설정하자.

우선, ACM 인증서가 필요하기 때문에 먼저 만들어주었다. 아래로 들어가서 Request a public certificate을 해준다.

*. naver.com과 같이 도메인을 입력해 줬다. create 하고 난 뒤, Domains에서 cname을 설정해야 하는데 Create records in Route 53을 선택하면 알아서 만들어준다.

그다음 다시 돌아와서 ACM으로 인증서 설정해 주면 끝!

이제 내 도메인과 연결해 보자. Route 53에 들어가서 Hosted zones를 클릭해 내 도메인 계정으로 들어간다.

여기서 create record를 클릭한다.

아까 docker run 했을 때 줬던 도메인 주소 중 서브 도메인을 입력하고, Alias를 클릭한다.

우리는 ALB랑 연결하고, 지역 바꿔주면 아까 설정한 alb 주소 하나 나오는데 이를 연결해 준다.

이제 마지막으로 보안그룹에 ALB를 추가해 주자!

서비스가 돌아가는 인스턴스에 들어간다.

화면을 내려서 security를 클릭한다. 연결된 Security groups를 클릭해서 편집해 주자.

인바운드 규칙을 추가한다. HTTP 프로토콜을 선택한 뒤, Source에서 아까 생성한 alb의 Security Group을 선택해 준다.

추가로 Description에도 ALB를 적어줬다.

결과가 반영되는 동안, ALB에서 HTTP로 접근하면 HTTPS로 연결되도록 수정해 보자.

EC2 - Load balancers에서 아까 생성한 로드 밸런서를 선택해 준다.

여기서 Add listener를 선택해 준다.

아래와 같이 HTTP 요청이 들어오면 HTTPS로 리다이렉트 되도록 설정한다. 이때 Status code는 Permanently moved로 지정해야 한다.

지금 ALB 80번 포트도 막혀있는 상태다. ALB의 Security group도 수정해 주자.

로드 밸런서 중 project-lb를 선택한 후 Security group을 선택한다.

Edit inbound roles를 클릭해서 HTTP도 추가해 준다. 이때 source는 Anywhere로 하면 된다.

이렇게 해서 내가 아까 입력한 서브도메인.도메인.com으로 접속하면 올바르게 페이지가 뜨는 걸 확인할 수 있다!

 

저작자표시 비영리 변경금지 (새창열림)
'DevOps' 카테고리의 다른 글
  • 무중단 배포 - 롤링, 블루-그린, 카나리 배포
  • 단일 장애 지점(SPOF)과 이에 대응하는 방법들
  • [Docker] MySQL 설치하고 접속하기(feat. Access denied for user 'root'@'localhost' 에러 해결)
챙구리
챙구리
우당탕탕 개발자로 진화하기 (‘•̀ ▽ •́ )✎
  • 챙구리
    study log ꕤ*.゚
    챙구리
  • 전체
    오늘
    어제
    • ⋆。゚★⋆⁺₊⋆ ゚☾ ゚。⋆ ☁︎。₊⋆ ゚ (19)
      • Spring Boot (4)
      • Database (3)
      • DevOps (4)
      • Algorithms (5)
      • 약간의 AI (0)
      • 약간의 Front-end (1)
      • etc (2)
  • 인기 글

  • 태그

    스프링입문
    도커
    db모델링
    인텔리제이
    lombok
  • hELLO· Designed By정상우.v4.10.6
챙구리
[AWS] ALB 이용해서 AWS로 서비스 배포하기
상단으로

티스토리툴바