🌐 μžμŠ΅μ„œ: Lambda ν”„λ‘μ‹œ 톡합을 톡해 REST API 생성 - Amazon API GatewayμžμŠ΅μ„œ: Lambda ν”„λ‘μ‹œ 톡합을 톡해 REST API 생성 - Amazon API Gateway - docs.aws.amazon.com

μžμŠ΅μ„œ: Lambda ν”„λ‘μ‹œ 톡합을 톡해 REST API 생성

Lambda ν”„λ‘μ‹œ 톡합은 API λ©”μ„œλ“œλ‚˜ 전체 APIλ₯Ό Lambda ν•¨μˆ˜μ™€ 톡합할 수 μžˆλŠ” μœ μ—°ν•˜κ³  κ°„λ‹¨ν•œ API Gateway API 톡합 μœ ν˜•μž…λ‹ˆλ‹€. Lambda ν•¨μˆ˜λŠ” Lambdaκ°€ μ§€μ›ν•˜λŠ” μ–΄λ–€ μ–Έμ–΄λ‘œλ„ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이것은 ν”„λ‘μ‹œ 톡합이기 λ•Œλ¬Έμ— APIλ₯Ό λ‹€μ‹œ 배포할 ν•„μš” μ—†μ–΄ μ–Έμ œλ“ μ§€ Lambda ν•¨μˆ˜ κ΅¬ν˜„μ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이 μžμŠ΅μ„œμ—μ„œλŠ” λ‹€μŒ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • "Hello, World!" λ§Œλ“€κΈ° API의 λ°±μ—”λ“œκ°€ 될 Lambda ν•¨μˆ˜λ₯Ό λ§Œλ“­λ‹ˆλ‹€.

  • "Hello, World!" λ§Œλ“€κΈ° 및 ν…ŒμŠ€νŠΈ Lambda ν”„λ‘μ‹œ 톡합을 μ‚¬μš©ν•˜μ—¬ APIλ₯Ό λ§Œλ“€κ³  ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.

"Hello, World!" λ§Œλ“€κΈ° Lambda ν•¨μˆ˜

β€œHello, World!”λ₯Ό μƒμ„±ν•˜λ €λ©΄ Lambda μ½˜μ†”μ˜ Lambda ν•¨μˆ˜
  1. https://console.aws.amazon.com/lambdaμ—μ„œ Lambda μ½˜μ†”μ— λ‘œκ·ΈμΈν•©λ‹ˆλ‹€.

  2. AWS 탐색 λͺ¨μŒμ—μ„œ AWS 리전을 μ„ νƒν•©λ‹ˆλ‹€.

    μ°Έκ³ 

    Lambda ν•¨μˆ˜λ₯Ό μƒμ„±ν•œ 리전을 적어 λ‘‘λ‹ˆλ‹€. 이 리전은 APIλ₯Ό 생성할 λ•Œ ν•„μš”ν•©λ‹ˆλ‹€.

  3. 탐색 μ°½μ—μ„œ ν•¨μˆ˜λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  4. ν•¨μˆ˜ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

  5. μƒˆλ‘œ μž‘μ„±μ„ μ„ νƒν•©λ‹ˆλ‹€.

  6. κΈ°λ³Έ μ •λ³΄μ—μ„œ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.

    1. ν•¨μˆ˜ 이름에 GetStartedLambdaProxyIntegration을 μž…λ ₯ν•©λ‹ˆλ‹€.

    2. λŸ°νƒ€μž„μ—μ„œ μ§€μ›λ˜λŠ” μ΅œμ‹  Node.js λ˜λŠ” Python λŸ°νƒ€μž„μ„ μ„ νƒν•©λ‹ˆλ‹€.

    3. μ•„ν‚€ν…μ²˜μ˜ 경우 κΈ°λ³Έ 섀정을 μœ μ§€ν•©λ‹ˆλ‹€.

    4. κΆŒν•œ(Permissions)μ—μ„œ κΈ°λ³Έ μ‹€ν–‰ μ—­ν•  λ³€κ²½(Change default execution role)을 ν™•μž₯ν•©λ‹ˆλ‹€. μ‹€ν–‰ μ—­ν•  λ“œλ‘­λ‹€μš΄ λͺ©λ‘μ—μ„œ AWS μ •μ±… ν…œν”Œλ¦Ώμ—μ„œ μƒˆ μ—­ν•  생성을 μ„ νƒν•©λ‹ˆλ‹€.

    5. μ—­ν•  이름에 GetStartedLambdaBasicExecutionRole을 μž…λ ₯ν•©λ‹ˆλ‹€.

    6. [Policy templates] ν•„λ“œλ₯Ό λΉ„μ›Œλ‘‘λ‹ˆλ‹€.

    7. ν•¨μˆ˜ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

  7. λ‹€μŒ μ½”λ“œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ 인라인 μ½”λ“œ νŽΈμ§‘κΈ°μ˜ ν•¨μˆ˜ μ½”λ“œμ— λΆ™μ—¬ λ„£μŠ΅λ‹ˆλ‹€.

    Node.js
    export const handler = async(event, context) => { console.log('Received event:', JSON.stringify(event, null, 2)); var res ={ "statusCode": 200, "headers": { "Content-Type": "*/*" } }; var greeter = 'World'; if (event.greeter && event.greeter!=="") { greeter = event.greeter; } else if (event.body && event.body !== "") { var body = JSON.parse(event.body); if (body.greeter && body.greeter !== "") { greeter = body.greeter; } } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") { greeter = event.queryStringParameters.greeter; } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") { greeter = event.multiValueHeaders.greeter.join(" and "); } else if (event.headers && event.headers.greeter && event.headers.greeter != "") { greeter = event.headers.greeter; } res.body = "Hello, " + greeter + "!"; return res };
    Python
    import json def lambda_handler(event, context): print(event) greeter = 'World' try: if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and ( event['queryStringParameters']['greeter'] is not None): greeter = event['queryStringParameters']['greeter'] except KeyError: print('No greeter') try: if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and ( event['multiValueHeaders']['greeter'] is not None): greeter = " and ".join(event['multiValueHeaders']['greeter']) except KeyError: print('No greeter') try: if (event['headers']) and (event['headers']['greeter']) and ( event['headers']['greeter'] is not None): greeter = event['headers']['greeter'] except KeyError: print('No greeter') if (event['body']) and (event['body'] is not None): body = json.loads(event['body']) try: if (body['greeter']) and (body['greeter'] is not None): greeter = body['greeter'] except KeyError: print('No greeter') res = { "statusCode": 200, "headers": { "Content-Type": "*/*" }, "body": "Hello, " + greeter + "!" } return res
  8. [Deploy]λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

"Hello, World!" λ§Œλ“€κΈ° API

이제 API Gateway μ½˜μ†”μ„ μ‚¬μš©ν•˜μ—¬ β€œHello, World!” Lambda ν•¨μˆ˜μ— λŒ€ν•œ APIλ₯Ό λ§Œλ“­λ‹ˆλ‹€.

β€œHello, World!”λ₯Ό μƒμ„±ν•˜λ €λ©΄ API
  1. https://console.aws.amazon.com/apigatewayμ—μ„œ API Gateway μ½˜μ†”μ— λ‘œκ·ΈμΈν•©λ‹ˆλ‹€.

  2. API Gatewayλ₯Ό 처음 μ‚¬μš©ν•˜λŠ” 경우, μ„œλΉ„μŠ€μ˜ κΈ°λŠ₯을 μ†Œκ°œν•˜λŠ” νŽ˜μ΄μ§€κ°€ λ‚˜νƒ€λ‚©λ‹ˆλ‹€. REST APIμ—μ„œ λΉŒλ“œλ₯Ό μ„ νƒν•©λ‹ˆλ‹€. 예제 API 생성 νŒμ—…μ΄ λ‚˜νƒ€λ‚˜λ©΄ 확인을 μ„ νƒν•©λ‹ˆλ‹€.

    API Gatewayλ₯Ό 처음 μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹Œ 경우 API 생성을 μ„ νƒν•©λ‹ˆλ‹€. REST APIμ—μ„œ [λΉŒλ“œ]λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  3. API μ΄λ¦„μ—μ„œ LambdaProxyAPI을 μž…λ ₯ν•©λ‹ˆλ‹€.

  4. (선택 사항) μ„€λͺ…에 μ„€λͺ…을 μž…λ ₯ν•©λ‹ˆλ‹€.

  5. API μ—”λ“œν¬μΈνŠΈ μœ ν˜• 섀정을 μ§€μ—­μœΌλ‘œ μœ μ§€ν•©λ‹ˆλ‹€.

  6. IP μ£Όμ†Œ μœ ν˜•μ—μ„œ IPv4λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  7. API 생성을 μ„ νƒν•©λ‹ˆλ‹€.

APIλ₯Ό μƒμ„±ν•œ ν›„μ—λŠ” λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 일반적으둜 API λ¦¬μ†ŒμŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ— λ”°λ₯Έ λ¦¬μ†ŒμŠ€ 트리둜 μ •λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이 μ˜ˆμ‹œμ—μ„œλŠ” /helloworld λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λ €λ©΄
  1. λ¦¬μ†ŒμŠ€ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

  2. ν”„λ‘μ‹œ λ¦¬μ†ŒμŠ€λŠ” κΊΌμ§„ μƒνƒœλ‘œ λ‘‘λ‹ˆλ‹€.

  3. λ¦¬μ†ŒμŠ€ 경둜λ₯Ό /둜 μœ μ§€ν•©λ‹ˆλ‹€.

  4. λ¦¬μ†ŒμŠ€ 이름에 helloworld을 μž…λ ₯ν•©λ‹ˆλ‹€.

  5. μ˜€λ¦¬μ§„ κ°„ λ¦¬μ†ŒμŠ€ 곡유(CORS)λ₯Ό κΊΌμ§„ μƒνƒœλ‘œ λ‘‘λ‹ˆλ‹€.

  6. λ¦¬μ†ŒμŠ€ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

ν”„λ‘μ‹œ ν†΅ν•©μ—μ„œλŠ” 전체 μš”μ²­μ΄ HTTP λ©”μ„œλ“œλ₯Ό λ‚˜νƒ€λ‚΄λŠ” catch-all ANY λ©”μ„œλ“œλ₯Ό 톡해 λ°±μ—”λ“œ Lambda ν•¨μˆ˜λ‘œ κ·ΈλŒ€λ‘œ μ „μ†‘λ©λ‹ˆλ‹€. μ‹€μ œ HTTP λ©”μ„œλ“œλŠ” μ‹€ν–‰ μ‹œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ§€μ •ν•©λ‹ˆλ‹€. ANY λ©”μ„œλ“œλ₯Ό 톡해 μ§€μ›λ˜λŠ” λͺ¨λ“  HTTP λ©”μ„œλ“œμΈ DELETE, GET, HEAD, OPTIONS, PATCH, POST, PUT에 λŒ€ν•΄ 단일 API λ©”μ„œλ“œ 섀정을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ANY λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜λ €λ©΄
  1. /helloworld λ¦¬μ†ŒμŠ€λ₯Ό μ„ νƒν•œ λ‹€μŒ λ©”μ„œλ“œ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

  2. λ©”μ„œλ“œ μœ ν˜•μ—μ„œ ANYλ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  3. 톡합 μœ ν˜•μ—μ„œ Lambda ν•¨μˆ˜λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  4. Lambda ν”„λ‘μ‹œ 톡합을 μΌ­λ‹ˆλ‹€.

  5. Lambda ν•¨μˆ˜μ—μ„œ Lambda ν•¨μˆ˜λ₯Ό μƒμ„±ν•œ AWS 리전을 μ„ νƒν•˜κ³  ν•¨μˆ˜ 이름을 μž…λ ₯ν•©λ‹ˆλ‹€.

  6. κΈ°λ³Έ μ œν•œ μ‹œκ°„ 값인 29초λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ κΈ°λ³Έ μ œν•œ μ‹œκ°„μ„ ν™œμ„±ν™”λœ μƒνƒœλ‘œ μœ μ§€ν•©λ‹ˆλ‹€. μ‚¬μš©μž μ§€μ • μ œν•œ μ‹œκ°„μ„ μ„€μ •ν•˜λ €λ©΄ κΈ°λ³Έ μ œν•œ μ‹œκ°„μ„ μ„ νƒν•˜κ³  50 ~ 29000λ°€λ¦¬μ΄ˆ μ‚¬μ΄μ˜ μ œν•œ μ‹œκ°„ 값을 μž…λ ₯ν•©λ‹ˆλ‹€.

  7. λ©”μ„œλ“œ 생성을 μ„ νƒν•©λ‹ˆλ‹€.

API 배포 및 ν…ŒμŠ€νŠΈ

APIλ₯Ό λ°°ν¬ν•˜λ €λ©΄
  1. Deploy API(API 배포)λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  2. μŠ€ν…Œμ΄μ§€μ—μ„œ μƒˆ μŠ€ν…Œμ΄μ§€λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  3. 단계 이름에 testλ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.

  4. (선택 사항) μ„€λͺ…에 μ„€λͺ…을 μž…λ ₯ν•©λ‹ˆλ‹€.

  5. 배포(Deploy)λ₯Ό μ„ νƒν•©λ‹ˆλ‹€.

  6. μŠ€ν…Œμ΄μ§€ μ„ΈλΆ€ μ •λ³΄μ—μ„œ 볡사 μ•„μ΄μ½˜μ„ μ„ νƒν•˜μ—¬ API의 호좜 URL을 λ³΅μ‚¬ν•©λ‹ˆλ‹€.

λΈŒλΌμš°μ €μ™€ cURL을 μ‚¬μš©ν•˜μ—¬ API의 Lambda ν”„λ‘μ‹œ 톡합 ν…ŒμŠ€νŠΈ

λΈŒλΌμš°μ € λ˜λŠ” cURL을 μ‚¬μš©ν•˜μ—¬ APIλ₯Ό ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ GET μš”μ²­μ„ ν…ŒμŠ€νŠΈν•˜λ €λ©΄, API의 helloworld λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ URL을 λΈŒλΌμš°μ € μ£Όμ†Œ ν‘œμ‹œμ€„μ— μž…λ ₯ν•©λ‹ˆλ‹€.

API helloworld λ¦¬μ†ŒμŠ€μ˜ URL을 λ§Œλ“€λ €λ©΄ helloworld λ¦¬μ†ŒμŠ€μ™€ 쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„° ?greeter=John을 κ°„μ ‘ 호좜 URL에 μΆ”κ°€ν•©λ‹ˆλ‹€. URL은 λ‹€μŒκ³Ό 같이 ν‘œμ‹œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John

λ‹€λ₯Έ λ©”μ„œλ“œμ˜ 경우 POSTMAN λ˜λŠ” cURL λ“±μ˜ κ³ κΈ‰ REST API ν…ŒμŠ€νŠΈ μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 μžμŠ΅μ„œμ—μ„œλŠ” cURL을 μ‚¬μš©ν•©λ‹ˆλ‹€. μ•„λž˜μ˜ cURL λͺ…λ Ή μ˜ˆμ œλŠ” 컴퓨터에 cURL이 μ„€μΉ˜λ˜μ–΄ μžˆλ‹€κ³  μ „μ œν•©λ‹ˆλ‹€.

cURL을 μ‚¬μš©ν•˜μ—¬ 배포된 APIλ₯Ό ν…ŒμŠ€νŠΈν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.
  1. 터미널 창을 μ—½λ‹ˆλ‹€.

  2. λ‹€μŒ cURL λͺ…령을 λ³΅μ‚¬ν•˜μ—¬ 터미널 창에 λΆ™μ—¬ λ„£μŠ΅λ‹ˆλ‹€. 호좜 URL을 이전 λ‹¨κ³„μ—μ„œ λ³΅μ‚¬ν•œ κ²ƒμœΌλ‘œ λ°”κΎΈκ³  URL 끝에 /helloworldλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

    μ°Έκ³ 

    Windowsμ—μ„œ 이 λͺ…령을 μ‹€ν–‰ν•  경우 λ‹€μŒ ꡬ문을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

    curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
    1. ?greeter=Johnμ΄λΌλŠ” 쿼리 λ¬Έμžμ—΄ νŒŒλΌλ―Έν„°μ™€ ν•¨κ»˜ APIλ₯Ό μ§μ ‘μ μœΌλ‘œ ν˜ΈμΆœν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.

      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
    2. greeter:Johnμ΄λΌλŠ” 헀더 νŒŒλΌλ―Έν„°μ™€ ν•¨κ»˜ APIλ₯Ό μ§μ ‘μ μœΌλ‘œ ν˜ΈμΆœν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.

      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -H 'greeter: John'
    3. {"greeter":"John"}μ΄λΌλŠ” λ³Έλ¬Έκ³Ό ν•¨κ»˜ APIλ₯Ό μ§μ ‘μ μœΌλ‘œ ν˜ΈμΆœν•˜λ €λ©΄ λ‹€μŒκ³Ό 같이 ν•©λ‹ˆλ‹€.

      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \ -H 'content-type: application/json' \ -d '{ "greeter": "John" }'

    이 λͺ¨λ“  κ²½μš°μ— 좜λ ₯λ˜λŠ” 것은 λ‹€μŒκ³Ό 같은 응닡 본문이 μžˆλŠ” 200 μ‘λ‹΅μž…λ‹ˆλ‹€.

    Hello, John!