API Gateway

REST 및 WebSocket APIλ₯Ό 생성, κ²Œμ‹œ, μœ μ§€, λͺ¨λ‹ˆν„°λ§ 및 λ³΄ν˜Έν•˜κΈ° μœ„ν•œ AWS μ„œλΉ„μŠ€API κ°œλ°œμžλŠ” AWS λ˜λŠ” λ‹€λ₯Έ μ›Ή μ„œλΉ„μŠ€λ₯Ό λΉ„λ‘―ν•΄ AWS ν΄λΌμš°λ“œμ— μ €μž₯된 데이터에 μ•‘μ„ΈμŠ€ν•˜λŠ” APIλ₯Ό 생성할 수 있음

API Gateway Architecture

API Gateway κΈ°λŠ₯

Amazon API GatewayλŠ” λ‹€μŒκ³Ό 같은 κΈ°λŠ₯을 제곡

  • μƒνƒœ μ €μž₯(WebSocket) 및 μƒνƒœ λΉ„μ €μž₯(HTTP 및 REST) API에 λŒ€ν•œ 지원

  • κ°•λ ₯ν•˜κ³  μœ μ—°ν•œ 인증 λ©”μ»€λ‹ˆμ¦˜(예: AWS Identity and Access Management μ •μ±…, Lambda κΆŒν•œ λΆ€μ—¬μž ν•¨μˆ˜, Amazon Cognito μ‚¬μš©μž ν’€ λ“±)

  • APIλ₯Ό κ²Œμ‹œν•˜κΈ° μœ„ν•œ 개발자 포털

  • λ³€κ²½ 사항을 μ•ˆμ „ν•˜κ²Œ λ‘€μ•„μ›ƒν•˜κΈ° μœ„ν•œ Canary 릴리슀 배포

  • API μ‚¬μš© 및 API 변경에 λŒ€ν•œ CloudTrail λ‘œκΉ… 및 λͺ¨λ‹ˆν„°λ§

  • 경보 μ„€μ • κΈ°λŠ₯을 ν¬ν•¨ν•œ CloudWatch μ•‘μ„ΈμŠ€ λ‘œκΉ… 및 μ‹€ν–‰ λ‘œκΉ…

  • AWS CloudFormation ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ API 생성을 ν™œμ„±ν™”ν•  수 μžˆλŠ” κΈ°λŠ₯

  • μ‚¬μš©μž 지정 도메인 이름 지원

  • 일반적인 μ›Ή μ΅μŠ€ν”Œλ‘œμž‡μœΌλ‘œλΆ€ν„° APIλ₯Ό λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ AWS WAF와 톡합

  • μ„±λŠ₯ 지연 μ‹œκ°„ νŒŒμ•… 및 ν•™μŠ΅μ„ μœ„ν•΄ AWS X-Ray와 톡합

μ„œλ²„λ¦¬μŠ€ μ•„ν‚€ν…μ²˜μ˜ μΌλΆ€λ‘œ ꡬ성

API GatewayλŠ” AWS Lambda 및 HTTP μ—”λ“œν¬μΈνŠΈμ™€ κ°„μ†Œν•œ ν”„λ‘μ‹œ 톡합을 μ§€μ›ν•˜κΈ° 떄문에 AWS μ„œλ²„λ¦¬μŠ€ μΈν”„λΌμ˜ μ•± νŽ˜μ΄μ‹±(app-facing) 뢀뢄을 ꡬ성 κ°€λŠ₯

μ‚¬μš© λŒ€μƒ

API Gatewayλ₯Ό μ‚¬μš©ν•˜λŠ” κ°œλ°œμžλŠ” λ‹€μŒκ³Ό κ°™μŒ

  1. API 개발자 APIλ₯Ό μƒμ„±ν•˜κ³  λ°°ν¬ν•˜μ—¬ API Gatewayμ—μ„œ ν•„μš”ν•œ κΈ°λŠ₯을 κ΅¬ν˜„ API κ°œλ°œμžλŠ” AWS 계정 λ‚΄μ—μ„œ APIλ₯Ό μ†Œμœ ν•œ IAM μ‚¬μš©μžμ—¬μ•Ό 함

  2. μ•± 개발자 API Gatewayμ—μ„œ API κ°œλ°œμžκ°€ μƒμ„±ν•œ WebSocket λ˜λŠ” REST APIλ₯Ό ν˜ΈμΆœν•˜μ—¬ AWS μ„œλΉ„μŠ€λ₯Ό ν˜ΈμΆœν•˜κΈ°μ— 효과적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ좕

μ•± κ°œλ°œμžλŠ” API 개발자의 고객이기에, API에 IAM κΆŒν•œμ΄ ν•„μš”ν•˜μ§€ μ•Šκ±°λ‚˜ Amazon Cognito μ‚¬μš©μž ν’€ 자격 증λͺ… μ—°λ™μ—μ„œ μ§€μ›ν•˜λŠ” 타사 연동 자격 증λͺ… κ³΅κΈ‰μžλ₯Ό 톡해 μ‚¬μš©μž κΆŒν•œ λΆ€μ—¬λ₯Ό μ§€μ›ν•˜λŠ” 경우, μ•± κ°œλ°œμžλŠ” AWS 계정을 λ³΄μœ ν•  ν•„μš”κ°€ μ—†μŒ

API Gateway κ°œλ…

  • API Gateway

    • λ°±μ—”λ“œ HTTP μ—”λ“œν¬μΈνŠΈ, AWS Lambda ν•¨μˆ˜ λ˜λŠ” 기타 AWS μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•˜κΈ° μœ„ν•œ RESTful μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€(API)의 생성, 배포 및 관리

    • AWS Lambda ν•¨μˆ˜ λ˜λŠ” 기타 AWS μ„œλΉ„μŠ€λ₯Ό λ…ΈμΆœν•˜κΈ° μœ„ν•œ WebSocket의 생성, 배포 및 관리

    • ν”„λŸ°νŠΈ μ—”λ“œ HTTP 및 WebSocket μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 λ…ΈμΆœλœ API λ©”μ„œλ“œ 호좜

  • API Gateway HTTP API λ°±μ—”λ“œ HTTP μ—”λ“œν¬μΈνŠΈ λ˜λŠ” Lambda ν•¨μˆ˜μ™€ ν†΅ν•©λœ λΌμš°νŒ… 및 λ©”μ„œλ“œμ˜ λͺ¨μŒ 이 λͺ¨μŒμ„ ν•˜λ‚˜ μ΄μƒμ˜ μŠ€ν…Œμ΄μ§€λ‘œ 배포할 수 있음 각 λΌμš°νŒ…μ€ API Gatewayμ—μ„œ μ§€μ›λ˜λŠ” 고유의 HTTP 동사λ₯Ό 가진 API λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜ 이상 λ…ΈμΆœλ¨

  • API Gateway REST API λ°±μ—”λ“œ HTTP μ—”λ“œν¬μΈνŠΈ, Lambda ν•¨μˆ˜ λ˜λŠ” 기타 AWS μ„œλΉ„μŠ€μ™€ ν†΅ν•©λ˜μ–΄ μžˆλŠ” HTTP λ¦¬μ†ŒμŠ€μ™€ λ©”μ„œλ“œμ˜ λͺ¨μŒ 이 λͺ¨μŒμ„ ν•˜λ‚˜ μ΄μƒμ˜ μŠ€ν…Œμ΄μ§€λ‘œ 배포할 수 있음 각 API λ¦¬μ†ŒμŠ€λŠ” API Gatewayμ—μ„œ μ§€μ›ν•˜λŠ” μ „μš© HTTP 동사가 μžˆλŠ” API λ©”μ„œλ“œλ₯Ό ν•˜λ‚˜ 이상 ν‘œμ‹œ κ°€λŠ₯

  • API Gateway WebSocket API λ°±μ—”λ“œ HTTP μ—”λ“œν¬μΈνŠΈ, Lambda ν•¨μˆ˜ λ˜λŠ” 기타 AWS μ„œλΉ„μŠ€μ™€ ν†΅ν•©λ˜μ–΄ μžˆλŠ” WebSocket λΌμš°νŒ…κ³Ό λΌμš°νŒ… ν‚€μ˜ λͺ¨μŒ 이 λͺ¨μŒμ„ ν•˜λ‚˜ μ΄μƒμ˜ μŠ€ν…Œμ΄μ§€λ‘œ 배포할 수 있음 API λ©”μ„œλ“œλŠ” ν”„λŸ°νŠΈ μ—”λ“œ WebSocket 연결을 톡해 호좜되며, 이 μ—”λ“œν¬μΈνŠΈλ₯Ό λ“±λ‘λœ μ‚¬μš©μž 지정 도메인 이름과 μ—°κ²°ν•  수 있음

  • API 배포 API Gateway API의 νŠΉμ • μ‹œμ  μŠ€λƒ…μƒ· ν΄λΌμ΄μ–ΈνŠΈκ°€ μ‚¬μš©ν•  수 있게 ν•˜λ €λ©΄ 배포가 ν•˜λ‚˜ μ΄μƒμ˜ API 단계와 μ—°κ²°λ˜μ–΄ μžˆμ–΄μ•Ό 함

  • API 개발자 API Gateway 배포λ₯Ό μ†Œμœ ν•œ AWS 계정(예: ν”„λ‘œκ·Έλž˜λ° μ•‘μ„ΈμŠ€λ„ μ§€μ›ν•˜λŠ” μ„œλΉ„μŠ€ κ³΅κΈ‰μž)

  • API μ—”λ“œν¬μΈνŠΈ νŠΉμ • 리전에 λ°°ν¬λ˜λŠ” API Gateway의 API 호슀트 이름 호슀트 이름은 {api-id}.execute-api.{region}.amazonaws.com. λ‹€μŒκ³Ό 같은 μœ ν˜•μ˜ API 끝점이 지원됨

    • 엣지 μ΅œμ ν™” API μ—”λ“œν¬μΈνŠΈ

    • 프라이빗 API μ—”λ“œν¬μΈνŠΈ

    • 리전 API μ—”λ“œν¬μΈνŠΈ

  • API ν‚€ 영숫자 λ¬Έμžμ—΄λ‘œ API Gateway μ‚¬μš©ν•˜μ—¬ μ•± REST λ˜λŠ” websocket APIλ₯Ό μ‚¬μš©ν•˜λŠ” 개발자 API Gateway λ₯Ό λŒ€μ‹ ν•˜μ—¬ API ν‚€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ CSV νŒŒμΌμ—μ„œ κ°€μ Έμ˜¬ 수 있음 API 킀와 Lambda κΆŒν•œ λΆ€μ—¬μž λ˜λŠ” μ‚¬μš©λŸ‰ κ³„νšμ„ ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ API μ•‘μ„ΈμŠ€λ₯Ό μ œμ–΄ν•  수 있음

  • API 단계 API의 수λͺ… μ£ΌκΈ° μƒνƒœμ— λŒ€ν•œ 논리적 μ°Έμ‘°(예: 'dev', 'prod', 'beta', 'v2') API λ‹¨κ³„λŠ” API ID와 단계 μ΄λ¦„μœΌλ‘œ 식별됨

  • μ•± 개발자 API κ°œλ°œμžκ°€ λ°°ν¬ν•œ API와 μƒν˜Έ μž‘μš©ν•˜λ©° AWS 계정이 μžˆκ±°λ‚˜ 없을 μˆ˜λ„ μžˆλŠ” μ•± μƒμ„±μž μ•± κ°œλ°œμžλŠ” 일반적으둜 API ν‚€λ‘œ μ‹λ³„λ˜κ²Œ 됨

  • 콜백 URL μƒˆ ν΄λΌμ΄μ–ΈνŠΈκ°€ WebSocket 연결을 톡해 μ—°κ²°λ˜λ©΄ API Gatewayμ—μ„œ 톡합을 ν˜ΈμΆœν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ˜ 콜백 URL을 μ €μž₯ν•  수 있음 이 콜백 URL을 μ‚¬μš©ν•˜μ—¬ λ°±μ—”λ“œ μ‹œμŠ€ν…œμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ λ©”μ‹œμ§€λ₯Ό 보낼 수 있음

  • 개발자 포털 고객이 API μ œν’ˆ(API κ²Œμ΄νŠΈμ›¨μ΄ μ‚¬μš©λŸ‰ κ³„νš)을 등둝, 검색 및 κ΅¬λ…ν•˜κ³ , API ν‚€λ₯Ό κ΄€λ¦¬ν•˜κ³ , API에 λŒ€ν•œ μ‚¬μš© μ§€ν‘œλ₯Ό λ³Ό 수 있게 ν•΄μ£ΌλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜

  • 엣지 μ΅œμ ν™” API μ—”λ“œν¬μΈνŠΈ AWS λ¦¬μ „μ—μ„œ 일반적으둜 μ†μ‰½κ²Œ ν΄λΌμ΄μ–ΈνŠΈ μ•‘μ„ΈμŠ€κ°€ κ°€λŠ₯ν•˜λ„λ‘ CloudFront λ°°ν¬νŒμ„ μ‚¬μš©ν•  λ•Œ μ§€μ •λœ 리전에 λ°°ν¬λ˜λŠ” API Gateway API의 κΈ°λ³Έ 호슀트 이름 API μš”μ²­μ€ μ§€λ¦¬μ μœΌλ‘œ λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μœ„ν•΄ μ—°κ²° μ‹œκ°„μ„ 일반적으둜 ν–₯μƒμ‹œν‚€λŠ” κ°€μž₯ κ°€κΉŒμš΄ CloudFront μž…μ§€ 지점(POP)으둜 λΌμš°νŒ…λ¨

  • 톡합 μš”μ²­ API Gatewayμ—μ„œ WebSocket API λΌμš°νŒ… λ˜λŠ” REST API λ©”μ„œλ“œμ˜ λ‚΄λΆ€ μΈν„°νŽ˜μ΄μŠ€λ‘œ, μ—¬κΈ°μ—μ„œ λΌμš°νŒ… μš”μ²­μ˜ λ³Έλ¬Έ λ˜λŠ” λ©”μ„œλ“œμ˜ λ³Έλ¬Έ 및 νŒŒλΌλ―Έν„°λ₯Ό λ°±μ—”λ“œμ—μ„œ μš”κ΅¬ν•˜λŠ” ν˜•μ‹μœΌλ‘œ 맀핑함

  • 톡합 응닡 API Gatewayμ—μ„œ WebSocket API λΌμš°νŒ… λ˜λŠ” REST API λ©”μ„œλ“œμ˜ λ‚΄λΆ€ μΈν„°νŽ˜μ΄μŠ€λ‘œ, λ°±μ—”λ“œμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈ μ•±μœΌλ‘œ λ°˜ν™˜λ˜λŠ” 응닡 ν˜•μ‹μœΌλ‘œ 받은 μƒνƒœ μ½”λ“œ, 헀더, νŽ˜μ΄λ‘œλ“œλ₯Ό μ—¬κΈ°μ—μ„œ 맀핑함

  • 맀핑 ν…œν”Œλ¦Ώ VTL(Velocity Template Language)에 λ‚˜μ˜¨ 슀크립트둜, ν”„λŸ°νŠΈμ—”λ“œ 데이터 ν˜•μ‹μœΌλ‘œ 된 μš”μ²­ 본문을 λ°±μ—”λ“œ 데이터 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜κ±°λ‚˜ λ°±μ—”λ“œ 데이터 ν˜•μ‹μœΌλ‘œ 된 응닡 본문을 ν”„λŸ°νŠΈμ—”λ“œ 데이터 ν˜•μ‹μœΌλ‘œ λ³€ν™˜ 톡합 μš”μ²­ λ˜λŠ” 톡합 응닡에 맀핑 ν…œν”Œλ¦Ώμ΄ 지정될 수 있음 이듀은 μ‹€ν–‰ μ‹œκ°„μ— μ»¨ν…μŠ€νŠΈ 및 μŠ€ν…Œμ΄μ§€ λ³€μˆ˜λ‘œ μ œκ³΅λ˜λŠ” 데이터λ₯Ό μ°Έμ‘°ν•  수 있음 맀핑은 μš”μ²­μ— λŒ€ν•΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ°±μ—”λ“œλ‘œ 톡합을 톡해 ν—€λ”λ‚˜ 본문을 μ „λ‹¬ν•˜λŠ” 자격 증λͺ… λ³€ν™˜λ§ŒνΌ 간단할 수 있음 λ°±μ—”λ“œμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ νŽ˜μ΄λ‘œλ“œκ°€ μ „λ‹¬λ˜λŠ” μ‘λ‹΅μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€

  • λ©”μ„œλ“œ μš”μ²­ API λ°©λ²•μ˜ 곡용 μΈν„°νŽ˜μ΄μŠ€ API Gateway μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžκ°€ APIλ₯Ό 톡해 λ°±μ—”λ“œμ— μ•‘μ„ΈμŠ€ν•˜κΈ° μœ„ν•΄ 전솑해야 ν•˜λŠ” 맀개 λ³€μˆ˜ 및 본체λ₯Ό μ •μ˜

  • λ©”μ„œλ“œ 응닡 REST API의 퍼블릭 μΈν„°νŽ˜μ΄μŠ€λ‘œ, μ•± κ°œλ°œμžκ°€ API의 응닡에 κΈ°λŒ€ν•˜λŠ” λ³Έλ¬Έ λͺ¨λΈ, 헀더, μƒνƒœ μ½”λ“œλ₯Ό μ—¬κΈ°μ„œ μ •μ˜

  • λͺ¨μ˜ 톡합 λͺ¨μ˜ ν†΅ν•©μ—μ„œλŠ” 톡합 λ°±μ—”λ“œκ°€ 없어도 API Gatewayμ—μ„œ 직접 API 응닡이 생성됨 API κ°œλ°œμžλŠ” API Gatewayκ°€ λͺ¨μ˜ 톡합 μš”μ²­μ— μ‘λ‹΅ν•˜λŠ” 방법을 κ²°μ •λ˜λ©°, 이λ₯Ό μœ„ν•΄, λ©”μ„œλ“œμ˜ 톡합 μš”μ²­ 및 톡합 응닡을 κ΅¬μ„±ν•˜μ—¬ 정해진 μƒνƒœ μ½”λ“œμ™€ 응닡을 연결함

  • λͺ¨λΈ μš”μ²­ λ˜λŠ” 응닡 νŽ˜μ΄λ‘œλ“œμ˜ 데이터 ꡬ쑰λ₯Ό μ§€μ •ν•˜λŠ” 데이터 μŠ€ν‚€λ§ˆ λͺ¨λΈμ€ APIμ—μ„œ κ°•λ ₯ν•œ ν˜•μ‹μ˜ SDKλ₯Ό μƒμ„±ν•˜λŠ” 데 ν•„μš”ν•˜λ©°, νŽ˜μ΄λ‘œλ“œλ₯Ό ν™•μΈν•˜λŠ” 데에도 μ‚¬μš©λ¨ λͺ¨λΈμ€ μƒ˜ν”Œ 맀핑 ν…œν”Œλ¦Ώμ„ 생성해 ν”„λ‘œλ•μ…˜ 맀핑 ν…œν”Œλ¦Ώ 생성을 μ‹œμž‘ν•˜κΈ°μ— νŽΈλ¦¬ν•œ λ„κ΅¬λ‘œ, 있으면 μœ μš©ν•˜κΈ°λŠ” ν•˜μ§€λ§Œ 맀핑 ν…œν”Œλ¦Ώμ„ 생성할 λ•Œ λͺ¨λΈμ€ ν•„μš”ν•˜μ§€ μ•ŠμŒ

  • 프라이빗 API μ—”λ“œν¬μΈνŠΈ μΈν„°νŽ˜μ΄μŠ€ VPC μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 λ…ΈμΆœλ˜κ³  ν΄λΌμ΄μ–ΈνŠΈκ°€ VPC λ‚΄λΆ€μ˜ 프라이빗 API λ¦¬μ†ŒμŠ€μ— μ•ˆμ „ν•˜κ²Œ μ•‘μ„ΈμŠ€ν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” API μ—”λ“œν¬μΈνŠΈ 프라이빗 APIλŠ” 퍼블릭 인터넷과 κ²©λ¦¬λ˜μ–΄ 있으며, μ•‘μ„ΈμŠ€ κΆŒν•œμ΄ μžˆλŠ” API Gateway의 VPC μ—”λ“œν¬μΈνŠΈλ₯Ό μ‚¬μš©ν•΄μ•Όλ§Œ μ•‘μ„ΈμŠ€ν•  수 있음

  • 프라이빗 톡합 λ¦¬μ†ŒμŠ€λ₯Ό 퍼블릭 인터넷에 λ…ΈμΆœν•˜μ§€ μ•Šκ³ , ν΄λΌμ΄μ–ΈνŠΈκ°€ 프라이빗 REST API μ—”λ“œν¬μΈνŠΈλ₯Ό 톡해 고객 VPC λ‚΄λΆ€μ˜ λ¦¬μ†ŒμŠ€μ— μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” API Gateway 톡합 μœ ν˜•μž„

  • ν”„λ‘μ‹œ 톡합 κ°„μ†Œν™”λœ API Gateway 톡합 ꡬ성. HTTP ν”„λ‘μ‹œ 톡합 λ˜λŠ” Lambda ν”„λ‘μ‹œ ν†΅ν•©μœΌλ‘œ ν”„λ‘μ‹œ 톡합을 μ„€μ •ν•  수 있음 HTTP ν”„λ‘μ‹œ ν†΅ν•©μ—μ„œ API GatewayλŠ” ν”„λŸ°νŠΈ μ—”λ“œμ™€ HTTP λ°±μ—”λ“œ 간에 전체 μš”μ²­ 및 응닡을 전달함 Lambda ν”„λ‘μ‹œ ν†΅ν•©μ—μ„œ API GatewayλŠ” 전체 μš”μ²­μ„ λ°±μ—”λ“œ Lambda ν•¨μˆ˜μ˜ μž…λ ₯κ°’μœΌλ‘œ 전솑함 그런 λ‹€μŒ API GatewayλŠ” Lambda ν•¨μˆ˜ 좜λ ₯을 ν”„λŸ°νŠΈ μ—”λ“œ HTTP μ‘λ‹΅μœΌλ‘œ λ³€ν™˜ν•¨ REST APIμ—μ„œ ν”„λ‘μ‹œ 톡합은 ν”„λ‘μ‹œ λ¦¬μ†ŒμŠ€μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©λ˜λ©°, λ³΅μž‘ν•œ 경둜 λ³€μˆ˜(예: {proxy+})와 catch-all ANY λ©”μ„œλ“œλ‘œ ν‘œμ‹œλ¨

  • λΉ λ₯Έ 생성 λΉ λ₯Έ 생성을 μ‚¬μš©ν•˜μ—¬ HTTP API 생성을 κ°„μ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΉ λ₯Έ 생성은 Lambda λŠ” HTTP 톡합, κΈ°λ³Έ catch-all λΌμš°νŒ…, λ³€κ²½ 사항을 μžλ™ λ°°ν¬ν•˜λ„λ‘ κ΅¬μ„±λœ κΈ°λ³Έ μŠ€ν…Œμ΄μ§€λ₯Ό μ‚¬μš©ν•˜μ—¬ APIλ₯Ό 생성

  • 리전 API μ—”λ“œν¬μΈνŠΈ νŠΉμ • 리전에 배포되고 λ™μΌν•œ AWS λ¦¬μ „μ—μ„œ EC2 μΈμŠ€ν„΄μŠ€μ™€ 같은 ν΄λΌμ΄μ–ΈνŠΈμ— μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” API의 호슀트 μ΄λ¦„μœΌλ‘œ, API μš”μ²­μ€ CloudFront λ°°ν¬νŒμ„ κ±°μΉ˜μ§€ μ•Šκ³  리전별 API Gateway둜 직접 지정됨 리전 λ‚΄ μš”μ²­μ˜ 경우 리전 μ—”λ“œν¬μΈνŠΈλŠ” CloudFront λ°°ν¬νŒμ— λŒ€ν•œ λΆˆν•„μš”ν•œ 왕볡을 μš°νšŒν•¨ 뿐만 μ•„λ‹ˆλΌ, 리전 μ—”λ“œν¬μΈνŠΈμ— 지연 μ‹œκ°„ 기반 λΌμš°νŒ…μ„ μ μš©ν•˜μ—¬ λ™μΌν•œ 리전 API μ—”λ“œν¬μΈνŠΈ ꡬ성을 μ‚¬μš©ν•΄ μ—¬λŸ¬ 리전에 APIλ₯Ό λ°°ν¬ν•˜κ³ , 배포된 각 API에 λ™μΌν•œ μ‚¬μš©μž 지정 도메인 이름을 μ„€μ •ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ 지연 μ‹œκ°„μ΄ κ°€μž₯ 짧은 리전에 λΌμš°νŒ…ν•˜λ„λ‘ Route 53μ—μ„œ 지연 μ‹œκ°„ 기반 DNS λ ˆμ½”λ“œλ₯Ό ꡬ성할 μˆ˜λ„ 있음

  • λΌμš°νŒ… API Gatewayμ—μ„œ WebSocket λΌμš°νŒ…μ€ μˆ˜μ‹  λ©”μ‹œμ§€λ₯Ό λ©”μ‹œμ§€ λ‚΄μš©μ— 따라 AWS Lambda ν•¨μˆ˜ 같은 νŠΉμ • ν†΅ν•©μœΌλ‘œ μ—°κ²°ν•˜λŠ” 데 μ‚¬μš©λ¨ WebSocket APIλ₯Ό μ •μ˜ν•  λ•Œ λΌμš°νŒ… 킀와 톡합 λ°±μ—”λ“œλ₯Ό μ§€μ •ν•˜λ©°, λΌμš°νŒ… ν‚€λŠ” λ©”μ‹œμ§€ 본문의 μ†μ„±μž„ μˆ˜μ‹  λ©”μ‹œμ§€μ—μ„œ λΌμš°νŒ… ν‚€κ°€ μΌμΉ˜ν•˜λ©΄ 톡합 λ°±μ—”λ“œκ°€ 호좜됨 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” λΌμš°νŒ… 킀에 λŒ€ν•΄ κΈ°λ³Έ λΌμš°νŒ…μ„ μ„€μ •ν•˜κ±°λ‚˜, λΌμš°νŒ…μ„ μˆ˜ν–‰ν•˜κ³  μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” λ°±μ—”λ“œ ꡬ성 μš”μ†Œλ‘œ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜λŠ” ν”„λ‘μ‹œ λͺ¨λΈμ„ 지정할 μˆ˜λ„ 있음

  • λΌμš°νŒ… μš”μ²­ API Gateway에 μžˆλŠ” WebSocket API λ©”μ„œλ“œμ˜ 퍼블릭 μΈν„°νŽ˜μ΄μŠ€λ‘œ, 본문을 μ •μ˜ μ•± κ°œλ°œμžκ°€ APIλ₯Ό 톡해 λ°±μ—”λ“œμ— μ•‘μ„ΈμŠ€ν•˜λ €λ©΄ λ°˜λ“œμ‹œ 이 νŒŒλΌλ―Έν„°μ™€ 본문을 μš”μ²­μ— ν¬ν•¨μ‹œμΌœ 보내야 함

  • λΌμš°νŒ… 응닡 WebSocket API의 퍼블릭 μΈν„°νŽ˜μ΄μŠ€λ‘œ, μ•± κ°œλ°œμžκ°€ API Gateway에 κΈ°λŒ€ν•˜λŠ” λ³Έλ¬Έ λͺ¨λΈ, 헀더, μƒνƒœ μ½”λ“œλ₯Ό μ—¬κΈ°μ„œ μ •μ˜ν•˜κ²Œ 됨

  • μ‚¬μš©λŸ‰ κ³„νš μ‚¬μš©λŸ‰ κ³„νšμ€ μ„ νƒν•œ API ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ ν•˜λ‚˜ μ΄μƒμ˜ 배포된 REST λ˜λŠ” WebSocket API에 λŒ€ν•œ μ•‘μ„ΈμŠ€λ₯Ό μ œκ³΅ν•˜κ³ , μ‚¬μš©λŸ‰ κ³„νšμ„ μ‚¬μš©ν•΄ 쑰절 및 ν• λ‹ΉλŸ‰ μ œν•œμ„ ꡬ성할 수 있으며, μ΄λŠ” κ°œλ³„ ν΄λΌμ΄μ–ΈνŠΈ API 킀에 적용됨

  • WebSocket μ—°κ²° API GatewayλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ API Gateway 자체 사이에 영ꡬ적인 연결을 μœ μ§€ API Gatewayκ³Ό Lambda ν•¨μˆ˜μ™€ 같은 λ°±μ—”λ“œ 톡합 κ°„μ—λŠ” 지속적인 연결이 μ—†μœΌλ©°, λ°±μ—”λ“œ μ„œλΉ„μŠ€λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μˆ˜μ‹ ν•œ λ©”μ‹œμ§€μ˜ λ‚΄μš©μ— 따라 ν•„μš” μ‹œ 호좜됨

API Gateway μ’…λ₯˜

  1. HTTP API REST API보닀 λŒ€κΈ° μ‹œκ°„μ΄ 짧고 λΉ„μš©μ΄ μ €λ ΄ν•˜κ²Œ RESTful APIλ₯Ό ꡬ성 κ°€λŠ₯ AWS Lambda ν•¨μˆ˜ λ˜λŠ” 곡개 λΌμš°νŒ…μ΄ κ°€λŠ₯ν•œ HTTP μ—”λ“œν¬μΈνŠΈμ— μš”μ²­μ„ 전솑할 수 있음 HTTP APIλŠ” OpenID Connect 및 OAuth 2.0 κΆŒν•œ λΆ€μ—¬λ₯Ό 지원 λ˜ν•œ CORS(Cross-Origin Resource Sharing) 및 μžλ™ 배포가 기본적으둜 지원됨

  2. REST API API Gateway REST APIλŠ” λ¦¬μ†ŒμŠ€μ™€ λ©”μ„œλ“œλ‘œ ꡬ성 λ¦¬μ†ŒμŠ€λž€ 앱이 λ¦¬μ†ŒμŠ€ 경둜λ₯Ό 톡해 μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” 논리적 μ—”ν„°ν‹° λ©”μ„œλ“œλŠ” API μ‚¬μš©μžκ°€ μ œμΆœν•œ REST API μš”μ²­ 및 μ‚¬μš©μžμ—κ²Œ λ°˜ν™˜λ˜λŠ” 응닡

    앱은 λ°±μ—”λ“œμ—μ„œ μš”μ²­λœ 데이터λ₯Ό μ €μž₯ν•˜κ³  κ°€μ Έμ˜€λŠ” μœ„μΉ˜λ₯Ό μ•Œ ν•„μš”κ°€ μ—†μœΌλ©°, API Gateway REST APIμ—μ„œ ν”„λŸ°νŠΈμ—”λ“œλŠ” λ©”μ„œλ“œ μš”μ²­ 및 λ©”μ„œλ“œ μ‘λ‹΅μœΌλ‘œ μΊ‘μŠν™”λ˜κ³  APIλŠ” integration requests(톡합 μš”μ²­) 및 integration responses(톡합 응닡)을 μ΄μš©ν•΄ λ°±μ—”λ“œμ™€ ν†΅μ‹ ν•˜κ²Œ 됨

    톡합 응닡을 ν΄λΌμ΄μ–ΈνŠΈμ— λŒ€ν•œ (ν•΄λ‹Ή HTTP μƒνƒœ μ½”λ“œμ˜) μ μ ˆν•œ λ©”μ„œλ“œ μ‘λ‹΅μœΌλ‘œ λΌμš°νŒ…ν•˜λ €λ©΄, ν†΅ν•©μ—μ„œ λ©”μ„œλ“œλ‘œ ν•„μš”ν•œ 응닡 νŒŒλΌλ―Έν„°λ₯Ό λ§€ν•‘ν•˜λ„λ‘ 톡합 응닡을 κ΅¬μ„±ν•˜λ©΄ 됨 그런 λ‹€μŒ, ν•„μš”μ— 따라 λ°±μ—”λ“œμ˜ 좜λ ₯ 데이터 ν˜•μ‹μ„ ν”„λŸ°νŠΈμ—”λ“œμ˜ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ API Gatewayλ₯Ό μ‚¬μš©ν•˜λ©΄ νŽ˜μ΄λ‘œλ“œμ˜ μŠ€ν‚€λ§ˆλ‚˜ λͺ¨λΈμ„ μ •μ˜ν•˜μ—¬ λ³Έλ¬Έ 맀핑 ν…œν”Œλ¦Ώμ„ μ†μ‰½κ²Œ μ„€μ • κ°€λŠ₯

  3. WebSocket API WebSocket APIμ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„λŠ” μ–Έμ œλ“  μ„œλ‘œ λ©”μ‹œμ§€λ₯Ό 보낼 수 있음 λ°±μ—”λ“œ μ„œλ²„λŠ” λ³΅μž‘ν•œ 폴링 λ©”μ»€λ‹ˆμ¦˜μ„ κ΅¬ν˜„ν•  ν•„μš” 없이 μ—°κ²°λœ μ‚¬μš©μž 및 μž₯치둜 데이터λ₯Ό μ‰½κ²Œ ν‘Έμ‹œν•  수 있음

    API Gateway WebSocket APIλ₯Ό μ‚¬μš©ν•˜λ©΄ μ—°κ²°μ΄λ‚˜ λŒ€μš©λŸ‰ 데이터 κ΅ν™˜μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μ„œλ²„λ₯Ό ν”„λ‘œλΉ„μ €λ‹ν•˜κ±°λ‚˜ κ΄€λ¦¬ν•˜μ§€ μ•Šκ³ λ„ μ•ˆμ „ν•œ μ‹€μ‹œκ°„ 톡신 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ꡬ좕할 수 있음

    • μ±„νŒ… μ• ν”Œλ¦¬μΌ€μ΄μ…˜

    • 주식 μ‹œμ„Έ ν‘œμ‹œκΈ°μ™€ 같은 μ‹€μ‹œκ°„ λŒ€μ‹œ λ³΄λ“œ

    • μ‹€μ‹œκ°„ κ²½κ³  및 μ•Œλ¦Ό

HTTP API와 REST API 비ꡐ

HTTP APIλŠ” λŒ€κΈ° μ‹œκ°„μ΄ 짧고 λΉ„μš© 효과적인 AWS Lambda ν”„λ‘μ‹œ 및 HTTP ν”„λ‘μ‹œ APIλ₯Ό μœ„ν•΄ 섀계됨 HTTP APIλŠ” OIDC 및 OAuth 2.0 인증을 μ§€μ›ν•˜λ©° CORS 및 μžλ™ 배포에 λŒ€ν•œ κΈ°λ³Έ 지원을 μ œκ³΅ν•˜κ³ , 이전 μ„ΈλŒ€ REST APIλŠ” ν˜„μž¬ 더 λ§Žμ€ κΈ°λŠ₯을 μ œκ³΅ν•˜λ©° API μš”μ²­ 및 응닡을 μ™„μ „νžˆ μ œμ–΄κ°€ κ°€λŠ₯

κΆŒν•œ λΆ€μ—¬μž

HTTP API

REST API

AWS Lambda

βœ”

IAM

βœ”

Amazon Cognito

βœ”*

βœ”

OpenID Connect/OAuth 2.0

βœ”

* Amazon Cognitoλ₯Ό JWT λ°œκΈ‰μžλ‘œ μ‚¬μš©

Integration

HTTP API

REST API

HTTP ν”„λ‘μ‹œ

βœ”

βœ”

Lambda ν”„λ‘μ‹œ

βœ”

βœ”

HTTP

βœ”

AWS μ„œλΉ„μŠ€

βœ”

βœ”

프라이빗 톡합

βœ”

βœ”

λͺ¨μ˜

βœ”

API 관리

HTTP API

REST API

μ‚¬μš©λŸ‰ κ³„νš

βœ”

API ν‚€

βœ”

μ‚¬μš©μž 지정 도메인 이름

βœ”*

βœ”

* HTTP API TLS 1.0 지원 μ•ˆλ¨

개발

HTTP API

REST API

Cache

βœ”

λ³€ν™˜ μš”μ²­

βœ”

μš”μ²­/응닡 검증

βœ”

호좜 ν…ŒμŠ€νŠΈ

βœ”

CORS ꡬ성

βœ”

μžλ™ 배포

βœ”

κΈ°λ³Έ 단계

βœ”

기본 경둜

βœ”

Security

HTTP API

REST API

ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œ

βœ”

AWS WAF

βœ”

λ¦¬μ†ŒμŠ€ μ •μ±…

βœ”

API μœ ν˜•

HTTP API

REST API

리전

βœ”

βœ”

엣지 μ΅œμ ν™”

βœ”

프라이빗

βœ”

Monitoring

HTTP API

REST API

Amazon CloudWatch Logs에 λŒ€ν•œ μ•‘μ„ΈμŠ€ 둜그

βœ”

βœ”

Amazon Kinesis Data Firehose에 λŒ€ν•œ μ•‘μ„ΈμŠ€ 둜그

βœ”

μ‹€ν–‰ 둜그

βœ”

Amazon CloudWatch μ§€ν‘œ

βœ”

βœ”

AWS X-Ray

βœ”

HTTP API

개발

생성

ν•¨μˆ˜ APIλ₯Ό μƒμ„±ν•˜λ €λ©΄ μ΅œμ†Œ ν•˜λ‚˜ μ΄μƒμ˜ λΌμš°νŒ…, 톡합, μŠ€ν…Œμ΄μ§€ 및 배포가 μžˆμ–΄μ•Ό 함

λΌμš°νŒ…

μˆ˜μ‹  API μš”μ²­μ„ λ°±μ—”λ“œ λ¦¬μ†ŒμŠ€λ‘œ 직접 λΌμš°νŒ… κ²½λ‘œλŠ” HTTP λ©”μ„œλ“œμ™€ λ¦¬μ†ŒμŠ€ 경둜(예: GET /pets)λΌλŠ” 두 λΆ€λΆ„μœΌλ‘œ ꡬ성 λΌμš°νŒ…μ— λŒ€ν•œ νŠΉμ • HTTP λ©”μ„œλ“œλ₯Ό μ •μ˜ν•  수 μžˆμœΌλ‚˜, ANY λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄ μ •μ˜ν•˜μ§€ μ•Šμ€ λͺ¨λ“  λ©”μ„œλ“œμ™€ μΌμΉ˜μ‹œν‚¬ μˆ˜λ„ 있음 λ‹€λ₯Έ κ²½λ‘œμ™€ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μš”μ²­μ— λŒ€ν•΄ catch-all 역할을 ν•˜λŠ” $default 경둜λ₯Ό 생성할 수 있음

  • 경둜 λ³€μˆ˜ μž‘μ—… HTTP API λΌμš°νŒ…μ—μ„œ 경둜 λ³€μˆ˜λ₯Ό μ‚¬μš©

    예) GET /pets/{petID} λΌμš°νŒ…μ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ https://api-id.execute-api.us-east-2.amazonaws.com/pets/6에 μ œμΆœν•˜λŠ” GET μš”μ²­μ„ 포착

    λ³΅μž‘ν•œ 경둜 λ³€μˆ˜λŠ” λΌμš°νŒ…μ˜ λͺ¨λ“  ν•˜μœ„ λ¦¬μ†ŒμŠ€λ₯Ό ν¬μ°©ν•˜κ²Œ 됨 λ³΅μž‘ν•œ 경둜 λ³€μˆ˜λ₯Ό μƒμ„±ν•˜λ €λ©΄ λ³€μˆ˜ 이름에 +을 μΆ”κ°€ (예: {proxy+}) λ³΅μž‘ν•œ 경둜 λ³€μˆ˜λŠ” λ¦¬μ†ŒμŠ€ 경둜의 끝에 μžˆμ–΄μ•Όν•¨

  • 쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„° μž‘μ—… HTTP API에 λŒ€ν•œ μš”μ²­μ— ν¬ν•¨λœ 경우 API Gatewayμ—μ„œλŠ” 기본적으둜 쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„°λ₯Ό λ°±μ—”λ“œ ν†΅ν•©μœΌλ‘œ 보냄

    예) ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­μ„ https://api-id.execute-api.us-east-2.amazonaws.com/pets?id=4&type=dog에 λ³΄λ‚΄λŠ” 경우 쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„° ?id=4&type=dogκ°€ 톡합에 μ „μ†‘λ˜κ²Œ 됨

  • $default λΌμš°νŒ… μž‘μ—… $default λΌμš°νŒ…μ€ API의 λ‹€λ₯Έ λΌμš°νŒ…κ³Ό λͺ…μ‹œμ μœΌλ‘œ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” μš”μ²­μ„ 포착

    $default λΌμš°νŒ…μ΄ μš”μ²­μ„ λ°›λŠ” 경우 API Gatewayμ—μ„œ 전체 μš”μ²­ 경둜λ₯Ό 톡합에 보냄 예) $default λΌμš°νŒ…λ§Œ μžˆλŠ” APIλ₯Ό μƒμ„±ν•˜μ—¬ https://petstore-demo-endpoint.execute-api.com HTTP μ—”λ“œν¬μΈνŠΈκ°€ μžˆλŠ” ANY λ©”μ„œλ“œμ— 톡합할 수 있음 μš”μ²­μ„ https://api-id.execute-api.us-east-2.amazonaws.com/store/checkout에 λ³΄λ‚΄λŠ” 경우 API Gatewayμ—μ„œ μš”μ²­μ„ https://petstore-demo-endpoint.execute-api.com/store/checkout에 보냄

  • API μš”μ²­ λΌμš°νŒ… ν΄λΌμ΄μ–ΈνŠΈκ°€ API μš”μ²­μ„ λ³΄λ‚΄λŠ” 경우 API Gatewayμ—μ„œ λ¨Όμ € μš”μ²­μ„ λΌμš°νŒ…ν•  단계λ₯Ό κ²°μ •ν•˜κ²Œ 됨 μš”μ²­μ΄ 단계와 λͺ…μ‹œμ μœΌλ‘œ μΌμΉ˜ν•˜λŠ” 경우 API GatewayλŠ” μš”μ²­μ„ ν•΄λ‹Ή λ‹¨κ³„λ‘œ λ³΄λ‚΄κ²Œ 되며, μš”μ²­κ³Ό μ™„μ „νžˆ μΌμΉ˜ν•˜λŠ” 단계가 μ—†λŠ” 경우 API GatewayλŠ” μš”μ²­μ„ $default λ‹¨κ³„λ‘œ λ³΄λ‚΄κ²Œ 됨 λ§Œμ•½ $default 단계가 μ—†μœΌλ©΄ APIκ°€ {"message":"Not Found"}λ₯Ό λ°˜ν™˜ν•˜κ²Œ 됨

    API Gateway λΌμš°νŒ… μš°μ„  μˆœμœ„ 1. λΌμš°νŒ… 및 λ©”μ„œλ“œμ— μ™„μ „νžˆ 일치 2. λ³΅μž‘ν•œ 경둜 λ³€μˆ˜({proxy+})κ°€ μžˆλŠ” λΌμš°νŒ… 및 λ©”μ„œλ“œμ— 일치 3. $default λΌμš°νŒ…

    λΌμš°νŒ… 예제 1. GET /pets/dog/{id} 2. GET /pets/{proxy+} 3. ANY /{proxy+} 4. $default

    μš”μ²­

    μ„ νƒν•œ λΌμš°νŒ…

    μ„€λͺ…

    GET /pets/dog/{id}

    μ™„μ „νžˆ 일치

    GET /pets/{proxy+}

    μš”μ²­μ΄ λΌμš°νŒ…κ³Ό μ™„μ „νžˆ μΌμΉ˜ν•˜μ§€ μ•ŠμœΌλ‚˜, GET λ©”μ„œλ“œμ™€ λ³΅μž‘ν•œ 경둜 λ³€μˆ˜κ°€ μžˆλŠ” λΌμš°νŒ… 포착

    ANY /{proxy+}

    ANY λ©”μ„œλ“œλŠ” λΌμš°νŒ…μ— λŒ€ν•΄ μ •μ˜ν•˜μ§€ μ•Šμ€ λͺ¨λ“  λ©”μ„œλ“œμ™€ μΌμΉ˜ν•¨. λ³΅μž‘ν•œ 경둜 λ³€μˆ˜κ°€ μžˆλŠ” λΌμš°νŒ…μ€ $default λΌμš°νŒ…λ³΄λ‹€ μš°μ„  μˆœμœ„κ°€ λ†’κ²Œ 됨

μ•‘μ„ΈμŠ€ μ œμ–΄

JWT(JSON Web Token)λ₯Ό OIDC(OpenID Connect) 및 OAuth 2.0 ν”„λ ˆμž„μ›Œν¬μ˜ μΌλΆ€λ‘œ μ‚¬μš©ν•˜μ—¬ API에 λŒ€ν•œ ν΄λΌμ΄μ–ΈνŠΈ μ•‘μ„ΈμŠ€λ₯Ό μ œν•œ API의 κ²½λ‘œμ— λŒ€ν•΄ JWT κΆŒν•œ λΆ€μ—¬μžλ₯Ό κ΅¬μ„±ν•˜λ©΄ API GatewayλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ API μš”μ²­κ³Ό ν•¨κ»˜ μ œμΆœν•˜λŠ” JWTλ₯Ό 검증

API μš”μ²­ κΆŒν•œ λΆ€μ—¬

API GatewayλŠ” λ‹€μŒκ³Ό 같은 일반 μ›Œν¬ν”Œλ‘œμš°

  1. 토큰에 λŒ€ν•œ identitySourceλ₯Ό 확인 identitySourceμ—λŠ” ν† ν°λ§Œ ν¬ν•¨ν•˜κ±°λ‚˜ Bearer 접두사가 뢙은 ν† ν°λ§Œ ν¬ν•¨λ μˆ˜ 있음

  2. 토큰 λ””μ½”λ”©

  3. λ°œν–‰μžμ˜ jwks_uriμ—μ„œ κ°€μ Έμ˜¨ 퍼블릭 ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ ν† ν°μ˜ μ•Œκ³ λ¦¬μ¦˜κ³Ό μ„œλͺ…을 확인 ν˜„μž¬ RSA 기반 μ•Œκ³ λ¦¬μ¦˜λ§Œ 지원

  4. ν΄λ ˆμž„μ„ 검증 API GatewayλŠ” λ‹€μŒκ³Ό 같은 토큰 ν΄λ ˆμž„μ„ 평가

    • kid – ν† ν°μ—λŠ” 토큰에 μ„œλͺ…ν•œ jwks_uri의 킀와 μΌμΉ˜ν•˜λŠ” 헀더 ν΄λ ˆμž„ 유무

    • iss – κΆŒν•œ λΆ€μ—¬μžμ— λŒ€ν•΄ κ΅¬μ„±λœ issuer와 일치

    • aud λ˜λŠ” client_id – κΆŒν•œ λΆ€μ—¬μžμ— λŒ€ν•΄ κ΅¬μ„±λœ audience ν•­λͺ© 쀑 ν•˜λ‚˜μ™€ 일치

    • exp – ν˜„μž¬ μ‹œκ°„(UTC κΈ°μ€€) 이후 μ—¬λΆ€

    • nbf – ν˜„μž¬ μ‹œκ°„(UTC κΈ°μ€€) 이전 μ—¬λΆ€

    • iat – ν˜„μž¬ μ‹œκ°„(UTC κΈ°μ€€) 이전 μ—¬λΆ€

    • scope λ˜λŠ” scp – 토큰에 λΌμš°νŒ…μ˜ authorizationScopes λ²”μœ„ 쀑 ν•˜λ‚˜ 이상이 포함 μ—¬λΆ€

μ΄λŸ¬ν•œ 단계 쀑 ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ API GatewayλŠ” API μš”μ²­μ„ κ±°λΆ€ JWTλ₯Ό κ²€μ¦ν•œ ν›„ API GatewayλŠ” ν† ν°μ˜ ν΄λ ˆμž„μ„ API 경둜의 톡합에 전달 Lambda ν•¨μˆ˜μ™€ 같은 λ°±μ—”λ“œ λ¦¬μ†ŒμŠ€λŠ” $context.authorizer.claims의 JWT ν΄λ ˆμž„μ— μ•‘μ„ΈμŠ€ κ°€λŠ₯

톡합(Integration)

톡합 λ°±μ—”λ“œ λ¦¬μ†ŒμŠ€μ— 라우트λ₯Ό μ—°κ²° HTTP APIs, Lambda ν”„λ‘μ‹œ, AWS μ„œλΉ„μŠ€ 및 HTTP ν”„λ‘μ‹œ 톡합 지원

  1. HTTP API λΌμš°νŒ…μ„ 곡개적으둜 λΌμš°νŒ…ν•  수 μžˆλŠ” HTTP μ—”λ“œν¬μΈνŠΈμ— μ—°κ²°ν•  수 있음 API Gateway이 ν”„λŸ°νŠΈ μ—”λ“œμ™€ λ°±μ—”λ“œ 사이에 전체 μš”μ²­ 및 응닡을 전달

    경둜 λ³€μˆ˜μ™€μ˜ HTTP ν”„λ‘μ‹œ 톡합 HTTP API λΌμš°νŒ…μ—μ„œ 경둜 λ³€μˆ˜λ₯Ό μ‚¬μš© 예) λΌμš°νŒ… /pets/{petID}은 /pets/6에 λŒ€ν•œ μš”μ²­μ„ 포착

  2. Lambda ν΄λΌμ΄μ–ΈνŠΈκ°€ APIλ₯Ό ν˜ΈμΆœν•˜λ©΄ API GatewayλŠ” Lambda ν•¨μˆ˜μ— μš”μ²­μ„ μ „μ†‘ν•˜κ³  ν•¨μˆ˜μ˜ 응닡을 ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜

    • νŽ˜μ΄λ‘œλ“œ ν˜•μ‹ 버전 API Gatewayμ—μ„œ Lambda ν†΅ν•©μœΌλ‘œ μ „μ†‘ν•˜λŠ” λ°μ΄ν„°μ˜ ν˜•μ‹κ³Ό API Gateway이 Lambdaμ—μ„œ 응닡을 ν•΄μ„ν•˜λŠ” 방법을 지정

      Version 2.0 (Default)

        {
            "version": "2.0",
            "routeKey": "$default",
            "rawPath": "/my/path",
            "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
            "cookies": [
                "cookie1",
                "cookie2"
            ],
            "headers": {
                "Header1": "value1",
                "Header2": "value1,value2"
            },
            "queryStringParameters": {
                "parameter1": "value1,value2",
                "parameter2": "value"
            },
            "requestContext": {
                "accountId": "123456789012",
                "apiId": "api-id",
                "authorizer": {
                    "jwt": {
                        "claims": {
                            "claim1": "value1",
                            "claim2": "value2"
                        },
                        "scopes": [
                            "scope1",
                            "scope2"
                        ]
                    }
                },
                "domainName": "id.execute-api.us-east-1.amazonaws.com",
                "domainPrefix": "id",
                "http": {
                    "method": "POST",
                    "path": "/my/path",
                    "protocol": "HTTP/1.1",
                    "sourceIp": "IP",
                    "userAgent": "agent"
                },
                "requestId": "id",
                "routeKey": "$default",
                "stage": "$default",
                "time": "12/Mar/2020:19:03:58 +0000",
                "timeEpoch": 1583348638390
            },
            "body": "Hello from Lambda",
            "pathParameters": {
                "parameter1": "value1"
            },
            "isBase64Encoded": false,
            "stageVariables": {
                "stageVariable1": "value1",
                "stageVariable2": "value2"
            }
        }

      Version 1.0

        {
            "version": "1.0",
            "resource": "/my/path",
            "path": "/my/path",
            "httpMethod": "GET",
            "headers": {
                "Header1": "value1",
                "Header2": "value2"
            },
            "multiValueHeaders": {
                "Header1": [
                    "value1"
                ],
                "Header2": [
                    "value1",
                    "value2"
                ]
            },
            "queryStringParameters": {
                "parameter1": "value1",
                "parameter2": "value"
            },
            "multiValueQueryStringParameters": {
                "parameter1": [
                    "value1",
                    "value2"
                ],
                "parameter2": [
                    "value"
                ]
            },
            "requestContext": {
                "accountId": "123456789012",
                "apiId": "id",
                "authorizer": {
                    "claims": null,
                    "scopes": null
                },
            "domainName": "id.execute-api.us-east-1.amazonaws.com",
            "domainPrefix": "id",
            "extendedRequestId": "request-id",
            "httpMethod": "GET",
                "identity": {
                    "accessKey": null,
                    "accountId": null,
                    "caller": null,
                    "cognitoAuthenticationProvider": null,
                    "cognitoAuthenticationType": null,
                    "cognitoIdentityId": null,
                    "cognitoIdentityPoolId": null,
                    "principalOrgId": null,
                    "sourceIp": "IP",
                    "user": null,
                    "userAgent": "user-agent",
                    "userArn": null
                },
                "path": "/my/path",
                "protocol": "HTTP/1.1",
                "requestId": "id=",
                "requestTime": "04/Mar/2020:19:15:17 +0000",
                "requestTimeEpoch": 1583349317135,
                "resourceId": null,
                "resourcePath": "/my/path",
                "stage": "$default"
            },
            "pathParameters": null,
            "stageVariables": null,
            "body": "Hello from Lambda!",
            "isBase64Encoded": true
        }
    • Lambda ν•¨μˆ˜ 응닡 ν˜•μ‹ νŽ˜μ΄λ‘œλ“œ ν˜•μ‹ 버전에 따라 Lambda ν•¨μˆ˜κ°€ λ°˜ν™˜ν•΄μ•Ό ν•˜λŠ” 응닡 ꡬ쑰λ₯Ό κ²°μ •ν•˜κ²Œ 됨

      Version 1.0

        {
            "isBase64Encoded": true|false,
            "statusCode": httpStatusCode,
            "headers": { "headerName": "headerValue", ... },
            "multiValueHeaders": { 
                "headerName": ["headerValue", "headerValue2", ...], ... 
            },
            "body": "..."
        }

      Version 2.0 API Gateway은 Lambda ν•¨μˆ˜κ°€ μœ νš¨ν•œ JSON을 λ°˜ν™˜ν•˜κ³  statusCodeλ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄ λ‹€μŒκ³Ό 같이 κ°€μ •ν•˜κ²Œ 됨

      • isBase64Encoded = false

      • statusCode = 200

      • content-type = application/json

      • body은 ν•¨μˆ˜μ˜ 응닡

        {
          "cookies" : ["cookie1", "cookie2"],
          "isBase64Encoded": true|false,
          "statusCode": httpStatusCode,
          "headers": { "headerName": "headerValue", ... },
          "body": "Hello from Lambda!"
        }
  3. AWS μ„œλΉ„μŠ€ ν΄λΌμ΄μ–ΈνŠΈκ°€ 일λ₯˜ 톡합(first-class intergration)으둜 λ’·λ°›μΉ¨λ˜λŠ” 경둜λ₯Ό ν˜ΈμΆœν•˜λŠ” 경우, API Gateway ν˜ΈμΆœμ„ AWS μ„œλΉ„μŠ€ APIλ₯Ό 제곡

    맀핑 μš”μ²­ 맀개 λ³€μˆ˜

    μœ ν˜•

    예

    μ°Έκ³ 

    헀더 κ°’

    $request.header.name

    헀더 이름은 λŒ€/μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠμŒ. API Gateway 예λ₯Ό λ“€μ–΄ μ—¬λŸ¬ 헀더 값을 μ‰Όν‘œλ‘œ κ²°ν•©. "header1": "value1,value2".

    쿼리 λ¬Έμžμ—΄ κ°’

    $request.querystring.name

    쿼리 λ¬Έμžμ—΄ 이름은 λŒ€/μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€. API Gateway 예λ₯Ό λ“€μ–΄ μ—¬λŸ¬ 값을 μ‰Όν‘œλ‘œ κ²°ν•© "querystring1": "Value1,Value2"

    경둜 λ§€κ°œλ³€μˆ˜

    $request.path.name

    μš”μ²­ μ—μ„œ 경둜 맀개 λ³€μˆ˜μ˜ κ°’. 예) κ²½λ‘œκ°€ /pets/{petId}을(λ₯Ό) 맀핑가λŠ₯. petId μš”μ²­μ˜ 맀개 λ³€μˆ˜ $request.path.petId.

    λ°”λ”” 패슀 μš”μ²­

    $request.body

    API Gateway λ₯Ό 톡해 전체 μš”μ²­ 본체λ₯Ό 전달

    μš”μ²­ λ³Έλ¬Έ

    $request.body.name

    A JSON 경둜 ν‘œν˜„. μž¬λ°œμ„± ν•˜κ°•($request.body..name) 및 ν•„ν„° ν‘œν˜„μ‹(?(expression))을(λ₯Ό) μ§€μ›ν•˜μ§€ μ•ŠμŒ

    μ»¨ν…μŠ€γ…‘νŠΈ λ³€μˆ˜

    contextvariableName

    μ§€μ›λ˜λŠ” μ»¨ν…μŠ€νŠΈ λ³€μˆ˜

    단계 λ³€μˆ˜

    $stagevariables.variableName

    단계 λ³€μˆ˜

    정적 κ°’

    string

    μΌμ •ν•œ κ°’.

톡합 ν•˜μœ„ μœ ν˜• μ°Έμ‘°
* EventBridge-PutEvents
* SQS-SendMessage
* SQS-ReceiveMessage
* SQS-DeleteMessage
* SQS-PurgeQueue
* AppConfig-GetConfiguration
* Kinesis-PutRecord
* StepFunctions-StartExecution
* StepFunctions-StopExecution  

각 μ„œλΉ„μŠ€ API별 ν•„μš”ν•œ νŒŒλΌλ―Έν„° 값이 λ‹€λ₯΄λ―€λ‘œ μžμ„Έν•œ 사항은 λ‹€μŒ 경둜 μ°Έκ³   
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services-reference.html
  1. 프라이빗 프라이빗 톡합을 μ‚¬μš©ν•˜λ©΄ VPC의 프라이빗 λ¦¬μ†ŒμŠ€(예: Application Load Balancer λ˜λŠ” Amazon ECS μ»¨ν…Œμ΄λ„ˆ 기반 μ• ν”Œλ¦¬μΌ€μ΄μ…˜)μ™€μ˜ API 톡합을 생성 κ°€λŠ₯ 프라이빗 톡합을 μƒμ„±ν•˜λ €λ©΄ λ¨Όμ € VPC 링크가 ν•„μš”ν•¨ 기본적으둜 프라이빗 톡합 νŠΈλž˜ν”½μ€ HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λ©°, tlsConfigλ₯Ό μ§€μ •ν•˜μ—¬ HTTPSλ₯Ό μ‚¬μš©ν• μˆ˜ 있음

    1. Application Load Balancer λ˜λŠ” Network Load Balancerλ₯Ό μ‚¬μš©

    2. AWS Cloud Map μ„œλΉ„μŠ€ 검색을 μ‚¬μš© Amazon ECSλ₯Ό μ‚¬μš©ν•˜μ—¬ AWS Cloud Mapμ—μ„œ ν•­λͺ©μ„ μ±„μš°λŠ” 경우, SRV λ ˆμ½”λ“œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ Amazon ECS μž‘μ—…μ„ ꡬ성해야 ν•˜λ©°, β€œA” λ ˆμ½”λ“œλŠ” μ§€μ›λ˜μ§€ μ•ŠμŒ

CORS(Cross-Origin Resource Sharing)

λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰ 쀑인 μŠ€ν¬λ¦½νŠΈμ—μ„œ μ‹œμž‘λ˜λŠ” HTTP μš”μ²­μ„ μ œν•œν•˜λŠ” λΈŒλΌμš°μ € λ³΄μ•ˆ κΈ°λŠ₯ CORSλŠ” 일반적으둜 λ‹€λ₯Έ λ„λ©”μΈμ΄λ‚˜ μ˜€λ¦¬μ§„μ— ν˜ΈμŠ€νŒ…λœ API에 μ•‘μ„ΈμŠ€ν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λΉŒλ“œν•˜λŠ” 데 ν•„μš” CORSλ₯Ό ν™œμ„±ν™”ν•˜μ—¬ λ‹€λ₯Έ 도메인에 ν˜ΈμŠ€νŒ…λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ API에 λŒ€ν•œ μš”μ²­μ„ ν—ˆμš©ν•  수 있음 예) APIκ°€ https://{api_id}.execute-api.{region}.amazonaws.com/에 ν˜ΈμŠ€νŒ…λ˜κ³  example.com에 ν˜ΈμŠ€νŒ…λœ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ APIλ₯Ό ν˜ΈμΆœν•˜λ €λŠ” 경우 APIκ°€ CORSλ₯Ό 지원해야 함

CORS μš”μ²­μ˜ 경우 API GatewayλŠ” κ΅¬μ„±λœ CORS 헀더λ₯Ό ν†΅ν•©μ˜ 응닡에 μΆ”κ°€ν•˜κ²Œ 되며, CORS κ΅¬μ„±μ—μ„œ λ‹€μŒκ³Ό 같은 맀개 λ³€μˆ˜λ₯Ό 지정할 수 있음

CORS 헀더

CORS ꡬ성 속성

예제 κ°’

Access-Control-Allow-Origin

allowOrigins

https://www.example.com *( λͺ¨λ“  μ˜€λ¦¬μ§„ ν—ˆμš©) https://*( https://둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  μ˜€λ¦¬μ§„ ν—ˆμš©) http://*( http://둜 μ‹œμž‘ν•˜λŠ” λͺ¨λ“  μ˜€λ¦¬μ§„ ν—ˆμš©)

Access-Control-Allow-Credentials

allowCredentials

TRUE

Access-Control-Expose-Headers

exposeHeaders

Date, x-api-id

Access-Control-Max-Age

maxAge

300

Access-Control-Allow-Methods

allowMethods

GET, POST, DELETE, *

Access-Control-Allow-Headers

allowHeaders

Authorization, *

Publish

μŠ€ν…Œμ΄μ§€ 및 μ‚¬μš©μž 지정 도메인 이름을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ ν˜ΈμΆœν•  수 μžˆλ„λ‘ APIλ₯Ό κ²Œμ‹œν•˜κ²Œ 됨

Stages

API λ‹¨κ³„λŠ” API의 수λͺ… μ£ΌκΈ° μƒνƒœμ— λŒ€ν•œ 논리적 μ°Έμ‘°μž„ (예: dev, prod, beta, v2)

μ‚¬μš©μž 지정 도메인 이름을 μ‚¬μš©ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈκ°€ APIλ₯Ό ν˜ΈμΆœν•  수 μžˆλ„λ‘ κΈ°λ³Έ URL인 https://api-id.execute-api.region.amazonaws.com/stage 보닀 더 κ°„λ‹¨ν•˜κ³  직관적인 URL을 μ‚¬μš©ν• μˆ˜ 있음

λ°°ν¬λŠ” API κ΅¬μ„±μ˜ μŠ€λƒ…μƒ·μœΌλ‘œ 단계에 APIλ₯Ό λ°°ν¬ν•œ ν›„μ—λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ APIλ₯Ό ν˜ΈμΆœν•  수 있음

λ³€κ²½ 사항을 μ μš©ν•˜λ €λ©΄ APIλ₯Ό 배포해야 ν•˜κ³ , μžλ™ 배포λ₯Ό ν™œμ„±ν™”ν•˜λ©΄ API에 λŒ€ν•œ λ³€κ²½ 사항이 μžλ™μœΌλ‘œ 릴리슀되게 됨

단계 λ³€μˆ˜

단계 λ³€μˆ˜λŠ” HTTP API의 단계에 λŒ€ν•΄ μ •μ˜ν•  수 μžˆλŠ” ν‚€-κ°’ νŽ˜μ–΄ ν™˜κ²½ λ³€μˆ˜μ™€ λΉ„μŠ·ν•œ 역할을 ν•˜λ©°, API 섀정에 μ‚¬μš©ν•˜κ²Œ 됨

Protect

λ„ˆλ¬΄ λ§Žμ€ μš”μ²­μœΌλ‘œ 인해 APIκ°€ 가득 μ°¨λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ Amazon API Gatewayμ—μ„œλŠ” 토큰 버킷 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ API에 λŒ€ν•œ μš”μ²­μ„ 쑰절 API Gatewayμ—μ„œ ν•œλ„ 초과 μš”μ²­μ„ μ‹€νŒ¨ν•˜κ³  429 Too Many Requests 였λ₯˜ 응닡을 ν΄λΌμ΄μ–ΈνŠΈμ— λ°˜ν™˜ν•˜κ²Œ 됨

계정 μˆ˜μ€€ 쑰절

기본적으둜 API Gatewayμ—μ„œλŠ” μ•ˆμ •μ μΈ μƒνƒœμ˜ μš”μ²­ 속도λ₯Ό 10,000rps(μ΄ˆλ‹Ή μš”μ²­ 수)둜 μ œν•œ, AWS 계정 λ‚΄ λͺ¨λ“  API에 λŒ€ν•΄ λ²„μŠ€νŠΈ(즉, μ΅œλŒ€ 버킷 크기)λ₯Ό 5,000 μš”μ²­μœΌλ‘œ μ œν•œ

λΌμš°νŒ… μˆ˜μ€€ 쑰절

API의 νŠΉμ • 단계 λ˜λŠ” κ°œλ³„ λΌμš°νŒ…μ— λŒ€ν•΄ 계정 μˆ˜μ€€ μš”μ²­ μŠ€λ‘œν‹€ ν•œλ„λ₯Ό μž¬μ •μ˜ 계정 μˆ˜μ€€ μ‘°μ ˆμ„ λ„˜μ–΄κ°ˆμˆ˜λŠ” μ—†μŒ

REST API

To Be Continued

Websocket API

To Be Continued

Last updated