기준: DVA-C02 시험 가이드오류 제보
Amazon API Gateway가 처음 등장한 2015년, 서버리스 API를 만드는 방법은 EC2에 Flask나 Express를 올리거나, Elastic Beanstalk를 쓰는 것이었다. API Gateway는 "Lambda 함수를 HTTP 엔드포인트로 노출하는 관리형 서비스"라는 역할로 시작했지만, 시간이 지나며 인증·캐싱·트래픽 제어·모니터링이 붙은 완전한 API 관리 플랫폼으로 성장했다.
오늘은 REST API의 내부 구조를 완전히 해부한다. 클라이언트가 HTTP 요청을 보내는 순간부터 Lambda가 호출되고 응답이 돌아오기까지, 그 경로의 모든 계층이 무엇을 하는지 이해하면 시험의 API Gateway 문제를 풀 때 근거가 선다.
Lambda에는 2022년부터 Function URL이 있다. API Gateway 없이도 Lambda 함수에 직접 HTTPS 엔드포인트를 붙일 수 있다. 그런데 왜 API Gateway를 쓰는가?
| 기능 | Function URL | API Gateway HTTP API | API Gateway REST API |
|---|---|---|---|
| 비용 | 무료 (Lambda 요금만) | $1/100만 호출 | $3.5/100만 호출 |
| 라우팅 | 단일 함수 | 경로별 다른 함수 | 경로별 다른 함수 |
| 인증 | NONE / AWS_IAM | JWT / Lambda / IAM | Lambda / Cognito / IAM |
| 캐싱 | ❌ | ❌ | ✅ |
| API 키·사용량 플랜 | ❌ | ❌ | ✅ |
| 요청 검증 | ❌ | ❌ | ✅ (JSON Schema 기반) |
| WAF 통합 | ❌ | ❌ | ✅ |
| VTL 변환 | ❌ | ❌ | ✅ |
| X-Ray | ❌ | ❌ | ✅ |
| Response Streaming | ✅ | ❌ | ❌ |
| WebSocket | ❌ | ❌ | 별도 WebSocket API |
선택 기준: 단일 Lambda + 단순 HTTP 노출 → Function URL. 복잡한 라우팅·인증·캐싱·사용량 제한 필요 → REST API. 비용이 민감하고 단순한 Lambda/HTTP 프록시 → HTTP API.
REST API는 트리 구조다.
API (MyShopAPI)
└── 리소스 /products
├── GET → 통합(Lambda: ListProducts)
│ ├── 통합 요청 (요청 변환)
│ └── 통합 응답 (응답 변환)
├── POST → 통합(Lambda: CreateProduct)
└── /products/{productId}
├── GET → 통합(Lambda: GetProduct)
├── PUT → 통합(Lambda: UpdateProduct)
└── DELETE → 통합(Lambda: DeleteProduct)
리소스(Resource): URL 경로. {} 중괄호로 경로 파라미터 선언.
메서드(Method): GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.
통합(Integration): 메서드가 호출하는 백엔드. Lambda, HTTP, AWS 서비스, Mock.
스테이지(Stage): 배포 환경. dev, staging, prod.
배포(Deployment): API 변경사항의 스냅샷. 스테이지에 연결해야 반영됨.
⚠️ 함정: API를 변경한 후 반드시 배포를 생성하고 스테이지에 연결해야 변경이 적용된다. 콘솔에서 "저장"만 하고 배포를 빠뜨리면 클라이언트는 여전히 이전 버전의 API를 보게 된다.
클라이언트 요청 (HTTPS)
│
▼
[1. 엔드포인트 수신]
Edge-Optimized: CloudFront PoP에서 TLS termination
Regional: 리전 API Gateway 직접
Private: VPC Interface Endpoint 경유
│
▼
[2. 메서드 요청 (Method Request)]
- 인증 (IAM SigV4, Lambda Authorizer, Cognito)
- 경로 파라미터, 헤더, 쿼리스트링 검증
- 요청 모델(JSON Schema) 검증
실패 시 → 400/401/403 즉시 반환
│
▼
[3. 통합 요청 (Integration Request)]
- VTL 매핑 템플릿으로 요청 변환
- Lambda / HTTP 엔드포인트 / AWS 서비스 호출
│
▼
[4. 백엔드 처리]
- Lambda 실행
- HTTP 엔드포인트 응답
- DynamoDB 응답 등
│
▼
[5. 통합 응답 (Integration Response)]
- 백엔드 응답 → VTL 매핑 템플릿으로 변환
- Lambda Proxy면 변환 없이 그대로
│
▼
[6. 메서드 응답 (Method Response)]
- HTTP 상태 코드, 헤더, 응답 모델 설정
- 클라이언트에게 최종 응답 전달
이 6단계를 이해하면 API Gateway 트러블슈팅이 쉬워진다.
Edge-Optimized: CloudFront의 600+ PoP에서 TLS를 종료하고 백본망으로 요청을 전달. 글로벌 사용자가 많은 공개 API에 적합. 단, 실제 CloudFront 콘솔에는 보이지 않는 AWS 관리형 CloudFront다. 커스텀 CloudFront 설정이 필요하면 Regional + 별도 CloudFront를 사용한다.
Regional: 동일 리전의 클라이언트가 직접 연결. EC2나 Lambda에서 같은 리전 API를 호출할 때 유리. 자체 CloudFront를 붙여 캐싱과 WAF를 추가할 수 있다.
Private: VPC 내부의 Interface Endpoint(PrivateLink)를 통해서만 접근 가능. 인터넷에서 절대 접근 불가. 사내 마이크로서비스 API, 데이터 파이프라인 API에 적합.
| 엔드포인트 | CloudFront | 커스텀 도메인 ACM 위치 | 사용 케이스 |
|---|---|---|---|
| Edge-Optimized | AWS 관리 | us-east-1 필수 | 글로벌 공개 API |
| Regional | 선택(자체) | 각 리전 | 리전 내 서비스, 모바일 백엔드 |
| Private | 없음 | 각 리전 | VPC 내부 API |
⚠️ 함정: Edge-Optimized 커스텀 도메인의 ACM 인증서는 반드시 us-east-1에서 발급해야 한다. 이는 CloudFront가 us-east-1 ACM만 참조하기 때문이다. "도메인이 동작하지 않아요"라는 시나리오에서 인증서를 us-east-1이 아닌 다른 리전에서 발급한 경우가 흔한 원인이다. Regional 엔드포인트는 각 리전의 ACM에서 발급해도 된다.
스테이지는 단순히 "dev/staging/prod"를 구분하는 것 이상이다. 스테이지 변수를 통해 동일한 API 정의로 다른 백엔드에 라우팅할 수 있다.
API 통합 URI:
arn:aws:lambda:ap-northeast-2:123:function:OrderAPI:${stageVariables.lambdaAlias}
dev 스테이지: lambdaAlias = dev → OrderAPI:dev (별칭)
prod 스테이지: lambdaAlias = prod → OrderAPI:prod (별칭)
스테이지 변수 활용 패턴:
${stageVariables.backendUrl})# 스테이지 변수 설정
aws apigateway create-stage \
--rest-api-id abc123 \
--stage-name prod \
--variables 'lambdaAlias=prod,backendUrl=https://api.mycompany.com'스테이지 변수는 API Gateway 레벨의 환경 변수다. Lambda 함수의 환경 변수와는 다른 계층이다. Lambda 환경 변수는 함수 실행 시 코드에 노출되고, 스테이지 변수는 API Gateway가 통합 URI를 구성할 때 치환된다. 두 개를 함께 쓰면 API Gateway → Lambda 통합에서 스테이지별 다른 함수를 호출하고, 각 함수 내부에서는 자체 환경 변수로 추가 설정을 관리하는 구조가 된다.
| 항목 | REST API | HTTP API | WebSocket API |
|---|---|---|---|
| 비용 | $3.5/100만 | $1/100만 | $1/100만 메시지 + 연결 시간 |
| 지연 시간 | 보통 | 낮음 | - |
| 통신 방향 | 요청-응답 | 요청-응답 | 양방향 |
| Lambda Proxy | ✅ | ✅ | 라우트별 |
| Lambda Authorizer | ✅ | ✅ | ✅ |
| JWT Authorizer | Lambda 사용 | ✅ 기본 지원 | ❌ |
| Cognito Authorizer | ✅ | JWT로 대체 | ❌ |
| IAM (SigV4) | ✅ | ✅ | ✅ |
| API 키·사용량 플랜 | ✅ | ❌ | ❌ |
| 응답 캐싱 | ✅ | ❌ | - |
| 요청 검증 (모델) | ✅ | ❌ | ❌ |
| VTL 매핑 템플릿 | ✅ | ❌ | ❌ |
| AWS 서비스 직접 통합 | ✅ | ❌ | ❌ |
| WAF 통합 | ✅ | CloudFront 필요 | ❌ |
| X-Ray 트레이싱 | ✅ | ❌ | ❌ |
| Edge-Optimized | ✅ | ❌ | ❌ |
| VPC Link (ALB) | NLB만 | ALB/NLB/Cloud Map | ❌ |
| CORS 자동 설정 | 수동 | ✅ | - |
시험 시나리오 키워드 → 선택:
Route 53 A 레코드 (Alias)
api.mycompany.com → API Gateway Custom Domain
│
▼
API Gateway Custom Domain Name
+ ACM 인증서 (HTTPS TLS)
│
▼ Base Path Mapping
/v1 → REST API "MyAPI" stage "prod"
/v2 → REST API "MyAPI-v2" stage "prod"
/internal → REST API "InternalAPI" stage "prod"
# 커스텀 도메인 생성 (Regional 엔드포인트)
aws apigateway create-domain-name \
--domain-name api.mycompany.com \
--endpoint-configuration types=REGIONAL \
--regional-certificate-arn arn:aws:acm:ap-northeast-2:123:certificate/abc
# Base Path Mapping (하나의 도메인으로 여러 API 라우팅)
aws apigateway create-base-path-mapping \
--domain-name api.mycompany.com \
--rest-api-id abc123 \
--stage prod \
--base-path v1Lambda 별칭의 카나리와는 별도로, REST API 스테이지 자체에 카나리를 활성화할 수 있다.
# 스테이지에 카나리 설정 (새 배포의 10%만 카나리로)
aws apigateway update-stage \
--rest-api-id abc123 \
--stage-name prod \
--patch-operations \
'op=replace,path=/canarySettings/percentTraffic,value=10' \
'op=replace,path=/canarySettings/deploymentId,value=new-deploy-id'
# 카나리 승격 (100%로)
aws apigateway update-stage \
--rest-api-id abc123 \
--stage-name prod \
--patch-operations 'op=replace,path=/canarySettings/percentTraffic,value=0'API Gateway 카나리(배포 버전 수준)와 Lambda 별칭 카나리(함수 버전 수준)를 함께 쓰면 두 겹의 안전장치가 생겨 배포 위험을 줄일 수 있다.
API 정의를 코드로 관리하거나 팀 간에 공유할 때 OpenAPI 3.0 형식을 사용한다.
# openapi.yaml
openapi: "3.0.1"
info:
title: "ProductAPI"
version: "1.0"
paths:
/products:
get:
summary: "상품 목록 조회"
x-amazon-apigateway-integration:
type: aws_proxy
httpMethod: POST
uri: "arn:aws:apigateway:ap-northeast-2:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-2:123:function:ListProducts/invocations"
payloadFormatVersion: "1.0"
responses:
"200":
description: "성공"# OpenAPI 정의로 API import
aws apigateway import-rest-api \
--body file://openapi.yaml \
--region ap-northeast-2
# 기존 API 업데이트 (merge 모드)
aws apigateway put-rest-api \
--rest-api-id abc123 \
--mode merge \
--body file://openapi.yaml| API 유형 | 첫 3억 호출 | 초과 |
|---|---|---|
| REST API | $3.50/100만 | $1.51/100만 |
| HTTP API | $1.00/100만 | $0.90/100만 |
| WebSocket | $1.00/100만 메시지 + $0.25/100만 연결-분 | - |
| 캐싱 | 0.5GB: $0.020/h ~ 237GB: $3.800/h | - |
데이터 전송: 첫 10TB/월은 $0.09/GB, 이후 단계별 할인.
HTTP API는 REST API보다 요금이 낮아 웹훅 수신처럼 짧은 요청이 많은 워크로드에 유리하다. 다만 API 키와 사용량 플랜이 HTTP API에는 없으므로, 사용량 추적이 필요한 API는 REST API를 쓴다.
API Gateway REST API는 HTTP 요청을 받아 인증하고, 검증하고, 변환하고, 백엔드를 호출하고, 응답을 변환해 돌려주는 6단계 파이프라인이다. 엔드포인트 유형은 트래픽 경로를 결정하고, 스테이지는 환경별 배포 단위이며, 스테이지 변수는 하나의 API 정의로 여러 환경에 유연하게 연결하는 메커니즘이다. REST, HTTP, WebSocket 세 가지 API 유형은 기능과 비용에서 명확한 트레이드오프가 있으며, 요구 사항에 맞게 선택하면 된다.
다음 글에서는 API Gateway 통합의 핵심인 Lambda Proxy 통합, VTL 매핑 템플릿, AWS 서비스 직접 통합을 파고든다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
API Gateway REST API에서 스테이지를 만들었지만 변경 사항이 클라이언트에 반영되지 않는다. 원인은?
문제 2
Edge-Optimized API Gateway에서 커스텀 도메인을 설정하려 할 때 ACM 인증서는 어디서 발급해야 하는가?
문제 3
파트너 회사에 API를 제공하고 각 파트너별로 다른 호출 한도를 설정해야 한다. 어떤 API Gateway 기능을 사용해야 하는가?
문제 4
WAF(Web Application Firewall)를 API Gateway에 직접 통합할 수 있는 API 유형은?
문제 5
API Gateway 스테이지 변수의 사용 사례로 적절하지 않은 것은?
문제 6
한 팀이 REST API에서 HTTP API로 마이그레이션을 검토하고 있다. 마이그레이션이 불가능한 기능 요구사항은?
문제 7
API Gateway REST API의 엔드포인트 유형 중 VPC 내부에서만 접근 가능한 것은?