AWS (4) - ELB, ACM

임재성·2026년 2월 18일

AWS 기초

목록 보기
4/8

ELB

ELB란?

  • 일반적인 백엔드와 프론트엔드는 서로 데이터를 주고 받는다. 이때주고받는 데이터가 외부에 노출되지 않도록 하려면 HTTPS를 사용하여 통신할 수 있게 해줘야 한다. 우리는 HTTPS를 적용하기 위해 ELB 서비스를 이용한다.
  • ELB(Elastic Load Balancing)은 AWS에서 제공하는 로드 밸런서 서비스를 말한다.
  • ELB에서는 트래픽 분산 기능을 제공하고, 추가적으로 특정 포트에서 HTTPS요청을 처리하도록 설정할 수 있으므로 보안이 필요한 웹사이트나 API 서버에서도 많이 사용함.

구성요소

  • 학습전 리전은 항상 서울로 선택

리스너

  • ELB로 들어오는 요청을 어떻게 처리할지 결정하는 규칙을 관리함.
  • 특정 포트와 프로토콜을 사용하여 클라이언트의 요청을 기다리고, 해당 요청을 ELB에서 설정된 규칙에 따라 적절한대상 그룹으로 전달.

대상그룹

  • ELB가 수신한 트래픽을 전달할 서버들의 집합을 의미.
  • ELB로 들어온 요청을 어떤 곳으로 전달할지 정해야 하는데, 여기서 어떤 곳을 ELB 에서는 대상 그룹이라고 표현함.
  • 또한 ELB는 트래픽의 전달 대상이 되는 서버들의 health check를 진행하여 전달 목적지를 정한다. 대상 그룹을 만들때 상태 검사를 할 경로와 포트를 지정한다.

대상그룹 만들기

  • ec2메뉴 접속후 대상그룹 메뉴 선택 -> 우측 상단 대상 그룹 생성 클릭

  • 대상 유형 : 이전에 생성했던 EC2 인스턴스에 연결할 목적이니 인스턴스 선택
    대상 그룹 이름 : 직관적인 이름으로 작성
    트래픽 전달 방식 : 현재 EC2 인스턴스는 IPv4 주소를 가지며, 백엔드 서버는 80 포트를 사용중이고, HTTP로 통신한다. 이에 맞춰 설정해준다.

  • 상태 검사 설정
    대상에 일정한 주기로 전송할 상태 검사를 설정하는 단계. HTTP에 /health 입력

    이렇게하면 대상 그룹의 EC2 인스턴스에 HTTP 프로토콜을 사용하여 GET /health 요청을 일정한 주기로 전송.
    정상적으로 작동하기 위해서는 따로 API를 구축해야함

  • 나머지는 그대로 두고 다음 클릭.

  • 대상 등록
    등록할 인스턴스 좌측 체크박스 클릭후.
    선택한 인스턴스를 위한 포트는 ELB로 들어온 요청을 대상에 추가한 인스턴스의 80번 포트로 전달하겠다는 의미.
    하단의 아래에 보류 중인 것으로 포함을 눌러 인스턴스 대상에 추가.

  • 다음 클릭

  • 지금까지 등록한 내용을 전체적으로 보여주는 것이니 확인 후 이상이 없다면 대상 그룹 생성 클릭

  • 좌측 대상 그룹 메뉴에서 확인

로드밸런서 생성

  • 학습전 리전은 항상 서울로 선택
  • EC2 메뉴에서 로드 밸런서 메뉴 클릭 -> 우측 상단 로드 밸런서 생성 클릭
  • 우리는 HTTP/HTTPS 기반 트래픽 처리가 필요하므로, Application Load Balancer 선택
  • 기본구성 설정
  • 네트워크 매핑
    가용영역 및 서브넷 모두 체크
  • 보안그룹 부분에서 새 보안 그룹 생성 클릭
  • 기본 정보 입력
  • HTTP/HTTPS 트래픽 허용 인바운드 규칙 추가
  • 우측 하단의 보안그룹 생성 클릭후 다시 돌아오기
  • 이전 보안 그룹 에서 방금 추가한 보안 그룹 선택
  • 리스너 및 라우팅에서 대상그룹은 우리가 이전에 추가했던 그룹으로 선택
  • 가장 하단의 로드밸런서 생성 클릭
  • 좌측 로드밸런서 메뉴에서 항목 추가된걸 확인

상태검사 API 추가.

  • 이전에 로드밸런서를 생성할때 상태검사를 할 수 있도록 경로를 지정하였다.

  • 하지만 상태 검사에 사용되는 API를 추가하지 않으면 로드밸런서는 서버가 현재 정상적이지 않다고 판단합니다.

  • 예제 파일 다운로드
    git clone https://github.com/JSCODE-BOOK/aws-elb-springboot.git

  • 코드 확인(GET /health 요청시 응답하도록 되어있음)

AppController.java
@RestController
public class AppController {
 
// GET /health 요청 시 이 메서드 호출
 @GetMapping(“health”) 
public ResponseEntity<String> healthCheck() {
 
// HTTP 200 OK 응답과 메시지 반환
 return ResponseEntity.ok().body(“Success Health Check”); 
 }
}
  • 인스턴스에서 아래 명령들 실행
$ sudo lsof -i:80 # 80번 포트에서 실행되는 프로세스 확인
$ sudo kill {PID 값} # 80번 포트에서 실행되는 프로세스가 있다면 종료
$ cd ~/aws-elb-springboot
$ ./gradlew clean build -x test # 스프링 부트 프로젝트 빌드
$ cd build/libs 
$ sudo nohup java -jar aws-elb-springboot-0.0.1-SNAPSHOT.jar & # JAR 파일 실행
$ sudo lsof -i:80 # 80번 포트에서 실행되는 프로세스 조회
  • 결과

로드 밸런서로 확인

  • 좌측 로드밸런서 메뉴 클릭후 로드밸런서 이름을 클릭

  • 세부정보가 나타나는데 우측 하단의 DNS 이름을 통해서도 접속이 가능하다.
    http://<dns 이름>/health

  • 정상적으로 Success Health Check 가 뜬다면 성공.

로드 밸런서에 도메인 연결

EC2와 연결된 Route 53 레코드 편집

  • Route 53 메뉴로 들어가서 편집할 레코드 체크.
  • 우측에 레코드 편집 클릭
  • 레코드 편집(별칭 메뉴 옵션을 활성화 하면 하단이 변경된다.)
  • 이제 도메인을 통해서 로드밸런서로 전달된다.

HTTPS 적용

적용 단계

  1. SSL/TLS 인증서 발급받기
  2. 로드 밸런서에 HTTPS용 리스너 추가하기
  3. HTTP에서 HTTPS로 리디렉션 설정

SSL/TLS 인증서 발급받기

  • AWS에서 ACM(AWS Certificate Manager)라는 서비스를 활용하여 인증서 발급.

  • ACM을 통해서 발급받는 인증서는 대부분 무료.
    자세한건 공식페이지 를 통해서 확인

  • ACM 콘솔 접속

  • 리전을 서울로 꼭 설정하세요.

  • 인증서 요청 클릭

  • 그대로 퍼블릭 인증서 요청에 두고 다음 클릭

  • 이전에 만들어뒀던 도메인 주소 입력

  • 나머지 그대로 둔 후 요청 클릭

  • 좌측인증서 나열 메뉴 클릭후 항목 추가된 것 확인
    (정상적인 사용자가 발급한 것인지 확인 후 완료됨)

  • 인증서 목록에서 ID 클릭후 상세화면으로 넘어가기.

  • 도메인 소유자라는 사실을 인증하기 위해 ACM에서 제공하는 CNAME 이름과 값을 도메인의 레코드에 입력해야함.
    레코드 생성 클릭을 통해서 쉽게생성할 수 있지만 직접 레코드를 수동으로 생성.

  • ROUTE 53 메뉴에서 호스팅 영역 클릭후 나오는 도메인 주소 항목중 하나의 ID 클릭후 우측의 레코드 생성클릭

  • 레코드 생성 화면에서 레코드 유형CNAME으로 선택.
    이전 과정에서 ACM에서 제공되는 CNAME이름레코드 이름CNAME값 에 작성한 후 생성.

    주의점 : CNAME 이름을 복사 붙여넣기 할때, 전부다 붙여넣으면 안되고 도메인이 정상적으로 되도록 해야함.
    예를들어, CNAME 이름2343535_A.B.C.com 이라고 치자. 그렇다면 레코드 생성때 뒤에 B.C.com 이런식으로 편집 불가능한 메인 도메인이 작성되어 있을 것이다.
    그럼 CNAME 이름에서 2343535_A 부분만 붙여 넣으면 된다. CNAME 값은 그대로 작성.

  • 다시 ACM 메뉴로 들어와서 검증이 완료되었는지 확인.
    (10분이 지나도 안된다면 제대로 입력했는지 레코드 생성값 확인)

로드 밸런서에 HTTPS용 리스너 추가.

  • 로드 밸런서에서 HTTP 요청을 받을 수 있는 리스너를 만든 것처럼 HTTPS도 요청을 받을 수 있는 리스너를 추가해야한다.
  • EC2 콘솔에서 로드밸런싱 -> 로드 밸런서 메뉴 이동. 이전에 생성한 로드 밸런서 이름 클릭
  • 하단에 리스너 추가 클릭
  • 리스너 구성
  • 보안 리스너 설정. 이전에 만들었던 인증서 선택
  • 아래로 내려서 추가 버튼 클릭으로 생성 마무리.
  • 그러면 리스너 규칙항목에 추가 됨.
  • 이제 http://<도메인명>/health 뿐만 아니라 https://<도메인명>/health 도 정상 동작함.

HTTP에서 HTTPS로 리디렉션 설정.

  • HTTPS를 통해서 접속이 가능하더라도 HTTP로 접속또한 가능하다. 이렇게되면 보안이 취약하기때문에 HTTP로 접속하더라도 강제로 HTTPS로 접속하게 수정.
  • 기존 HTTP 리스너 삭제
  • 리스너 추가 클릭
    HTTP 80 포트로 들어오면 HTTPS 443 포트로 연결 되도록 설정
  • 추가 버튼으로 생성 마무리
  • 이제 http로 접속해도 https로 연결되는걸 확인할 수 있음.
profile
조금씩 앞으로

0개의 댓글