[AWS] API Gateway: REST/HTTP/WebSocket API 관리
정의
AWS API Gateway 는 REST / HTTP / WebSocket API 를 관리하는 완전관리형 서비스. 인증, 스로틀링, 캐싱, 요청/응답 변환, 로깅을 단일 서비스로 제공. Lambda 와 결합해 서버리스 백엔드의 진입점이 된다.
API 타입 비교
| 항목 | REST API | HTTP API | WebSocket API |
|---|---|---|---|
| 출시 | 2015 | 2019 | 2018 |
| 통신 방식 | 요청/응답 (무상태) | 요청/응답 (무상태) | 양방향 상태 유지 |
| 비용 | $3.50/million | $1.00/million | $1.00/million (+ 연결 시간) |
| 지연시간 | 높음 | 낮음 | - |
| JWT authorizer | Lambda 만 | 내장 | Lambda 만 |
| WAF 통합 | 가능 | X | X |
| Request validator | 있음 | X | X |
| Usage Plan / API Key | 있음 | X | X |
| Response 캐싱 | 있음 | X | - |
| Private endpoint | 있음 | X | - |
| ALB / Cloud Map 프라이빗 통합 | X | 있음 | - |
| NLB 프라이빗 통합 | 있음 | 있음 | - |
| 자동 배포 | X | 있음 | - |
| 카나리 배포 | 있음 | X | - |
| X-Ray 추적 | 있음 | X | - |
| Mock 통합 | 있음 | X | - |
| 요청 본문 변환 (VTL) | 있음 | X | - |
IMPORTANT
신규 프로젝트는 HTTP API 우선 검토. 기능 격차를 확인 후 REST API 선택.
REST 만의 핵심 기능: API 키 / 사용량 계획 / WAF / 프라이빗 엔드포인트 / 캐싱 / 요청 검증 / 본문 변환 / 카나리 / X-Ray. 이 중 하나라도 필요하면 REST.
HTTP 만의 핵심 기능: JWT 오소라이저 / 자동 배포 / ALB · Cloud Map 프라이빗 통합 / 최저 비용 · 지연.
엔드포인트 타입 (REST API)
REST API 는 어디에서 노출될지 3가지 유형 중 선택.
| 타입 | 특징 | Use Case |
|---|---|---|
| Edge-optimized | CloudFront 엣지 경유, 전세계 지연 최소화 (기본값) | 지리적으로 분산된 클라이언트 |
| Regional | 특정 리전에서 직접 제공 (엣지 우회) | 같은 리전 클라이언트, 자체 CloudFront 구성 |
| Private | VPC 내부에서만 (인터페이스 엔드포인트) | 내부 전용 API, 규정 준수 |
IMPORTANT
Private 엔드포인트는 REST 만 지원. HTTP API 에는 없음.
AWS 서비스 직접 통합 (Lambda 생략 패턴)
Lambda 없이 SQS / SNS / DynamoDB / Step Functions / Kinesis 직접 호출. 비용/지연/관리 최소화.
예: 요청 -> SQS 큐 (Lambda 없음)
integration:
type: AWS
integrationHttpMethod: POST
uri: "arn:aws:apigateway:us-east-1:sqs:path/123456789/my-queue"
credentials: "arn:aws:iam::123:role/apigw-sqs-role"
requestParameters:
"integration.request.header.Content-Type": "'application/x-www-form-urlencoded'"
requestTemplates:
"application/json": "Action=SendMessage&MessageBody=$util.urlEncode($input.body)"
언제 유리:
- API 는 단순히 요청을 수집만 하고, 실제 처리는 비동기
- 트래픽 급증 시 SQS 로 버퍼링
- Lambda 를 없애 콜드 스타트 회피 + 비용 절감
아키텍처: Lambda 프록시 통합
flowchart LR
Client["클라이언트"] -->|"HTTPS (TLS)"| APIGW["API Gateway"]
APIGW -->|"JWT / Lambda 인증"| Auth["Authorizer"]
Auth -->|"allow"| APIGW
APIGW -->|"Lambda Proxy 요청"| Lambda["Lambda"]
Lambda -->|"응답"| APIGW
APIGW -->|"HTTP 응답"| Client
APIGW -.->|"실패 시"| APIGW
Lambda proxy 통합: API Gateway 가 원본 요청을 그대로 Lambda 에 전달 (path, headers, body, queryStringParameters 포함). Lambda 는 statusCode, headers, body 를 포함한 JSON 을 반환.
통합 타입
Lambda Proxy
{
"httpMethod": "POST",
"path": "/users",
"headers": { "Authorization": "Bearer ..." },
"queryStringParameters": { "page": "1" },
"body": "{\"name\": \"alice\"}"
}
Lambda 응답:
{
"statusCode": 201,
"headers": { "Content-Type": "application/json" },
"body": "{\"id\": \"u123\"}"
}
HTTP Proxy
외부 URL 로 요청 그대로 포워딩. 변환 없음.
# 통합 설정
integration:
type: HTTP_PROXY
uri: "http://internal-alb.example.com/{proxy}"
httpMethod: ANY
VPC Link
프라이빗 VPC 내 ALB/NLB 와 연결. 인터넷 노출 없이 내부 서비스 연결.
flowchart LR
APIGW["API Gateway"] -->|"VPC Link"| VL["VPC Link"]
VL --> NLB["NLB (private)"]
NLB --> SVC["내부 서비스"]
AWS 서비스 직접 통합
Lambda 없이 DynamoDB, SQS, S3 등 직접 호출.
integration:
type: AWS
uri: "arn:aws:apigateway:us-east-1:dynamodb:action/PutItem"
credentials: "arn:aws:iam::123:role/apigw-dynamo-role"
인증/인가
Lambda Authorizer (커스텀)
def handler(event, context):
token = event['authorizationToken']
# JWT 검증 또는 DB 조회
effect = "Allow" if valid(token) else "Deny"
return {
"principalId": "user123",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Action": "execute-api:Invoke",
"Effect": effect,
"Resource": event['methodArn']
}]
},
"context": { "userId": "u123" } # Lambda 로 전달 가능
}
캐싱: Lambda Authorizer 결과를 TTL 동안 캐시. 기본 300초. 비용 절감 + 지연시간 단축.
JWT Authorizer (HTTP API 전용)
authorizer:
type: JWT
jwtConfiguration:
issuer: "https://cognito-idp.us-east-1.amazonaws.com/us-east-1_xxx"
audience: ["client-id-1"]
identitySource: "$request.header.Authorization"
Cognito, Auth0, Okta 등 OIDC 호환 IdP 와 바로 연동. Lambda 불필요.
IAM + SigV4
AWS SDK / CLI 로 서명된 요청. 내부 서비스 간 통신에 적합.
스로틀링 설정
flowchart TD
Req["요청"] --> AccLim["계정 레벨<br/>10,000 rps / 5,000 burst"]
AccLim --> APILim["API/Stage 레벨<br/>사용자 지정"]
APILim --> MethodLim["메서드 레벨<br/>사용자 지정"]
MethodLim --> UsagePlan["Usage Plan<br/>API Key 별 quota"]
| 레벨 | 기본값 | 변경 |
|---|---|---|
| 계정 전체 | 10,000 rps / burst 5,000 | Support 티켓으로 증가 |
| Stage/API | 계정 한도 공유 | 콘솔/API 로 설정 |
| 메서드 | Stage 한도 공유 | 각 메서드별 오버라이드 |
| Usage Plan | 일/월 quota, rps | API Key 단위 |
429 Too Many Requests 반환 시 Retry-After 헤더 제공.
스테이지 관리
prod (v1) → stage variables: LOG_LEVEL=WARN
staging → stage variables: LOG_LEVEL=DEBUG
dev → stage variables: LOG_LEVEL=DEBUG
- Stage Variable: 스테이지별 환경 변수. Lambda alias 로 활용 가능.
- Canary deployment: 스테이지에서 일부 트래픽만 새 버전으로.
- Deployment: Stage 에 변경사항 반영 (명시적 배포 필요).
캐싱 (REST API)
# 캐시 활성화
aws apigateway update-stage \
--rest-api-id abc123 \
--stage-name prod \
--patch-operations \
op=replace,path=/cacheClusterEnabled,value=true \
op=replace,path=/cacheClusterSize,value=0.5
| 캐시 크기 | 비용/시간 |
|---|---|
| 0.5 GB | $0.020 |
| 1.6 GB | $0.038 |
| 6.1 GB | $0.200 |
| 13.5 GB | $0.250 |
WARNING
캐시는 REST API 전용. HTTP API 에는 없음. 비용이 추가되므로 고트래픽 GET 엔드포인트에만 적용.
요청/응답 변환 (REST API)
Velocity Template Language (VTL) 로 매핑:
#set($inputRoot = $input.path('$'))
{
"userId": "$inputRoot.id",
"email": "$inputRoot.contact.email"
}
HTTP API 는 변환 불가 (Lambda 내부에서 처리).
사용 패턴
BFF (Backend for Frontend)
flowchart LR
Web["Web 클라이언트"] --> GWAY["API Gateway<br/>BFF"]
Mobile["Mobile 클라이언트"] --> GWAY
GWAY --> UserSvc["User Service<br/>Lambda"]
GWAY --> OrderSvc["Order Service<br/>Lambda"]
GWAY --> PaySvc["Payment Service<br/>Lambda"]
Microservice Gateway
각 마이크로서비스에 별도 API Gateway 대신 단일 진입점 제공.
이벤트 수신 (SNS/SQS 연결)
Client → API Gateway → SQS → Lambda consumer
비동기 처리 패턴. 즉시 202 Accepted 반환, 실제 처리는 SQS 로.
비용 구조
| 항목 | REST API | HTTP API |
|---|---|---|
| 첫 3억 요청/월 | $3.50/million | $1.00/million |
| 3억 초과 | $1.51/million | $0.90/million |
| 캐싱 | 별도 시간당 요금 | 없음 |
| 데이터 전송 | AWS 표준 | AWS 표준 |
비용 절감 팁:
- HTTP API 우선 사용 (70% 저렴)
- 캐싱으로 Lambda 호출 감소
- REST API 의 Usage Plan 으로 초과 사용 방지
대안 비교
| 옵션 | 특성 | 적합한 경우 |
|---|---|---|
| API Gateway HTTP | 낮은 비용, JWT 내장 | 신규 서버리스 API |
| API Gateway REST | 풍부한 기능, WAF, 캐싱 | 레거시 마이그레이션, API Key 관리 |
| **[[aws-alb-nlb | ALB]]** | 고성능, 저렴, L7 LB |
| AppSync | GraphQL 특화, 실시간 | GraphQL API, 모바일 |
| CloudFront + Functions | 초저지연 엣지 | 간단 API 변환 |
함정
WARNING
Lambda 콜드 스타트: API Gateway 자체는 콜드 스타트 없음. Lambda Cold Start 가 응답 지연 원인. Provisioned Concurrency 로 완화.
WARNING
payload 크기 제한: REST/HTTP API 10 MB, WebSocket 128 KB. 대용량 파일은 S3 Presigned URL 로 직접 업로드.
CAUTION
프라이빗 API 와 VPC Endpoint: VPC 내부에서만 접근 가능한 API 는 Interface VPC Endpoint 필요. 구성 복잡.
WARNING
REST API 와 HTTP API 기능 격차: REST API 의 Request Validator, Usage Plan, 캐싱, WAF IP Set 참조 등은 HTTP API 에 없음. 마이그레이션 전 기능 확인 필수.
CAUTION
스테이지 변수와 Lambda alias: Stage variable 로 Lambda alias 참조 시 Lambda resource policy 에 API Gateway 권한 별도 추가 필요.
WARNING
CORS 설정 누락: HTTP API 는 CORS 자동 설정 지원. REST API 는 수동 설정 필요 (OPTIONS 메서드, Access-Control-Allow-Origin 헤더).
관련 위키
- aws-lambda - 주 통합 대상
- aws-lambda-cold-start - 콜드 스타트 문제
- aws-alb-nlb - 대안 L7 로드밸런서
- aws-vpc - 프라이빗 엔드포인트
- aws-iam - SigV4 인증
- aws-waf - 요청 필터링
- aws-cloudwatch - API 모니터링
- aws-sqs - 비동기 패턴 연결
이 글의 용어 (12개)
- [AWS] ALB vs NLB: L7 vs L4 로드 밸런서cloud
- 정의 | | ALB | NLB | (Classic ELB) | |---|---|---|---| | Layer | L7 (HTTP) | L4 (TCP/UDP) | L4 + L7 (…
- [AWS] CloudWatch: 메트릭, 로그, 알람cloud
- 정의 CloudWatch = AWS 의 모니터링 + 로그 + 알람 통합 서비스. 메트릭 수집, 로그 집계, 대시보드, 알람, 이상 감지를 하나의 서비스에서 제공. 사용 상황 | …
- [AWS] IAM: User, Role, Policy, STScloud
- 정의 IAM (Identity and Access Management) = AWS 의 권한 관리 전부. User, Group, Role, Policy 로 구성. "누가 어떤 리소…
- [AWS] Kinesis Data Streams: 실시간 스트리밍 수집cloud
- 정의 Amazon Kinesis Data Streams (KDS) 는 실시간 스트리밍 데이터를 대규모로 수집/저장하고, 여러 소비자가 각자 실시간 처리/재처리 할 수 있는 관리형…
- [AWS] Lambda Cold Start: 원인과 완화cloud
- 정의 Cold Start = Lambda 가 처음 호출 또는 idle 후 다시 호출 시 컨테이너 + 런타임 + 사용자 코드 init 에 소요되는 지연 시간. 사용 상황 (cold…
- [AWS] Lambda: 서버리스 함수, 트리거, 동시성cloud
- 정의 AWS Lambda = 서버리스 함수 실행. 이벤트 트리거 → 함수 실행 → 결과 / 비동기 처리. 서버 관리 0. 사용 상황 | 상황 | Lambda 적합성 | |---|…
- [AWS] SNS: pub-sub 알림, fan-out 패턴cloud
- 정의 SNS (Simple Notification Service) = pub-sub 메시징. Publisher 가 Topic 에 발행하면 모든 Subscriber 에 동시에 fa…
- [AWS] SQS: managed queue, FIFO, DLQcloud
- 정의 SQS (Simple Queue Service) = AWS 의 완전 관리형 메시지 큐. infinite scale, no provisioning, pay-per-reques…
- [AWS] Step Functions: 워크플로 오케스트레이션cloud
- 정의 Step Functions = 서버리스 워크플로 오케스트레이션. Amazon States Language (ASL, JSON) 으로 상태 기계 정의. 각 단계의 재시도, 에…
- [AWS] VPC: Virtual Private Cloudcloud
- 정의 VPC (Virtual Private Cloud) = AWS 안의 논리적 격리 네트워크. CIDR 정의 + subnet 분할 + 라우팅. AWS 리소스를 격리된 네트워크에 …
- [AWS] WAF (Web Application Firewall)cloud
- 정의 AWS WAF (Web Application Firewall) 는 HTTP/HTTPS 요청을 검사하는 Layer 7 방화벽 서비스입니다. CloudFront, ALB, AP…
- [DB] DynamoDB: PK + SK, single-table design, GSI / LSIdatabase-internals
- 정의 DynamoDB 는 AWS 의 fully managed key-value + document NoSQL. low-latency, infinite scale, schemale…
💬 댓글