본문으로 건너뛰기
김신건의 로그

[AWS] API Gateway: REST/HTTP/WebSocket API 관리

· 수정 · 📖 약 3분 · 1,159자/단어 #cloud #aws #api-gateway #serverless #rest #websocket
aws-api-gateway, API Gateway, AWS API Gateway, REST API Gateway, HTTP API Gateway, WebSocket API

정의

AWS API Gateway 는 REST / HTTP / WebSocket API 를 관리하는 완전관리형 서비스. 인증, 스로틀링, 캐싱, 요청/응답 변환, 로깅을 단일 서비스로 제공. Lambda 와 결합해 서버리스 백엔드의 진입점이 된다.

API 타입 비교

항목REST APIHTTP APIWebSocket API
출시201520192018
비용$3.50/million$1.00/million$1.00/million
지연시간높음낮음-
JWT authorizerLambda만내장Lambda만
WAF 통합가능가능 (v2)아니오
Request validator있음없음없음
Usage Plan/API Key있음없음없음
Response 캐싱있음없음-
프라이빗 endpoint가능가능-

IMPORTANT

신규 프로젝트는 HTTP API 우선 검토. 기능 격차를 확인 후 REST API 선택.

아키텍처: 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

프라이빗 VPCALB/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,000Support 티켓으로 증가
Stage/API계정 한도 공유콘솔/API 로 설정
메서드Stage 한도 공유각 메서드별 오버라이드
Usage Plan일/월 quota, rpsAPI 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 APIHTTP 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-nlbALB]]**고성능, 저렴, L7 LB
AppSyncGraphQL 특화, 실시간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 헤더).

관련 위키

이 글의 용어 (8개)
[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] Lambda Cold Start: 원인과 완화cloud
정의 Cold Start = Lambda 가 처음 호출 또는 idle 후 다시 호출 시 컨테이너 + 런타임 + 사용자 코드 init 에 소요되는 지연 시간. 사용 상황 (cold…
[AWS] Lambda: 서버리스 함수, 트리거, 동시성cloud
정의 AWS Lambda = 서버리스 함수 실행. 이벤트 트리거 → 함수 실행 → 결과 / 비동기 처리. 서버 관리 0. 사용 상황 | 상황 | Lambda 적합성 | |---|…
[AWS] SQS: managed queue, FIFO, DLQcloud
정의 SQS (Simple Queue Service) = AWS 의 완전 관리형 메시지 큐. infinite scale, no provisioning, pay-per-reques…
[AWS] VPC: subnet, route, NAT, peeringcloud
정의 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…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기