AWS를 이용한 서버리스 환경 구축 _ Lambda와 API Gateway

이유정·2023년 2월 2일
4
post-thumbnail

지난 6개월동안 인턴을 하면서 사용했었던 AWS의 Lambda와 Gateway를 사용하는 대략적인 방법 및 서버리스에 대해서 기록해두려한다.
(일단 크게크게 방법을 써두었다. 추후 좀 더 자세하게 수정 예정 )

Serverless API

먼저, serverless란 직접적으로 서버가 없다라는 의미는 아니며, 개발자가 서버를 직접 관리할 필요가 없는 아키텍처를 의미한다.

장단점

  • 동적으로 서버의 자원을 할당 -> 경제적이다.
    이 경우, 사용자가 없다면 자원을 할당하지 않고 대기하다 요청이 들어오면 그 때 자원을 할당하는 방식으로 자원을 효율적으로 사용할 수 있다. 비용 청구 또한 대기상태를 제외하고 사용한 것에 대해 청구된다.

  • 개발에만 집중할 수 있는 환경
    해당 서버는 클라우드 제공 기업에서 전적으로 관리하기 때문에 개발자는 스케일링, 업데이트, 백업, 보안 등 서버에 대해 일절 관리하거나 신경 쓸 필요가 없어 비즈니스 로직에 집중하여 개발을 할 수 있다.

  • (+) AWS lambda의 경우 서버 뿐 아니라 Lambda에 AWS에서 제공하는 트리거나 스케줄 등의 이벤트를 걸어 사용이 가능하다.

  • 콜드 스타트 : 서버리스의 경우 계속 자원이 할당되어있는 것이 아니라, 그때 그때 자원을 활성화하여 실행시키는 것인만큼 어쩔 수 없이 가져가게 되는 문제이다.

  • 동시 실행에 대한 제한이 존재할 수 있다.

  • 서버 환경에 비해 속도 등 성능 문제가 있을 수 있다.

그렇다면 우리 팀이 Serverless API를 선택한 이유는 무엇이었을까?

개발에 집중하는 환경을 가져가기 위해.

  • 인턴 당시 내가 속해있던 팀의 경우, 당장 한정된 인력으로 서비스를 런칭하고 기존의 사이트를 운영해야했던 상황으로, Serverless를 선택하여 운영을 막 도입한 시점이었다.
    이는 따로 서버를 유지/관리/운영하는데에는 시간과 인적, 물적 자원이 부족했고, 당장의 개발과 운영에 더 집중할 수 있도록 서버리스를 선택했다고 하셨다.

  • 나의 경우, 인턴을 하면서 처음으로 AWS를 사용해보았는데, 일감이 떨어지면 앱 개발을 하며, 앱에 필요한 api 또한 AWS의 lambda와 api gateway를 통해 바로바로 만들어야했고, 꽤 빠른 시간 내 이를 만들 수 있게 되었다.
    이를 바탕으로 보면 서버리스가 초반에 한정된 자원으로 특정 기간 내 서비스를 런칭해야하는 팀에는 생산성을 높이는데 효과가 있을 것 같다고 생각한다.

AWS 이용해서 API 개발

특정 시간마다 람다를 실행시키기 위해 이벤트브릿지를 사용하는 경우도 있었지만, 나의 경우 api를 통해 함수를 실행시키기 위하여 AWS Gateway에 lambda를 연결해두고 해당 람다의 gateway endpoint로 request를 보내 사용하는 경우가 많았다.
때문에 이 글에서도 API Gateway를 만들고 Lambda를 만드는 작업을 기록해두었다.

Lambda

AWS에서 제공하는 Lambda의 경우 Serverless 중 FaaS, 즉 함수를 서비스로 제공하는 서비스의 한 예로서, 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있게 해주는 컴퓨팅 서비스이다.

API Gateway

Amazon API Gateway는 규모와 관계없이 REST 및 WebSocket API를 생성, 게시, 유지, 모니터링 및 보호하기 위한 AWS 서비스이다. API Gateway를 사용하면 실시간 양방향 통신 애플리케이션이 가능하도록 하는 RESTful API 및 WebSocket API를 작성. API Gateway는 컨테이너식 서버리스 워크로드 및 웹 애플리케이션을 지원한다.

개발 과정

개발 과정은 크게 API Gateway 생성 -> Lambda 함수 생성 -> 원하는 lambda들을 Gateway에 연결 -> API 배포 등으로 나뉠 것이다. 아래에서는 해당 과정을 크게크게 요약해보려한다.

API Gateway 생성하기.

API gateway에서 create API -> rest API를 선택한다.
그 뒤, 아래와 같이 REST, new API를 선택 후 gateway의 이름과 설명 그리고, 접속을 위한 엔드포인트 유형을 선택한다.
*(엔드포인트 유형에서 지역은 현재 리전에 배포를 의미, 최적화된 엣지는 cloudfront network에 배포, 프라이빗은 vpc에서만 엑세스가 가능하게 된다.)

이때 만든 API 하나 당 하나의 고유 엔드포인트인 url이 부여되며, 이를 이용할 수 있게 된다.

Lambda 함수 생성하기.

AWS Lambda의 함수를 선택, 함수 생성을 할 경우 아래와 같이 창이 생성되며, 여기서 함수이름과 함수작성에 사용할 언어와 버전을 선택한다.
(* 필요에 따라서는 해당 페이지 고급설정 - vpc 활성화를 통해 서브넷과 보안그룹 등을 지정할 수 있습니다. )

함수를 생성하면 다음과 같이 코드를 입력할 수 있는 창이 나타나며, 여기서 코드를 편집하고 테스트 및 배포를 진행할 수 있다.
만약 코드 중 다른 람다 함수와도 중복적으로 들어가는 코드 등이 있거나, 자주 사용하는 npm 모듈이 있는 경우 람다 레이어를 통하여 중복 작업을 줄일 수 있다.

추가로, 람다를 처음 생성할 경우, 일반적으로 제한시간이 3초로 되어있을 것이다. 이 경우 이후 람다 함수를 실행할 때 TimeoutException을 유발할 수 있으므로 제한시간을 늘려주는 것을 추천한다.

Lambda 함수와 API Gateway 연결해주기.

연결은 API Gateway에서 할 수도 있고, Lambda 함수에서 할 수도 있다. 람다 함수에서는 +Add trigger 버튼을 눌러 추가할 수 있으며,
이는 add trigger에서 gateway를 선택한 다음에 그 중에서 만들어두었던 게이트웨이api를 선택하여 연결해주는 방식이다.

두번째로는 앞서 만들어둔 api gateway에 리소스와 메소드를 추가하면서 연결하는 방식이다. 먼저 리소스 생성을 통해 엔드포인트 뒤에 붙을 리소스를 추가해준다.

리소스 추가를 누르면 다음과 같은 페이지가 추가가 되고, 리소스 이름 추가 후 이때 헤더 등 정보를 포함시키고 싶거나 웹에서 사용할 api의 경우에는 CORS 활성화를 체크해준다.

만약 /check라는 리소스를 생성후 이를 클릭할 경우, 파란색 네모박스 처럼 GET POST PUT DELETE 등을 선택할 수 있는 드롭박스가 나타난다. 여기서 원하는 CRUD를 선택하거나 리소스 생성때 처럼 옆에 작업을 눌러 메소드 생성으로 메소드를 생성할 수 있게된다.

메소드를 생성하려면 아래와 같은 페이지가 나타나는데 여기서 Lambda 함수 부분에 해당 메소드에 연결할 람다 함수의 이름을 적으면 된다.

마지막으로 사용을 위해서는 리소스나 메소드를 생성했던 것처럼 다시 한번 작업을 눌러 API 배포를 눌러준다.

API 배포를 누르면 스테이지를 선택하라는 팝업이 나오는데, 이때 배포할 스테이지까지 선택해주면 배포가 완료된다.
(만약 배포를 하지 않을 경우, 배포 이전에 만들어두었던 api는 반영되지 않으므로 주의해야한다. lambda와 마찬가지로 작업이 완료되었다면 배포해주기!!)

배포가 완료되었다면 자동적으로 배포한 API Gateway의 스테이지 화면으로 전환되며
여기서 api를 호출할 api gateway의 url 또한 확인이 가능하다.

배포 이후 부터는 만든 api를 가져다 사용하면 된다.

Test

이때 배포 전에 만들어둔 api가 제대로 작동하는지 확인하고 싶을 수 있다.

먼저 람다를 만들고, 람다가 제대로 작동하는지 여부는 람다 함수 내 Test를 눌러 테스트가 가능하며, test 탭에서 json 등의 형태로 입력값을 줄 수도 있다.
성공하면 아래 그림처럼 초록색 바탕으로 람다 코드가 return한 값이 있을 것이다. 이때 이 return한 값이 내가 원하는 값으로 나왔는지 확인을 하여 test를 할 수 있다.

만약 코드 자체에서 예외가 발생한다면, 초록색 바탕이 아니라 빨간색 바탕으로 표시되며 return 자리에는 에러에 대한 스택 트레이스가 적혀있을 것이다.

다음으로 게이트웨이에서 람다를 연결한 다음에 gateway에서 test를 하고 싶을 경우, 만들어둔 리소스의 메소드를 선택하여 test를 클릭하면 된다. 또한 여기서도 람다와 마찬가지로 입력값을 줄 수 있으며, 다른 점으로는 header 값 등도 따로 입력이 가능하다는 점이다.
(람다 테스트에서는 따로 헤더값을 입력해 줄 수 없다)

profile
개인 공부 블로그

0개의 댓글