트래픽 부하를 적절하게 분배하주는 장치, 전문적인 용어로 Load Balancer
서버 2대 이상 가용할 때 ELB를 필수적으로 도입
SSL/TLS는 HTTP => HTTPS로 변경시켜주는 인증서
ELB는 SSL/TLS 기능을 제공, SSL/TLS 인증서를 활용해 HTTP => HTTPS로 통신
왜 HTTP를 적용하는가?
1. 보안적 이유
데이터를 서버와 주고 받을때 암화화, => 암호화를 하지 않으면, 중간에서 데이터를 가로챌 가능성 있음
ELB를 사용하기 전에는 EC2의 IP 주소 또는 Domain 주소에 직접 요청을 보내는 구조, 하지만 ELB를 추가적으로 도입, 사용자들이 EC2에 직접적으로 요청을 보내지 않고 ELB를 향해, 요청을 보내도록 구성.
이 옵션을 선택한 이유 : 간단한 이유는 HTTP, HTTPS에 대한 특징을 활용하기 위함
로드벨런서가 어떤 가용영역으로 트래픽을 보낼 것인지 제한.
여기서는 가용영역에 제한을 둘 생각은 없다.
인바운드 규칙에 HTTP, HTTPS 포트로 모든 IP에 대해 요청을 받을 수 있도록 설계
그 후에 ELB를 만드는 곳에서 보안 그룹 등록하면 된다.
리스너 라우팅 설정은 ELB로 들어온 요청을 어떤 EC2 인스턴스에 전달 할 것인지 설정하는 부분
ELB에 들어온 요청을 어떤 곳(target group)으로 전달
즉, ELB에 들어온 요청을 어디로 보낼 것인지 대상 그룹을 형성
EC2에서 만든 특정 인스턴스로 트래픽을 전달할 것이기 때문에 인스턴스 옵션
traget에게 어떤 방식으로 전달 할지 설정. HTTP(HTTP1), 80번 포트, IPv4 주소로 통신을 한다는 걸 뜻한다. 이 방식이 흔하게 현업에서 많이 쓰이는 셋팅 방법이라고 함.
ELB의 부가 기능으로 상태 검사(= Health Check, 헬스 체크) 기능
if) 특정 EC2 인스턴스 내에 있는 서버가 예상치 못한 에러로 고장
ELB 입장에서 고장난 서버한테 요청(트래픽)을 전달하는 게 비효율적인 행동
ELB는 주기적으로 (default 30s) 대상 그룹에 속한 각각의 EC2 인스턴스에 요청을 보냄. 200번대(HTTP Status Code) 응답이 잘 날라온다면 서버가 정상
200이 안날라오면, 고장났다고 판단.
이런 동작으로 효율적 트래픽 분배 가능
ELB 만드는 곳으로 돌아와서, Traget Group 설정
ELB에 HTTP를 활용해 80 port로 들어온 요청을 설정한 대상 그룹으로 전달
SPRING Code로 예를 들자면
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
class HelloController {
// GET / 요청 처리
@GetMapping("/")
public String helloWorld() {
return "Hello World!";
}
// GET /health 요청 처리
@GetMapping("/health")
public String healthCheck() {
return "Success Health Check";
}
}
ELB에 Domain 연결
HTTPS 적용을 위한 인증서 발급
1. AWS Certificate Manager 서비스로 들어가서 인증서 요청 버튼 누르기
2. 인증서 요청하기
3. 인증서 검증
ELB에 HTTPS 설정
ELB에 리스너 및 규칙 수정
1. HTTPS 리스너 추가
현업에서는 ELB를 활용해서 HTTPS 적용을 더 많이 시킨다. HTTPS 설정도 쉬울 뿐더러 HTTPS 인증서의 만료기간 갱신도 자동
비용문제 때문에 그렇다. ELB는 사용하는 것 자체로써 비용.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@RestController
class EnvController {
// application.properties 또는 .env에서 DATABASE_NAME 환경 변수 가져오기
@Value("${DATABASE_NAME}")
private String databaseName;
// GET / 요청 처리
@GetMapping("/")
public String getDatabaseName() {
return ".env 테스트 : " + databaseName;
}
}
.env는 github에 올라가면 안되는 파일이고 연습용이다 보니 적은 것.
$ sudo apt update
$ sudo apt install nginx
http://<ip 주소>로 접속
$ sudo certbot --nginx -d <도메인 주소>
$ sudo certbot --nginx -d jscode-edu.link
$ sudo vi /etc/nginx/sites-available/default
Nginx 설정 파일(nginx.conf 또는 사이트별 설정 파일)에서 proxy_pass를 http://localhost:8080/으로 수정
server {
listen 80;
server_name jscode.edu.link;
location / {
proxy_pass http://localhost:8080/;
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_set_header X-Forwarded-Proto $scheme;
}
}