AWS Lambda + API Gateway로 Serverless API 만들기
AWS Lambda + API Gateway로 Serverless API 만들기
당시 원하던 목표는 외부 API 요청시에 param으로 요구되는 key 값들을 숨기는 것과 환경변수를 사용할 수 없는 상황이었다. 그래서 AWS Lambda와 API Gateway를 사용하여 API를 Wrapping하였다.
AWS Lambda 함수와 API GateWay
- AWS Lambda 함수: 서버를 프로비저닝하거나 관리할 필요 없이 코드를 실행할 수 있게 해주는 서버리스 컴퓨팅 서비스. 특정 이벤트에 의해 트리거되며, 요청이 있을 때만 실행된다.
- API Gateway: 클라이언트의 요청을 받아 Lambda 함수로 전달하고, Lambda 함수의 응답을 클라이언트에게 전달하는 역할. API Gateway는 다양한 API 메서드(GET, POST 등)를 정의하고, 각 메서드가 어떤 Lambda 함수를 호출할지 설정할 수 있다.

- API 소비자(클라이언트): 사용자는 웹 애플리케이션 또는 모바일 애플리케이션을 통해 API 요청을 보냄
- API 게이트웨이: 클라이언트의 요청을 받아 적절한 Lambda 함수로 전달
- AWS Lambda 함수: API Gateway로부터 받은 요청을 처리하고, 필요한 작업을 수행한 후 응답을 반환함
- API 게이트웨이: Lambda 함수의 응답을 받아 클라이언트에게 전달
만들고자 하는 Wrapping API
- 캐릭터 리스트 (
/api/characters)- 캐릭터 상세 데이터 (
/api/character/${characterId})
API GateWay 구축
API GateWay 생성하기 버튼을 누르게 되면 아래의 선택 항목을 확인할 수 있다. 나는 GET 요청만을 할 두 개의 API를 만들것이기 때문에 HTTP API를 선택했다.
만약 어떤것을 골라야할 지 고민이 된다면 해당 링크의 설명을 확인하면 된다. : API Gateway 사용 사례
| API 유형 선택 | API생성 : 통합 생성 및 구성 |
|---|---|
|
|
API이름은 API GateWay에서 구분하기 위함으로 사용된다. 위의 통합 추가는 이미 만들어 둔 것과 연결할 때 사용한다. (이미 만들어져있다면 사용 무관)
구축 버튼을 클릭한 후 진행되는 세번째 단계인 스테이지 구성에서는 API 엔드포인트의 URL의 일부로 설정된다.

APi라는 것을 명시하기위해서 그냥 api로 설정했다. Base URL는 아래와 같이 된다.
https://####.execute-api.ap-northeast-2.amazonaws.com/[api]
: (https://jttiazmtv9.execute-api.ap-northeast-2.amazonaws.com/api)/엔드포인트
API GateWay 구축 첫 단계에서 스테이지 구성에서 스테이지 이름을 marvel로 설정했었다. 생성 버튼을 통해 아래와 같이 원하는 엔드포인트에 맞는 메서드를 생성한다.
| 경로 및 메서드 생성 | 생성된 API 경로 |
|---|---|
|
|
AWS Lambda 함수 핸들러 정의
처음 빌드해보는 것이며, 빠르게 진행하기 위해 Node.js를 사용하였다. TypesSript로도 빌드할수 있기 때문에 타입안정성이 우선시 되어야한다면 TypesSript로 진행할 것 같다.

핸들러 조건
- characterId 를 path paramter로 받는다.
- 환경변수(Public key, Private Key) 사용
- API 요청시 필요한 hash값을 위하여 인코딩 작업이 필요하다. 이는 crypto-js를 사용.

AWS Lambda 함수 내의 node.js 런타임에서 fetch 를 사용할 경우,
/* global fetch */문구 추가 필요
Lambda 함수에서 환경 변수를 설정하려면, AWS Lambda 콘솔에서 "환경 변수" 섹션에서 추가할 수 있다.
Lambda Layers
AWS Lambda 함수의 코드에서 의존하는 추가 패키지 및 모듈을 사용하려면 Lambda Layers 생성해주어야 한다.
- 패키지 설치 및 zip 파일로 만든 후에 layers 파일 업로드
- 원하는 런타임을 선택하고 layers 생성 (Lambda 함수와 동일한 런타임 버전을 선택해야한다.)
- lamdda 함수 설정에서 생성한 layers 추가 및 적용
- lamdba 함수 내에서 공통 라이브러리 사용가능 (현재 프로젝트는 crypto-js)
| 추가된 Lambda Layers | Lambda함수에 Layer 연결 |
|---|---|
|
|
Lambda Layers를 생성하여 각각의 Lambda 함수에 추가해준다.
Lambda 함수와 API GateWay 연결
만들어둔 API GateWay에서 “통합 연결”버튼을 클릭하여 엔드포인트와 Lambda 함수를 연결시킵니다.
| 만들어둔 API GateWay | “통합 연결”버튼을 클릭 후 화면 |
|---|---|
|
|
| 캐릭터 리스트 | 캐릭터 상세 데이터 |
|---|---|
|
|
호출
캐릭터 리스트 (/api/characters) | 캐릭터 상세 데이터 (/api/character/${characterId}) |
|---|---|
|
|
회고
wrapping API는 Next.js 로 밖에 만들어 보질 않았어서 EC2를 띄워야하나 고민했었다. 하지만, EC2 숙련도가 낮았고 가격이 부담스러웠다. 찾아보니 AWS Lambda + API GateWay 조합으로 많이 사용한다는 것을 알고 시도하게되었다.
사실 기록해두고싶어 블로그 포스팅을 한다. 레퍼런스란에서 참고한 글을 보고 진행하는 것이 훨씬 더 편할 수 있다.
진행하면서 깃이슈에 기록하면서 진행했다. 위의 내용과는 크게 다르지 않다.
두려움이 있어 시도 조차 해보지않았던 AWS의 서비스들을 하나씩 해보고 있는데, 도장깨기 같아서 재밌다. 사실 도장이 잘 안깨져서 고민이기도하다.
레퍼런스
- AWS Lambda + API Gateway로 Serverless API 환경 구성하기
- https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/api-gateway-create-api-as-simple-proxy-for-lambda.html
- https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/nodejs-handler.html
- https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/creating-deleting-layers.html











