API Gateway, Lambda 생성, 연결하기

읽기 전

  • 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다. (예시 코드는 works on my machine 상태라 다르게 작동될 수 있습니다.)
  • Udemy강의(AWS Serverless APIs & Apps - A Complete Introduction)를 기반으로 작성되었습니다. 필자의 프로젝트 요구사항에 맞춰 일부 변형하였으니 자세한 이해를 원하신다면 결제해서 수강해보시길 권장드립니다. 좋은 강의라고 생각합니다. 항상 할인 중이니 저렴한 가격에 줍줍하세요
  • API Gateway에서 API를 생성, Labmda에 연결하여 호출 및 응답 여부를 확인합니다.

이번 글에서 할 일

AWS_Serverless_002_01

위 그림에 표시된 영역을 구현해보려 합니다.

REST API 생성

AWS_Serverless_002_02

AWS 웹 콘솔에 들어가서 API Gateway 서비스에 접근하면 위와 같은 화면이 있다. API생성 버튼을 클릭하여 새로운 API를 생성해보자.

AWS_Serverless_002_03

우린 REST API를 구현하기로 했으므로 위 그림과 같이 체크 후 생성하고자 하는 API이름을 작성 후 적당한 설명과 함께 API를 생성한다. 서비스하는 지역에 따라 엔드포인트 유형을 선택하면 된다. 여기선 한국에서만 지원할 거라 지역을 선택했지만 해외까지 고려하면 엣지 최적화를, VPC에서만 접근한다면 프라이빗을 선택하면 된다.

AWS_Serverless_002_04

이제 비어있는 API를 새롭게 작성하였다. 작업을 클릭하여 리소스를 정의해야 우리가 요청하고자 하는 메소드를 만들 수 있다.

AWS_Serverless_002_05

적당히 원하는 리소스 이름을 작성하면 해당 리소스 경로가 자동으로 추가된다. API Gateway CORS 활성화는 외부 서버 및 클라이언트에서 요청 시 CORS 이슈가 발생하지 않게끔 자동으로 메소드를 정의해준다. 외부에서 접근할 API를 만들고 있으므로 체크하자.

프록시 리소스로 구성(Configure as proxy resource)는 프록시 리소스로 지정하겠다는 옵션이다. 즉, 모든 리소스와 메소드를 통합하여 관리함을 의미한다. 좀 더 부연 설명을 하자면 메소드 별로 다른 람다에 연결하고자 한다면 의미가 없는 옵션이지만 모든 리소스와 메소드를 같은 lambda 함수 등에 연결하고자 한다면 유용할 수 있다. 필자는 각 메소드 별로 다른 함수에 연결하므로 체크를 해제한다.

AWS_Serverless_002_06

방금 CORS 옵션에 체크함에 따라 AWS에서 자동으로 헤더를 매핑한 모습을 OPTIONS 메소드에서 확인할 수 있다. 그리고 '*'는 모든 도메인에 대해 적용한다는 뜻이다. 생성된 리소스 하단에 메소드를 생성한다. 그러면 어디에 통합할 지 선택할 수 있다. 필자는 aws lambda와 연동할 예정이므로 해당 함수를 체크 후 연동하려 한다. 그러나 해당 api에 연결할 lambda 함수를 아직 정의하지 못했으므로 정의 후 추가하자.

Lambda 함수 생성

AWS_Serverless_002_07

AWS 웹 콘솔에 들어가서 Lambda 서비스에 접근하면 위와 같은 화면이 있다. 함수 생성 버튼을 클릭하여 새로운 함수를 생성해보자.

AWS_Serverless_002_08

필자는 python으로 함수를 작성할 예정이므로 런타임 언어를 위와 같이 지정하였다. (이번 글을 쓰게 된 가장 큰 원인이다. 모두가 node.js를 쓰고 있... 여러분 node.js를 배우세요)

AWS_Serverless_002_09

함수 생성이 완료되면 함수가 어디에 연결되었는지 확인할 수 있는 디자이너 탭, 온라인에서 코드를 편집할 수 있는 IDE를 제공한다. 온라인에서 코드를 편집할 수 없는 언어들은 로컬에서 코드 작성 후 작업 버튼을 클릭하여 zip 파일 등을 업로드 할 수 있다. 또한 외부 모듈을 사용하고자 한다면 layer에 모듈 파일 등을 업로드하여 import할 수 있다. 이번 포스팅에선 기본 내장 모듈만 사용할 예정이므로 따로 외부 모듈 업로드 과정은 작성하지 않았다.

API Gateway와 Lambda 함수 연결

AWS_Serverless_002_10

다시 POST 메소드 생성 화면으로 돌아와서 통합 유형에 Lambda 함수를 체크한 뒤 연결하고자 하는 Lambda 함수를 입력하고 저장을 누르면 lambda 함수를 호출하기 위한 권한을 api에 부여한다는 팝업을 띄운다. 권한에 대해 항상 인지해야 할 점은 AWS는 각 서비스에게 다른 서비스에 대한 권한을 주지 않는다. 그러므로 각 AWS 서비스가 다른 AWS 서비스로 접근하기 위해서는 권한을 부여받아야 한다. 이 내용은 이후 Lambda가 DynamoDB에 접근할 때 다시 언급하려 한다.

메소드를 생성하고 나면 테스트 탭과 수신된 request와 response에 대해 어떻게 처리할 지 정의할 수 있는 탭이 있고 이전에 정의했던 lambda 함수와 연결되어 있음을 확인할 수 있다.

AWS_Serverless_002_11

위 그림을 보면 성공적으로 api gateway에서 lambda로 event 전달 후 반환된 response를 확인할 수 있다. 로그도 같이 볼 수 있으므로 api gateway에서 lambda로 데이터를 넘겨주는 과정에서 오류가 발생했을 때 어떤 이슈가 발생했는지 확인할 수 있다.

외부에서 API 호출하기

외부에서 API를 호출하기 위해 API를 배포해야 한다. 작업버튼 클릭 후 API 배포를 클릭하면 새로운 스테이지를 생성하라고 한다. 적당히 작성한 후 넘어가면 배포가 완료된다. (API KEY는 귀찮아서 생략..)

AWS_Serverless_002_12

정의해둔 POST 메소드에 호출할 수 있는 URL이 있다. 이 URL을 이용해서 API를 호출하여 결과를 얻어보자.

AWS_Serverless_002_13

var xhr = new XMLHttpRequest();
xhr.open('POST', '생성된 POST Method URL Address');
xhr.onreadystatechange = function(event){
console.log(event.target.response);
}
xhr.send();

단순히 호출이 가능한 지 검증하는 단계이므로 URL 연결 생성 후 요청을 보내는 코드를 작성한다. 콘솔에 로깅하라는 코드를 작성했으므로 개발자 도구를 켜서 콘솔 탭을 확인해보자.

콘솔에 출력된 에러 메세지를 읽어보면 요청 헤더에 Access-Control-Allow-Origin이 없어서 발생했음을 알 수 있다. 이전에 OPTIONS 메소드에선 관련 헤더가 추가되었음을 확인하였으나 POST 메소드에선 추가하지 않았기 때문이다. 해결하기 위해서 헤더에 Access-Control-Allow-Origin을 추가해주면 된다. 다시 API Gateway로 가서 리소스를 클릭한 뒤 작업 버튼을 클릭하여 CORS 활성화를 클릭하면 응답 헤더에 추가됨을 확인할 수 있다. 직접 추가해도 되지만 AWS에서 자동으로 지원해주기 때문에 필자는 편한 방법을 선택하였다.

AWS_Serverless_002_14

CORS 활성화를 한 뒤 API에 변경이 발생하였으므로 다시 API 배포를 하여 변경사항을 갱신하자. 이후 다시 요청을 보내면 개발자 도구의 콘솔탭에서 lambda가 반환한 message를 확인할 수 있다.

+ Recent posts