AWS 기술 블로그
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 4부: API 관리
클라우드 컴퓨팅, 마이크로서비스 아키텍처, 빅데이터, 인공지능과 같은 기술의 발전과 함께 우리의 시스템은 더 유연하게 확장하고 상호작용할 수 있도록 진화하였고, 이에 따라 API 관리도 이전보다 더 복잡하고 동적인 과제로 변모하고 있습니다. 기업은 안정적이고 확장 가능한 API를 설계하고 애플리케이션과 서비스 간의 원활한 통신을 위한 방법을 모색하고 있으며, 이때 필수적으로 고려되는 주제 중 하나가 바로 API (Application Programming Interface) 라우팅 패턴입니다.
API 라우팅 패턴은 API를 관리하고 클라이언트 요청을 적절한 서비스 또는 엔드포인트로 라우팅하는 방식을 말합니다. 이는 소프트웨어 시스템에서 서로 다른 마이크로서비스나 엔드포인트 간의 효율적이고 유연한 통신을 지원하기 위한 전략이며 다양한 패턴이 존재합니다.
이 블로그 글에서는 다양한 API 라우팅 패턴을 살펴보고 각 패턴의 특징과 장단점, 선택 요령, 구현 방법에 대해 탐구해 볼 것입니다. 이러한 패턴들은 현대 시스템에서 데이터의 효과적인 전달과 관리를 가능케 하며, 안정성과 일관성을 유지하는 데 중요한 역할을 합니다. 이러한 패턴과 접근 방식을 이해하고 적용한다면 API 관리에 대한 통찰력을 확장할 수 있고 기업은 혁신을 이루는 데 도움이 되리라 믿습니다. 이제 API 라우팅 패턴에 대해 자세히 알아보겠습니다.
API 라우팅 패턴
API 라우팅은 클라이언트가 요청한 API 엔드포인트를 해당 요청을 처리할 수 있는 적절한 서비스 또는 기능으로 연결하는 방법입니다. 이 패턴은 대규모 애플리케이션에서 API 관리를 용이하게 하고, 복잡한 구조에서도 효율적으로 작동할 수 있도록 도와줍니다.
API 라우팅 패턴은 애자일한 개발 환경에서 여러 팀이 각자의 마이크로서비스를 개발하고, 이를 API로 노출하여 상호 작용할 수 있도록 하는 중요한 전략입니다. 이 패턴은 다양한 방법을 사용하여 서비스를 클라이언트에 노출함으로써 서비스 간 통신을 관리합니다.
호스트 이름과 경로를 사용하여 업스트림 소비자에게 HTTP API를 노출하는 세 가지 주요 방법이 있습니다.
- 호스트 이름 라우팅
- 경로 라우팅
- 헤더 기반 라우팅
아래 섹션에서는 요구 사항 및 조직 구조에 가장 적합한 방법을 결정하는 데 도움이 되도록 이러한 세 가지 라우팅 방법의 일반적인 사용 사례와 장단점을 간략하게 설명합니다.
(1) 호스트 이름 라우팅
호스트 이름별 라우팅은 각 API에 고유한 호스트 이름을 부여하여 API 서비스를 분리하는 방법으로, service-a.api.example.com
또는 service-a.example.com
과 같이 각각의 API 서비스를 식별합니다.
일반적인 사용 사례
- 다중 도메인 또는 서브도메인 지원 : 회사나 서비스에서 여러 브랜드, 제품 또는 서비스를 운영하는 경우에 사용됩니다. 각각의 브랜드나 서비스마다 고유한 도메인 또는 서브도메인을 할당하여, 해당 도메인에 따라 다른 API나 서비스로 라우팅할 수 있습니다.
- 환경 구분 (예: 개발, 테스트, 운영) : 개발, 테스트, 운영 환경 등 서로 다른 용도를 가진 여러 환경을 구분하기 위해 사용됩니다. 개발자들은 각각의 도메인 또는 서브도메인을 사용하여 서로 다른 API 버전이나 서비스에 접근할 수 있습니다.
- 다중 언어 또는 지역 지원 : 다국어 또는 다양한 지역에 대한 지원을 위해 사용됩니다. 서로 다른 지역 또는 언어에 대한 요청을 받아 해당 도메인에 따라 다른 콘텐츠 또는 서비스를 제공할 수 있습니다.
- 서비스 분리 : 마이크로서비스 아키텍처에서 여러 개별적인 마이크로서비스를 운영할 때, 각 서비스를 고유한 도메인 또는 서브도메인으로 분리하여 라우팅할 수 있습니다.
- 파티셔닝 및 테넌트 구분 : 다중 테넌시 애플리케이션에서 테넌트(사용자 또는 그룹)를 분리하기 위해 사용됩니다. 각 테넌트에 대한 요청을 해당 도메인으로 라우팅하여 서로 다른 데이터 또는 서비스를 제공할 수 있습니다.
이러한 사용 사례에서 호스트 이름 라우팅은 서로 다른 도메인 또는 서브도메인에 따라 API 엔드포인트를 분리하고, 각각에 맞는 서비스를 제공하는 데 효과적으로 활용됩니다.
호스트 이름별 라우팅은 서비스 팀 간에 아무것도 공유되지 않기 때문에 릴리스의 마찰을 줄일 수 있습니다. 대신 각 팀은 DNS 항목부터 프로덕션 환경의 서비스 운영에 이르기까지 모든 것을 관리하는 책임을 가집니다.
하이레벨 아키텍처
장점
- 확장이 쉽고 유연함 : 다중도메인이나 서비스 분리 시 HTTP API 라우팅을 위한 확장 가능한 간단한 방법.
- AWS에서 쉽게 구현 : AWS와 같은 서비스를 활용한 아키텍처를 구축하는 데 유용.
- 분리된 서비스 제공 : 팀은 호스트 이름 라우팅을 통해 하위 도메인을 소유하고, 배포 시에 격리, 테스트, 오케스트레이션 하기 쉬워지고 릴리스 시 발생하는 마찰을 줄일 수 있습니다. (예: 특정 리전이나 버전으로 서비스를 구분할 수 있습니다.
region.service-a.api.example.com
또는dev.region.service-a.api.example.com
).
단점
- 구성 복잡성 : 다수의 도메인 라우팅을 관리할 때 구성이 복잡해질 수 있습니다. 서버 설정이나 관리가 필요할 수 있습니다.
- 관리 및 유지보수의 어려움 : 수 많은 호스트나 도메인을 처리할 때 오작동의 가능성이 있습니다. 소비자가 각 API와 상호 작용하기 위해 서로 다른 호스트 이름을 기억해야 하고, 롤링 업데이트, 다국어, 버전 관리, 보안 문제, 버그 수정으로 인한 주요 변경 사항 전달, 문서 등을 지원해야 합니다.
- 보안 측면 : 호스트 이름 라우팅은 보안 측면에서 주의가 필요합니다. 올바른 권한과 접근 제어를 통해 안전성을 유지해야 합니다.
요약하면, 호스트 이름별 라우팅은 각 API를 독립적으로 운영하고 관리할 수 있으며, 각각의 서비스를 구분하기 쉽게 만들어줍니다. 그러나 이는 클라이언트 측에서 여러 호스트 이름을 관리해야 하므로 사용성을 고민해야 할 수 있을 수 있습니다.
호스트 이름 라우팅은 다양한 도메인 또는 서브도메인을 처리해야 하는 상황에서 유용하며, 특히 다중 서비스를 운영하고자 할 때 유연성을 제공합니다. 하지만 이는 관리 및 보안에 대한 주의가 필요한 기법이기도 합니다.
AWS 기반의 구현
Elastic Load Balancer를 사용하여 구현
- 팀은 Hostname 라우팅을 사용하여 하위 도메인을 완전히 소유할 수 있습니다.
Amazon API Gateway를 사용하여 구현
- 특정 배포를 더 쉽게 격리, 테스트 및 오케스트레이션 할 수 있습니다. (AWS 리전 또는 버전별 배포, 예를 들면
region.service-a.api.example.com
또는dev.region.service-a.api.example.com
)
(2) 경로 기반 라우팅
경로 기반 라우팅은 API 엔드포인트를 관리하고 요청을 처리하기 위한 가장 간단하고 직관적인 방법 중 하나이며, 여러 API 또는 모든 API를 동일한 호스트 이름으로 그룹화하고 요청 URI를 사용하여 서비스를 분리하는 메커니즘입니다. (예를 들면, api.example.com/service-a
또는 api.example.com/service-b
)
일반적인 사용 사례
- 리소스 분류 및 접근 : API 엔드포인트를 통해 특정 리소스 그룹에 접근하거나 특정 작업을 수행할 수 있습니다. 예를 들어,
/users
경로로 사용자 관련 작업을 수행하고/products
경로로 상품 관련 작업을 수행할 수 있습니다. - 서비스 모듈화 및 분리 : 서비스를 모듈화하고 경로 기반으로 분리하여 관리하는 것이 가능합니다. 이를 통해 각 서비스나 모듈에 대한 접근을 단순화하고, 개별적으로 관리할 수 있습니다.
- 권한 및 보안 관리 : 특정 경로를 통해 권한 관리를 할 수 있으며, 보안 측면에서 특정 리소스에 대한 접근 제어를 효과적으로 할 수 있습니다.
- 버전 관리 : API의 버전을 경로로 구분하여 관리할 수 있습니다.
/v1/users
,/v2/users
등의 경로를 사용하여 다른 버전의 API를 제공하고 관리할 수 있습니다.
대부분의 팀은 간단한 아키텍처를 원하기 때문에 경로 기반 라우팅을 선택합니다. 개발자는 URL 하나만 기억하면 되고, API 문서는 여러 포털이나 PDF로 분할되는 대신 함께 보관되는 경우가 많기 때문에 API를 더 쉽게 참조할 수 있습니다.
그러나 구성, 인가, 통합, 다중 홉으로 인한 추가 지연 등과 같은 운영 오버헤드를 수반하고, 잘못된 구성이 모든 서비스를 중단시키지 않도록 하기 위해 성숙한 변경 관리 프로세스가 필요합니다.
하이레벨 아키텍처
AWS 기반의 구현
AWS에서는 API를 공유하고 올바른 서비스로 효과적으로 라우팅하는 여러 가지 방법이 있습니다. AWS에서 경로 기반 라우팅을 구현하는 3가지 방법인 HTTP 서비스 역방향 프록시, Amazon API Gateway, Amazon CloudFront에 대해 알아보겠습니다. API 서비스를 통합하기 위해 제안된 접근법 중 어떤 것도 AWS에서 실행되는 서비스에 의존하지 않습니다. HTTP 호환성만 있다면 서비스는 문제없이 어떤 기술로도 실행될 수 있습니다.
HTTP 서비스 역방향 프록시를 사용하여 구현
이 방법은 하나의 도메인으로 여러 API를 통합하여 API 소비자에게 통일된 인터페이스를 제공하는 목적으로 사용됩니다.
장점
- 확장 가능성 및 관리 용이성 : 이 방법은 여러 API를 하나의 도메인으로 통합하는 것을 용이하게 만듭니다. 새로운 API를 추가하거나 기존 API를 업데이트하면서도 관리 오버헤드를 최소화할 수 있습니다.
- 서비스 팀 독립성 : 각 서비스 팀은 자체 API를 배포하고 관리할 수 있으며, 서비스 배포 이후에는 추가 관리 부담이 적습니다. 이는 빠른 개발 및 배포를 가능하게 합니다.
- 관측 가능성 (Observability) : 이 방법을 사용하면 API 스택의 각 수준에 관측 가능성을 추가할 수 있으며, 메트릭 및 로그를 수집하여 성능 및 문제 해결을 지원합니다.
- 고급 기능 추가 가능 : API 진입 지점을 사용자 정의할 수 있으므로, 속도 제한, 사용량 제어, 인증 및 권한 부여와 같은 고급 기능을 추가할 수 있습니다.
- AWS 관리 서비스 활용 : AWS X-Ray나 AWS WAF와 같은 AWS 관리 서비스를 활용하여 추적 및 보안 기능을 추가할 수 있습니다.
단점
- 인프라 구성 및 관리 : 이 방법은 다양한 인프라 구성 요소의 테스트와 관리가 필요하며, 사이트 신뢰성 엔지니어링(SRE)팀이 없는 경우 문제가 될 수 있습니다.
- 비용 관리 : 낮은 및 중간 수준의 트랜잭션 볼륨에서는 다른 방법보다 비용이 더 많이 들 수 있지만, 고수준의 트랜잭션 볼륨에서는 비용 효율적일 수 있습니다. (초당 약 100,000건 이상).
이 방법은 API 관리와 통합을 단순하게 만들 수 있는 강력한 방법 중 하나이지만, 인프라 관리와 비용 측면에서 고려해야 할 점이 있습니다. 특히 SRE 팀이 없는 경우, 인프라 관리가 더 복잡해질 수 있습니다. 그러나 대규모 트래픽에서는 비용 효율적일 수 있으므로 상황에 맞게 선택하는 것이 중요합니다.
Amazon API Gateway를 사용한 구현
Amazon API Gateway (REST API와 HTTP API 지원)를 사용하면 HTTP 서비스 리버스 프록시 방법과 유사한 방식으로 트래픽을 관리할 수 있습니다.
HTTP 프록시 모드
HTTP 프록시 모드를 사용하여 여러 서비스를 api.example.com
과 같은 상위 수준 서브도메인의 진입 지점으로 래핑하고, 그런 다음 요청을 중첩된 서비스로 프록시 할 수 있습니다. 예를 들어 billing.internal.api.example.com
과 같은 하위 도메인으로 요청을 전달할 수 있습니다.
와일드카드 경로
모든 경로를 루트 또는 코어 API 게이트웨이에서 매핑하는 것보다 /billing/*
와 같은 와일드카드 경로를 선택하는 것이 더 효율적입니다. 이렇게 하면 루트 API 게이트웨이를 모든 API 변경에 업데이트할 필요가 없으므로 API에 대한 더 많은 유연성을 얻을 수 있습니다.
장점
- 더 복잡한 워크플로우 제어 : REST API에서는 Apache Velocity Template Language (VTL)을 사용하여 요청 및 응답을 수정하는 등 더 복잡한 워크플로우를 제어할 수 있습니다.
- 인증 및 권한 부여 : AWS Identity and Access Management (IAM), Amazon Cognito, AWS Lambda authorizers와 같은 인증 및 권한 부여 기능을 제공합니다.
- 추적 기능 : AWS X-Ray를 통한 추적 기능을 활용할 수 있습니다.
- AWS WAF 통합 : AWS WAF와의 통합을 통해 보안을 강화할 수 있으며, 기본적인 속도 제한 및 사용량 토큰 관리도 가능합니다.
단점
- 높은 트래픽에서의 비용 : 매우 높은 트래픽 볼륨에서는 비용이 고려될 수 있습니다.
Amazon API Gateway는 API 관리 및 트래픽 라우팅을 단순화하고 다양한 기능을 제공하는 강력한 서비스이며, 특히 AWS 환경에서 API를 구축하고 운영하는 데 매우 유용합니다. 그러나 특히 높은 트래픽에서는 비용 관리를 신중히 고려해야 합니다.
Amazon CloudFront를 사용한 구현
Amazon CloudFront 의 동적 Origin 선택 기능
Amazon CloudFront의 동적 origin 선택 기능을 사용하면 요청을 조건부로 전달할 원본(서비스)을 선택할 수 있습니다. 이 기능을 사용하여 api.example.com
과 같은 단일 호스트명을 통해 여러 서비스를 라우팅할 수 있습니다.
라우팅 로직은 Lambda@Edge 함수 내에서 코드로 구현되므로 A/B 테스트, 카나리 릴리스, Feature flagging, Path rewriting과 같은 사용자가 커스터마이징 가능한 라우팅 메커니즘을 지원합니다.
장점
- API 응답 캐싱 : API 응답을 캐싱해야 하는 경우, 이 방법은 단일 엔드포인트 뒤에 여러 서비스를 통합하는 비용 효율적인 좋은 방법입니다.
- 보안 및 기능 추가 : CloudFront는 필드 수준 암호화와 AWS WAF와의 통합을 지원하여 기본 속도 제한 및 ACL(액세스 제어 목록)을 설정할 수 있습니다.
단점
- 최대 원본 제한 : 이 방법은 최대 250개의 원본(서비스)을 지원합니다. 대부분의 배포에는 충분하지만 서비스 포트폴리오를 확장하면 많은 API로 인해 문제가 발생할 수 있습니다.
- Lambda@Edge 함수 업데이트 지연 : Lambda@Edge 함수를 업데이트하는 데 몇 분이 걸릴 수 있습니다. 또한 CloudFront가 변경 사항을 모든 Point of Presence(PoP)로 전파하는 데 최대 30분까지 소요될 수 있으므로 업데이트가 완료될 때까지 추가 업데이트를 차단할 수 있습니다.
Amazon CloudFront는 API 라우팅 및 캐싱을 관리하는 강력한 서비스로, 여러 서비스를 통합하고 보안 및 속도 제한을 구현하는 데 유용합니다. 그러나 원본 제한과 업데이트 지연과 같은 몇 가지 제약 사항을 고려해야 합니다.
(3) HTTP 헤더 라우팅 패턴
일반적인 사용 사례
- 서비스 지정을 위한 HTTP 헤더 활용 : HTTP 요청에 포함된
x-service-a-action
헤더를 통해 어떤 서비스와 어떤 작업을 수행할지 명시적으로 지정할 수 있습니다. 예를 들어, get-thing 작업은 Service A에서 처리됩니다. - 버전 라우팅을 위한 메커니즘으로 활용 : 헤더 기반 라우팅은 API 버전 관리에도 활용됩니다. 적절한 헤더 값을 사용하여 API의 버전을 선택하고, 새로운 기능을 도입하면서도 이전 버전과의 호환성을 유지할 수 있습니다.
- 기능 플래그 및 A/B 테스트 활성화 : HTTP 헤더를 활용하여 특정 기능을 활성화하거나 A/B 테스트를 진행할 수 있습니다.
HTTP 헤더 라우팅 아키텍처에는 일반적으로 다음 다이어그램과같이 올바른 서비스로 라우팅하고 응답을 반환하는 얇은 라우팅 계층이 마이크로서비스 앞에 있습니다. 이 라우팅 계층은 모든 서비스를 포함하거나 버전 기반 라우팅과 같은 작업을 가능하게 하는 몇 가지 서비스만 포함할 수 있습니다.
하이레벨 아키텍처
장점
- 최소한의 구성 변경 및 자동화 : HTTP 헤더 라우팅은 구성 변경이 최소화되고 자동화하기 쉽습니다. 새로운 서비스를 추가하거나 기존 서비스를 수정해야 할 때, 헤더 값을 변경하거나 추가함으로써 간단하게 조정할 수 있습니다.
- 유연성과 특정 작업 노출 : 이 방법은 유연성을 제공하여 각 서비스에서 원하는 특정 작업만을 노출할 수 있습니다. 특정 작업에 필요한 기능만을 제한적으로 노출하여 API의 단순성과 효율성을 유지할 수 있습니다.
- 서비스 간 창의적인 협업 : HTTP 헤더 라우팅은 서비스 간에 창의적인 협업을 가능하게 합니다. 각 서비스는 필요한 헤더 값을 정의하여 원하는 작업을 수행하도록 설계할 수 있습니다.
단점
- 클라이언트 제어 및 보안 우려 : 사용자가 클라이언트를 완전히 제어하고 사용자 지정 HTTP 헤더를 조작할 수 있다는 가정이 있습니다. 이는 클라이언트에서 보안 우려가 발생할 수 있으며, 신뢰할 수 없는 클라이언트가 의도치 않은 헤더 값을 전송할 수 있습니다.
- 프록시 및 CDN 제약 : 프록시, CDN, 로드 밸런서 등은 헤더 크기를 제한할 수 있습니다. 헤더와 쿠키의 추가로 인해 발생하는 문제에 대해 프록시나 CDN에서 제약을 받을 수 있습니다. 큰 헤더 크기는 통신의 효율성을 저해할 수 있습니다.
- 헤더 관리의 어려움 : 헤더 값에 따라 라우팅 되는 것은 유연하지만, 복잡한 헤더 구조나 다양한 헤더 값에 대한 관리가 어려울 수 있습니다. 디버깅이 어려워질 수 있고, 복잡한 헤더 정책이 필요한 경우 관리에 어려움을 겪을 수 있습니다.
AWS 기반의 구현
Application Load Balancer를 사용하여 구현
ALB는 헤더값, 경로, 호스트 등 다양한 요소를 기반으로 한 라우팅을 지원하기 때문에, 다른 라우팅 기법과 함께 사용하여 더 풍부한 라우팅 기법을 구현할 수 있습니다. AWS 내에서 관리되는 완전 관리형 서비스로, 높은 가용성과 확장성을 제공하며 헤더 기반 라우팅을 쉽게 설정할 수 있습니다.
CloudFront (CF) + Lambda@Edge를 사용하여 구현
CloudFront는 글로벌 캐시를 제공하며, Lambda@Edge와 통합하여 각각의 Edge Location에서 코드를 실행할 수 있습니다. Lambda@Edge를 사용하면 헤더 값을 읽고 조작하며, 헤더 값을 기반으로 한 라우팅을 구현할 수 있습니다.
API Gateway (AGW) + Lambda를 사용하여 구현
API Gateway는 API의 생성, 배포, 관리를 효과적으로 수행하며, Lambda 함수와의 통합을 지원합니다. AGW와 Lambda를 조합하면 헤더 기반 라우팅을 위한 추가적인 구현을 Lambda에 할 수 있을 뿐만 아니라, 각 서비스의 풍부한 기능을 사용하는 서버리스 아키텍처를 구현할 수 있습니다.
요약
이번 블로그에서는 마이크로서비스 구축에서 유용하게 쓰이는 API 라우팅 패턴과 API를 노출하는 방식에 따른 3가지 라우팅 방식에 대하여 설명드렸습니다. 이러한 다양한 API 라우팅 패턴을 통해 기업은 아키텍처를 효과적으로 현대화 할 수 있습니다. 호스트 이름 라우팅은 서로 독립적으로 운영되는 다양한 도메인이나 서브도메인을 관리하고자 할 때 효과적이며, 각 서비스 팀이 자유롭게 관리할 수 있는 장점이 있습니다. 경로 기반 라우팅은 간단하고 직관적인 방법으로 API 엔드포인트를 그룹화하고 서비스를 모듈화하는 데 활용됩니다. 마지막으로 HTTP 헤더 라우팅은 클라이언트 측에서 최소한의 구성 변경으로 서비스를 관리하고 API 버전 관리에 유용한 메커니즘을 제공한다는 특징이 있었습니다.
결론
이러한 패턴들은 동적이고 복잡한 현대의 IT 환경에서 안정성과 일관성을 유지하며 데이터와 API를 효율적으로 관리하기 위한 강력한 도구로 작용합니다. 각 패턴의 특징과 장단점을 고려하여 조직의 요구 사항과 구조에 맞게 적절한 라우팅 전략을 선택한다면 기업은 미래 지향적이고 혁신적인 기술 환경에서 더 나은 성과를 거둘 수 있을 것입니다.
AWS 기반의 클라우드 디자인 패턴에 대한 블로그는 총 5개의 시리즈로 구성이 되어 있습니다. 아래에서 관심 있는 주제를 추가로 살펴보시기 바랍니다.
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 1부: 안정성
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 2부: 연결성 및 조합
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 3부: 마이그레이션
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 4부: API 관리
AWS 에 구축하는 클라우드 디자인 패턴 시리즈 5부: 데이터 관리