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

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

· 수정 · 📖 약 4분 · 1,567자/단어 #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 통합가능XX
Request validator있음XX
Usage Plan / API Key있음XX
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-optimizedCloudFront 엣지 경유, 전세계 지연 최소화 (기본값)지리적으로 분산된 클라이언트
Regional특정 리전에서 직접 제공 (엣지 우회)같은 리전 클라이언트, 자체 CloudFront 구성
PrivateVPC 내부에서만 (인터페이스 엔드포인트)내부 전용 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

프라이빗 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 헤더).

관련 위키

이 글의 용어 (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…

💬 댓글

사이트 검색 / 명령어

검색

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