API Gateway, Lambda 생성, 연결하기
읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다. (예시 코드는 works on my machine 상태라 다르게 작동될 수 있습니다.)
- Udemy강의(AWS Serverless APIs & Apps - A Complete Introduction)를 기반으로 작성되었습니다. 필자의 프로젝트 요구사항에 맞춰 일부 변형하였으니 자세한 이해를 원하신다면 결제해서 수강해보시길 권장드립니다. 좋은 강의라고 생각합니다.
항상 할인 중이니 저렴한 가격에 줍줍하세요 - API Gateway에서 API를 생성, Labmda에 연결하여 호출 및 응답 여부를 확인합니다.
이번 글에서 할 일
위 그림에 표시된 영역을 구현해보려 합니다.
REST API 생성
AWS 웹 콘솔에 들어가서 API Gateway 서비스에 접근하면 위와 같은 화면이 있다. API생성 버튼을 클릭하여 새로운 API를 생성해보자.
우린 REST API를 구현하기로 했으므로 위 그림과 같이 체크 후 생성하고자 하는 API이름을 작성 후 적당한 설명과 함께 API를 생성한다. 서비스하는 지역에 따라 엔드포인트 유형을 선택하면 된다. 여기선 한국에서만 지원할 거라 지역을 선택했지만 해외까지 고려하면 엣지 최적화를, VPC에서만 접근한다면 프라이빗을 선택하면 된다.
이제 비어있는 API를 새롭게 작성하였다. 작업을 클릭하여 리소스를 정의해야 우리가 요청하고자 하는 메소드를 만들 수 있다.
적당히 원하는 리소스 이름을 작성하면 해당 리소스 경로가 자동으로 추가된다. API Gateway CORS 활성화는 외부 서버 및 클라이언트에서 요청 시 CORS 이슈가 발생하지 않게끔 자동으로 메소드를 정의해준다. 외부에서 접근할 API를 만들고 있으므로 체크하자.
프록시 리소스로 구성(Configure as proxy resource)는 프록시 리소스로 지정하겠다는 옵션이다. 즉, 모든 리소스와 메소드를 통합하여 관리함을 의미한다. 좀 더 부연 설명을 하자면 메소드 별로 다른 람다에 연결하고자 한다면 의미가 없는 옵션이지만 모든 리소스와 메소드를 같은 lambda 함수 등에 연결하고자 한다면 유용할 수 있다. 필자는 각 메소드 별로 다른 함수에 연결하므로 체크를 해제한다.
방금 CORS 옵션에 체크함에 따라 AWS에서 자동으로 헤더를 매핑한 모습을 OPTIONS 메소드에서 확인할 수 있다. 그리고 '*'는 모든 도메인에 대해 적용한다는 뜻이다. 생성된 리소스 하단에 메소드를 생성한다. 그러면 어디에 통합할 지 선택할 수 있다. 필자는 aws lambda와 연동할 예정이므로 해당 함수를 체크 후 연동하려 한다. 그러나 해당 api에 연결할 lambda 함수를 아직 정의하지 못했으므로 정의 후 추가하자.
Lambda 함수 생성
AWS 웹 콘솔에 들어가서 Lambda 서비스에 접근하면 위와 같은 화면이 있다. 함수 생성 버튼을 클릭하여 새로운 함수를 생성해보자.
필자는 python으로 함수를 작성할 예정이므로 런타임 언어를 위와 같이 지정하였다. (이번 글을 쓰게 된 가장 큰 원인이다. 모두가 node.js를 쓰고 있... 여러분 node.js를 배우세요)
함수 생성이 완료되면 함수가 어디에 연결되었는지 확인할 수 있는 디자이너 탭, 온라인에서 코드를 편집할 수 있는 IDE를 제공한다. 온라인에서 코드를 편집할 수 없는 언어들은 로컬에서 코드 작성 후 작업 버튼을 클릭하여 zip 파일 등을 업로드 할 수 있다. 또한 외부 모듈을 사용하고자 한다면 layer에 모듈 파일 등을 업로드하여 import할 수 있다. 이번 포스팅에선 기본 내장 모듈만 사용할 예정이므로 따로 외부 모듈 업로드 과정은 작성하지 않았다.
API Gateway와 Lambda 함수 연결
다시 POST 메소드 생성 화면으로 돌아와서 통합 유형에 Lambda 함수를 체크한 뒤 연결하고자 하는 Lambda 함수를 입력하고 저장을 누르면 lambda 함수를 호출하기 위한 권한을 api에 부여한다는 팝업을 띄운다. 권한에 대해 항상 인지해야 할 점은 AWS는 각 서비스에게 다른 서비스에 대한 권한을 주지 않는다. 그러므로 각 AWS 서비스가 다른 AWS 서비스로 접근하기 위해서는 권한을 부여받아야 한다. 이 내용은 이후 Lambda가 DynamoDB에 접근할 때 다시 언급하려 한다.
메소드를 생성하고 나면 테스트 탭과 수신된 request와 response에 대해 어떻게 처리할 지 정의할 수 있는 탭이 있고 이전에 정의했던 lambda 함수와 연결되어 있음을 확인할 수 있다.
위 그림을 보면 성공적으로 api gateway에서 lambda로 event 전달 후 반환된 response를 확인할 수 있다. 로그도 같이 볼 수 있으므로 api gateway에서 lambda로 데이터를 넘겨주는 과정에서 오류가 발생했을 때 어떤 이슈가 발생했는지 확인할 수 있다.
외부에서 API 호출하기
외부에서 API를 호출하기 위해 API를 배포해야 한다. 작업버튼 클릭 후 API 배포를 클릭하면 새로운 스테이지를 생성하라고 한다. 적당히 작성한 후 넘어가면 배포가 완료된다. (API KEY는 귀찮아서 생략..)
정의해둔 POST 메소드에 호출할 수 있는 URL이 있다. 이 URL을 이용해서 API를 호출하여 결과를 얻어보자.
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에서 자동으로 지원해주기 때문에 필자는 편한 방법을 선택하였다.
CORS 활성화를 한 뒤 API에 변경이 발생하였으므로 다시 API 배포를 하여 변경사항을 갱신하자. 이후 다시 요청을 보내면 개발자 도구의 콘솔탭에서 lambda가 반환한 message를 확인할 수 있다.