인터넷에서 Amazon ECS로 인바운드 연결을 받기 위한 모범 사례

인터넷에서 Amazon ECS로 인바운드 연결을 받기 위한 모범 사례

퍼블릭 서비스를 운영한다면 인터넷에서 오는 인바운드 트래픽을 수락해야 해요. 예를 들어 퍼블릭 웹사이트는 브라우저의 인바운드 HTTP 요청을 수락해야 해요. 이 경우 인터넷의 다른 호스트도 애플리케이션의 호스트에 인바운드 연결을 시작해야 해요.

출처: 문서

본문

이 문제에 대한 한 가지 접근 방식은 퍼블릭 IP 주소가 있는 퍼블릭 서브넷의 호스트에 컨테이너를 시작하는 것이에요. 그러나 대규모 애플리케이션에는 이 방식을 권장하지 않아요. 대규모 애플리케이션에는 인터넷과 애플리케이션 사이에 확장 가능한 입력 계층(input layer)을 두는 것이 더 나은 접근 방식이에요. 이 접근 방식에는 이 섹션에 나열된 AWS 서비스를 입력으로 사용할 수 있어요.

Application Load Balancer Application Load Balancer는 애플리케이션 계층에서 작동해요. 이는 OSI(Open Systems Interconnection) 모델의 7번째 계층이에요. 이로 인해 Application Load Balancer는 퍼블릭 HTTP 서비스에 적합해요. 웹사이트나 HTTP REST API가 있다면 Application Load Balancer가 이 워크로드에 적합한 로드 밸런서예요. 자세한 내용은 User Guide for Application Load Balancers 의 What is an Application Load Balancer? 를 참고해 주세요.

이 아키텍처에서는 퍼블릭 서브넷에 Application Load Balancer를 만들어 퍼블릭 IP 주소를 갖고 인터넷에서 인바운드 연결을 받을 수 있게 해요. Application Load Balancer가 인바운드 연결(더 정확히는 HTTP 요청)을 받으면 프라이빗 IP 주소를 사용해 애플리케이션에 연결을 열어요. 그런 다음 내부 연결을 통해 요청을 전달해요.

Application Load Balancer는 다음과 같은 장점이 있어요.

  • SSL/TLS 종료 — Application Load Balancer는 클라이언트와의 통신을 위해 보안 HTTPS 통신과 인증서를 유지할 수 있어요. 로드 밸런서 수준에서 SSL 연결을 선택적으로 종료해 내 애플리케이션에서 인증서를 처리하지 않아도 되게 해요.
  • 고급 라우팅 — Application Load Balancer는 여러 DNS 호스트 이름을 가질 수 있어요. 또한 호스트 이름이나 요청 경로 같은 메트릭에 따라 들어오는 HTTP 요청을 다른 목적지로 보내는 고급 라우팅 기능이 있어요. 이는 단일 Application Load Balancer를 많은 내부 서비스의 입력으로 사용하거나 REST API의 다른 경로에 있는 마이크로서비스의 입력으로 사용할 수 있다는 뜻이에요.
  • gRPC 및 websocket 지원 — Application Load Balancer는 HTTP 이상을 처리할 수 있어요. HTTP/2를 지원하면서 gRPC와 websocket 기반 서비스도 로드 밸런싱할 수 있어요.
  • 보안 — Application Load Balancer는 악성 트래픽으로부터 애플리케이션을 보호하는 데 도움을 줘요. HTTP desync 완화 같은 기능을 포함하며 AWS Web Application Firewall(AWS WAF)과 통합돼요. AWS WAF는 SQL 인젝션이나 크로스 사이트 스크립팅 같은 공격 패턴을 포함할 수 있는 악성 트래픽을 추가로 필터링할 수 있어요.

Network Load Balancer Network Load Balancer는 OSI(Open Systems Interconnection) 모델의 4번째 계층에서 작동해요. 비HTTP 프로토콜이나 종단 간 암호화가 필요한 시나리오에 적합하지만, Application Load Balancer의 HTTP 특정 기능은 갖고 있지 않아요. 따라서 Network Load Balancer는 HTTP를 사용하지 않는 애플리케이션에 가장 적합해요. 자세한 내용은 User Guide for Network Load Balancers 의 What is a Network Load Balancer? 를 참고해 주세요.

Network Load Balancer가 입력으로 사용되면 Application Load Balancer와 유사하게 작동해요. 퍼블릭 서브넷에 생성되어 인터넷에서 액세스할 수 있는 퍼블릭 IP 주소를 갖기 때문이에요. 그런 다음 Network Load Balancer는 컨테이너를 실행하는 호스트의 프라이빗 IP 주소에 연결을 열고 퍼블릭 쪽의 패킷을 프라이빗 쪽으로 보내요.

Network Load Balancer 기능 Network Load Balancer는 네트워킹 스택의 더 낮은 수준에서 작동하므로 Application Load Balancer와 동일한 기능 세트를 갖고 있지 않아요. 그러나 다음과 같은 중요한 기능이 있어요.

  • 종단 간 암호화 — Network Load Balancer는 OSI 모델의 4번째 계층에서 작동하므로 패킷 내용을 읽지 않아요. 이로 인해 종단 간 암호화가 필요한 통신을 로드 밸런싱하는 데 적합해요.
  • TLS 암호화 — 종단 간 암호화 외에도 Network Load Balancer는 TLS 연결을 종료할 수도 있어요. 이렇게 하면 백엔드 애플리케이션이 자체 TLS를 구현하지 않아도 돼요.
  • UDP 지원 — Network Load Balancer는 OSI 모델의 4번째 계층에서 작동하므로 비HTTP 워크로드와 TCP가 아닌 다른 프로토콜에 적합해요.

연결 종료 Network Load Balancer는 OSI 모델의 더 높은 계층에서 애플리케이션 프로토콜을 관찰하지 않으므로 해당 프로토콜에서 클라이언트에 종료 메시지를 보낼 수 없어요. Application Load Balancer와 달리 이러한 연결은 애플리케이션이 종료해야 하거나 태스크가 중지되거나 교체될 때 Network Load Balancer가 4번째 계층 연결을 종료하도록 구성할 수 있어요. Network Load Balancer 대상 그룹의 연결 종료 설정(connection termination setting)을 Network Load Balancer 문서에서 확인해 주세요.

Network Load Balancer가 4번째 계층에서 연결을 종료하게 하면 클라이언트가 이를 처리하지 않으면 원하지 않는 오류 메시지가 표시될 수 있어요. 권장 클라이언트 구성에 대한 자세한 내용은 Builders Library 를 참고해 주세요. 연결을 종료하는 방법은 애플리케이션마다 다르지만, 한 가지 방법은 Network Load Balancer 대상 등록 해제 지연(deregistration delay)이 클라이언트 연결 시간 초과보다 길도록 하는 것이에요. 클라이언트가 먼저 시간 초과되어 Network Load Balancer를 통해 다음 태스크에 정상적으로 다시 연결하는 동안 이전 태스크는 모든 클라이언트를 천천히 드레이닝해요. Network Load Balancer 대상 등록 해제 지연에 대한 자세한 내용은 Network Load Balancer 문서를 참고해 주세요.

Amazon API Gateway HTTP API Amazon API Gateway는 요청 볼륨이 갑자기 폭증하거나 요청 볼륨이 낮은 HTTP 애플리케이션에 적합해요. 자세한 내용은 API Gateway Developer Guide 의 What is Amazon API Gateway? 를 참고해 주세요.

Application Load Balancer와 Network Load Balancer의 가격 모델 모두 로드 밸런서가 항상 인바운드 연결을 수락할 수 있도록 유지하는 시간당 가격을 포함해요. 반면 API Gateway는 각 요청에 대해 개별적으로 요금을 부과해요. 이로 인해 요청이 들어오지 않으면 요금이 발생하지 않아요. 높은 트래픽 부하에서 Application Load Balancer나 Network Load Balancer는 요청당 더 저렴한 가격으로 API Gateway보다 더 많은 요청 볼륨을 처리할 수 있어요. 그러나 전체적으로 요청 수가 적거나 트래픽이 낮은 기간이 있다면, 활용도가 낮은 로드 밸런서를 유지하기 위해 시간당 요금을 지불하는 것보다 API Gateway를 사용하는 누적 가격이 더 비용 효율적일 수 있어요. API Gateway는 API 응답을 캐시할 수도 있어 백엔드 요청률을 낮출 수 있어요.

API Gateway 기능은 VPC 링크를 사용해 AWS 관리형 서비스가 VPC의 프라이빗 서브넷 내부의 호스트에 프라이빗 IP 주소를 사용해 연결할 수 있게 해 줘요. Amazon ECS Service Discovery가 관리하는 AWS Cloud Map 서비스 검색 레코드를 확인해 이러한 프라이빗 IP 주소를 감지할 수 있어요.

API Gateway는 다음 기능을 지원해요.

  • API Gateway 작동은 로드 밸런서와 유사하지만 API 관리에 고유한 추가 기능이 있어요.
  • API Gateway는 클라이언트 권한 부여, 사용량 계층, 요청/응답 수정에 대한 추가 기능을 제공해요. 자세한 내용은 Amazon API Gateway features 를 참고해 주세요.
  • API Gateway는 엣지(edge), 리전(regional), 프라이빗(private) API 게이트웨이 엔드포인트를 지원할 수 있어요. 엣지 엔드포인트는 관리형 CloudFront 배포를 통해 사용할 수 있어요. 리전 및 프라이빗 엔드포인트는 모두 Region에 로컬이에요.
  • SSL/TLS 종료
  • 다른 HTTP 경로를 다른 백엔드 마이크로서비스로 라우팅

앞의 기능 외에도 API Gateway는 사용자 지정 Lambda 권한 부여자를 지원해 무단 사용으로부터 API를 보호할 수 있어요. 자세한 내용은 Field Notes: Serverless Container-based APIs with Amazon ECS and Amazon API Gateway 를 참고해 주세요.

더 알아보기 (Learn more)