[AWS] ALB를 통해 Private Instance 속 Spring Boot 웹 서버 접속하기

아빠는 외계연·2022년 8월 15일
4
post-thumbnail
post-custom-banner

시스템 아키텍쳐

이번 실습을 통해 구성할 수 있는 아키텍쳐입니다!

[VPC 구성]


CIDR블록은 10.0.0.0/16으로 설정해주었다..

가용영역은 두 개를 설정하였고, 각각 프라이빗, 퍼블릭 서브넷 한 개씩을 두었다.

NAT 게이트웨이는 한 개만 생성하였다.

Nat Gateway

  • IP 패킷의 TCP/UDP 포트숫자, 소스 및 목적지의 IP주소 등을 재기록
  • 사설 IP를 외부 인터넷과 통신하기 위해 사용
  • 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용해서 인터넷에 접속하기 위함
  • private subnet과 public subnet은 같은 vpc내부에 있으면 통신이 가능
    • Nat Gateway를 붙이면 public subnet이 외부 인터넷 데이터를 private subnet으로 전달
  • 내부에서 외부로의 접속만 가능(단방향)
    • 외부에서 NAT Gateway를 이용해서 접속하는 것은 불가능

라우팅 테이블

  • 네트워크 트래픽이 전달되는 위치를 결정하는 데 사용되는 규칙세트를 포함
  • vpc내의 각 서브넷은 라우팅 테이블과 연결되어야 한다.

[Public Subnet]


igw : 인터넷 게이트웨이

  • 퍼블릭 서브넷은 인터넷 게이트웨이로 가는 경로가 있는 라우팅 테이블에 연결된다.
    -> 모든 인터넷 트래픽을 인터넷 게이트 웨이로 보낸다.
    -> 공인 IP 주소를 할당하여 퍼블릭 인터넷에서 해당 서브넷 내부의 리소스에 도달 가능
  • 양방향으로 작동한다.

인터넷 게이트웨이

  • vpc 라우팅 테이블에서 인터넷으로 라우팅 가능한 트래픽의 대상을 제공
  • 공인 IPv4주소가 할당된 인스턴스에 NAT(Network Address Translation)를 실행

[Private Subnet]

  • 모든 인터넷 트래픽을 NAT 게이트웨이로 보낸다.
    -> 외부 트래픽이 프라이빗 인스턴스와 연결하는 것을 방지한다.

[ALB(Application Load Balancer) 설정]

ALB

  • 둘 이상의 가용영역에서 EC2와 같은 여러 대상에 걸쳐 수신되는 애플리케이션 트래픽을 자동으로 분산
  • 리스너 : 구성한 프로토콜 및 포트를 사용하여 클라이언트의 연결 요청을 확인

  • Internet-facing : 외부 트래픽 수신 가능
  • Internal : private IP만 수신 가능

    public 서브넷에 ALB를 위치시켜 외부 트래픽을 받아들일 수 있도록 함
  • ALB 보안그룹 : 80포트로 들어오는 모든 트래픽 허용
  • 리스너는 80으로 설정 > 80으로 들어온 클라이언트의 연결요청을 확인

[인스턴스 설정]

Bastion instance

  • Private Subnet 내부의 인스턴스에 접속하기 위한 수단
  • ssh를 통해 해당 인스턴스에 접속한 뒤 해당 인스턴스 내부에서 ssh를 통해 Private Subnet 내부의 인스턴스에 접속

  • 해당 인스턴스는 외부와 통신을 해야 하기에 탄력적 IP주소를 연결
  • Public Subnet에 위치

보안그룹

  • 보안그룹은 인스턴스에 대한 인바운드 빛 아웃바운드 트래픽을 제어하는 가상방화벽 역할을 수행
  • 서브넷 수준이 아니라 인스턴스 수준에서 작동하며 허용 규칙만 지원

  • 본인의 ip로만 접속이 가능하도록 하고 22번 포트를 열어두었다.

[Private Instance]

  • 우분투 선택 > 본인은 우분투 명령어가 익숙하기 때문에 우분투를 선택하였다.
  • 각 Private Subnet당 인스턴스를 하나씩 배치할 것이다.
    -> 각 가용영역에 하나씩 배치
    Private Instance이기에 퍼블릭 IP 자동할당은 비활성화 시켜야 한다

[보안그룹]

  • ssh 포트는 Bastion Instance 보안그룹을 설정해두었다.
  • 스프링부트의 웹포트는 8080이기에 8080포트를 열어두고 ALB의 보안그룹을 설정해두었다.

[타겟 그룹 설정]

  • ALB의 타겟그룹으로 방금 생성한 Private Instance를 설정해두고 포트는 8080을 열어두었다.
    포트의 의미 > ALB에서 해당 인스턴스의 어떤 포트로 전달할지를 의미
    즉, 외부 트래픽 > ALB까지는 80번 포트를 열어두어 http로 접속이 가능하고, ALB에서 인스턴스까지는 8080포트로 해당 트래픽을 전달시키고, Private Instance는 ALB의 보안그룹으로 8080포트가 열려있으니 해당 트래픽을 전달받을 수 있는 것이다.

[Bastion Server에서 Private Instance 접속]

  • 본인은 ftp를 통해 Private Instance에 접속할 수 있는 키를 Bastion Server에 올려두었다.
  • 이후 ssh -i idiot.pem ubuntu@[Private IP] 명령어를 통해 Bastion Server에서 Private Instance로 접속이 가능하다.

전체 과정 총정리

  1. HTTP 프로토콜을 통해 ALB의 DNS에 접속한다.
  2. 80포트가 열린 ALB는 리스너를 통해 80포트로 접속했음을 알 수 있다.
  3. 8080포트가 열린 타겟그룹으로 해당 트래픽이 8080포트로 전달된다.
  4. 8080포트가 열린 Private Instance는 해당 트래픽을 전달받을 수 있다.
  5. 이를 통해 아파치 톰캣 위에 올려진 스프링부트 웹서버의 URL로 접속이 가능하다.
profile
Backend Developer
post-custom-banner

0개의 댓글