티스토리 뷰

SW 개발

Amazon ELB, 개념 및 사용법 정리

지단로보트 2020. 11. 16. 16:13

로드 밸런서 생성 순서

  • 로드 밸런서 생성의 기본 흐름은 필요에 따라 n개의 대상 그룹을 생성한 후, 로드 밸런서에서 개별 리스너에 연동한 후, 실제 서비스할 도메인에 CNAME을 연동하면 완료된다. (HTTPS 프로토콜 리스너를 생성할 경우 추가로 SSL 인증서를 연동하는 작업이 추가된다.)

ACM 인증서 생성

  • ELB 또는 CloudFront를 이용할 경우, 안전한 컨텐츠 제공을 위해 SSL 인증서가 요구되는데 AWS Certificate Manager(ACM)를 이용하면 무료로 인증서를 생성할 수 있다. 생성된 인증서는 만료 일시 도래 60일 전에 자동으로 갱신하므로 사용자가 추가적인 작업을 할 필요가 없다.
  • ACM 인증서를 생성하는 방법은 아래와 같다.
AWS Certificate Manager 콘솔 접속
→ 리전 선택
→ 인증서 프로비저닝 [시작하기] 클릭
→ [공인 인증서 요청] 선택 → [인증서 요청] 클릭

# 1단계: 도메인 이름 추가
→ 도메인 이름: *.foobar.com (입력)
→ [이 인증서에 다른 이름 추가] 클릭
→ 도메인 이름: foobar.com (입력)
→ [다음] 클릭

# 2단계: 검증 방법 선택
→ [DNS 검증] 선택 → [다음] 클릭

# 3단계: 태그 추가
→ 태그 이름: Name (입력) → 값: foobar.com (입력) → [검토] 클릭

# 4단계: 검토 및 요청
→ [확인 및 요청] 클릭

# 5단계: 검증
→ (화면에 출력된 유형, 이름, 값으로 도메인 등록 사이트에서 CNAME 등록 후) [계속] 클릭
  • ACM 인증서는 리전 단위로 생성할 수 있다. 즉, 리전이 다르면 동일한 도메인에 대한 인증서를 다시 만들어야 한다. 주의할 점은 글로벌 리전의 성격을 가지는 CloudFront를 이용할 경우 반드시 버지니아 리전에 인증서를 생성해야 한다.
  • 도메인 이름 등록시 주의할 점은 *.foobar.com 뿐만 아니라 foobar.com까지 추가 등록을 해야 모든 루트 도메인에만 접속하는 경우까지 수용할 수 있다. [관련 링크]
  • 인증서 검증 방법으로는 CNAME 또는 이메일 검증을 선택할 수 있는데 CNAME으로 검증하는 것이 추후 인증시 자동 갱신 등 편리한 점이 많다. 사용 중인 도메인 등록 서비스의 해당 도메인에 출력된 CNAME을 등록하면 검증이 완료된다.

대상 그룹 생성

  • 로드밸런서 생성 전에 로드 밸런싱의 목적지를 정의한 대상 그룹을 생성해야 한다.
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [대상 그룹] 클릭
→ [Create target group] 클릭
→ Choose a target type: [IP addresses] 선택
→ Target group name: foobar (대상 그룹 이름)
→ Protocol: HTTP (로드 밸런싱할 프로토콜)
→ Port: 8080 (로드 밸런싱할 포트)
→ VPC: (로드 밸런싱할 대상 인스턴스가 위치한 VPC 선택)
→ Protocol version: HTTP1
→ Health check protocol: HTTP
→ Health check path: /
→ [Create target group] 클릭
  • AWS CLI에서는 아래와 같이 동일한 내용을 실행할 수 있다.
# 로드 밸런서에 연결할 8080 포트 대상 그룹 생성
$ aws elbv2 create-target-group --region {region} --name foobar-api-prod-public-8080 --target-type ip --protocol HTTP --port 8080 --vpc-id {vpc-id} --health-check-protocol HTTP --health-check-path /
  • 대상 그룹을 적용할 로드 밸런서가 AWS Fargate 서비스를 향할 경우, 대상 유형은 IP 주소를 선택하면 된다. AWS Fargate 서비스를 생성하는 시점에 해당 로드 밸런서를 선택하고, 로드 밸런싱할 컨테이너에서 생성한 대상 그룹을 지정하면 로드 밸런싱 설정이 완료된다.

보안 그룹 생성

  • 로드 밸런서 생성에 앞서 보안 그룹 생성이 필수로 요구된다. 아래는 443, 80포트에 대한 모든 퍼블릭 인바운드 요청을 허용하는 예이다. (443HTTPS 서비스를 위해, 80HTTP로부터 HTTPS로 리디렉션하기 위해 필요하다.)
# 보안 그룹 생성
$ aws ec2 create-security-group --region {region} --group-name foobar-prod-api-lb --description "foobar-prod-api-lb" --vpc-id {vpc-id}

# 보안 그룹에 443 포트 인바운드 허용
$ aws ec2 authorize-security-group-ingress --region {region} --group-name foobar-prod-api-lb --protocol tcp --port 443 --cidr 0.0.0.0/0

# 보안 그룹에 80 포트 인바운드 허용
$ aws ec2 authorize-security-group-ingress --region {region} --group-name foobar-prod-api-lb --protocol tcp --port 80 --cidr 0.0.0.0/0

로드 밸런서 생성

  • 이제 앞서 생성한 대상 그룹을 이용하여 로드 밸런서를 생성할 차례이다.
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [로드밸런서] 클릭
→ [Load Balancer 생성] 클릭
→ Load Balancer 유형 선택: [Application Load Balancer] 생성
→ 리스너 → Load Balancer 프로토콜: HTTPS (리스닝할 프로토콜) → Load Balancer 포트: 443

# 추가 서비스
→ [액셀러레이터를 생성하여 고정 IP 주소를 얻고 애플리케이션의 성능과 가용성을 향상합니다.] 체크
→ 엑셀러레이터 이름: foobar (입력)
→ 가용 영역 → VPC: (로드 밸런싱할 대상 인스턴스 위치한 VPC 선택)
→ 대상 그룹 → 대상 이름: [기존 대상 그룹] 선택 → 이름: foobar (대상 그룹 이름)
  • 리스너 설정시 프로토콜로 HTTPS를 선택하면 추가로 SSL 인증서를 선택하는 화면이 안내된다.
  • 로드 밸런서의 앞단에 AWS Global Accelerator을 생성하여 연동할 수 있는데, 이 경우 특정 리전에 위치한데 따른 먼 곳에서의 요청에 대한 물리적인 레이턴시를 완화해주는 역할을 해준다. 사용량 만큼의 추가 과금이 발생한다.
  • 생성된 로드 밸런서는 고유의 DNS 이름을 가지게 되며 (ex: foobar-2047099645.ap-northeast-2.elb.amazonaws.com) ACTIVE 상태로 전환되면 바로 접속이 가능해진다.

로드 밸런서 80 to 443 리디렉션 설정

  • 로드 밸런서에서 암호화되지 않은 80 포트 요청에 대해, 대상 그룹을 생성한 암호화된 443 포트 리디렉션 설정을 해줄 수 있다.
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [로드밸런서] 클릭
→ (로드밸런서 선택)
→ [리스너 추가] 클릭

# 리스너
→ 프로토콜: [HTTP] 선택
→ 포트: [80] 입력
→ [+ 작업 추가] 클릭 → [리디렉션 대상...] 클릭 → [HTTPS] 선택 → 443 (입력) → [v] 클릭
→ [저장] 클릭
  • AWS CLI에서는 아래와 같이 동일한 내용을 실행할 수 있다.
# 80 to 443 리디렉션 설정
$ aws elbv2 create-listener --region {region} --load-balancer-arn {loadbalancer-arn} --protocol HTTP --port 80 --default-actions "Type=redirect,RedirectConfig={Protocol=HTTPS,Port=443,Host='#{host}',Query='#{query}',Path='/#{path}',StatusCode=HTTP_301}"

로드 밸런서 SSE 설정 최적화

  • 로드 밸런서의 대상 서비스가 SSE(Server Sent Events)를 요청 받을 경우, SSE의 특성상 오랫동안 유지되는 연결이 발생하기 때문에 연결 60초가 경과된 후 로드 밸런서가 연결을 끊고 504 Idle Timeout을 응답하는 현상을 경험했다. 이 경우 Idle Timeout 값을 기존 60초에서 3,600초(60분)으로 변경하면 된다. [관련 링크1] [관련 링크2]
Amazon EC2 콘솔 접속
→ [로드밸런싱] → [로드밸런서] 클릭
→ (로드밸런서 선택)
→ [작업] 클릭 → [속성 편집] 클릭

# Load Balancer 속성 편집
→ 유휴 제한 시간: 3600 (입력)
→ [저장] 클릭
  • 로드 밸런서의 대상 서비스가 SSE를 제공할 경우, 아래와 같이 Sticky Session 기능을 활성화하여 일관된 실시간 서버 푸시를 보장할 수 있다. [관련 링크1] [관련 링크2]
Amazon EC2 콘솔 접속
→ [로드 밸런싱] → [대상 그룹] 클릭
→ (설정을 적용할 대상 그룹 클릭)
→ [Attributes] → [Edit] 클릭

# Edit attributes
→ [Stickiness] 체크
→ [Save Changes] 클릭

로드 밸런서 gzip 압축 미지원

  • gzip 압축은 서비스의 아웃바운드 트래픽을 줄일 수 있는 간단하면서 획기적인 방법이다. ELBgzip 압축을 직접적으로 지원하지 않는다. 따라서 ELB의 대상 인스턴스에서 gzip 압축을 설정하거나, 앞단에 CloudFront를 설정해야 한다.

Namecheap 등록 도메인-로드 밸런서 연동

  • Amazon Route53이 아닌 다른 외부 도메인 이름 등록 업체에서 도메인을 등록하고 관리할 경우, 도메인 연동이 필요하다. 아래는 Namecheap에서 등록한 도메인에 대해 로드 밸런서의 DNS 이름CNAME으로 등록하여 서브 도메인을 연동한 예이다.
Namecheap 로그인 → [Account] 클릭 → [Domain List] 클릭 → (도메인) 선택 후
→ [Advanced DNS] 클릭
→ HOST RECORDS 표에서 [ADD NEW RECORD] 클릭
→ Type: [CNAME Record] 선택
→ HOST: foobar (서브 도메인 이름 입력)
→ Value: (로드 밸런서의 DNS 이름 입력, 마지막에 . 문자를 추가할 것)
→ [저장]

참고 글

댓글
댓글쓰기 폼