1. 필요한 서비스

  • API Gateway
  • Lamdba

2. API Gateway란?


3. API 생성

S3, SNS, Lambda 등 다른 AWS와 연동된 API를 생성할 수 있다. 

먼저 API를 만들어보자. API Gatewat를 검색하면 다음과 같은 안내문이 나온다.

Amazon API Gateway는 개발자들이 Amazon EC2, AWS Lambda 또는 공개된 주소가 있는 웹 서비스에서 실행 중인 백엔드 시스템에 대한 API를 생성하고 관리하는 데 도움이 됩니다. Amazon API Gateway를 사용하여 API에 대한 사용자 지정 클라이언트 SDK를 만들고, 백엔드 시스템을 모바일, 웹, 서버의 애플리케이션 또는 서비스에 연결할 수 있습니다.

시간이 있으면 읽어보고, 아니면 [시작]으로 넘어간다.

  • 새 API
  • Swagger에서 가져오기
  • 예제 API

뭘 또 고르라고 한다. [새 API]를 골라보자.

[API 이름] 항목은 잘 모르니까 SarcAPI로 정했다. .. 일단 뭔가 만들어진 모양이다.

이제 메소드를 만들어야 하는데 그보다 먼저 리소스를 생성하야 한다. 그러므로 [작업]에서 [리소스 생성]을 선택해 보자.

  • [리소스 이름] : article
  • [리소스 경로] : /article (리소스 이름을 입력하면 자동으로 들어간다)
  • [리소스 생성] 클릭!

그러고 나니 "리소스에 대해 정의된 메서드가 없습니다."고 하니 이제 어서 메소드를 만들자. [메소스 생성] -> [POST]를 선택해 보자.

이제 통합 유형을 선택해야 한다.

  • Lambda 함수
  • HTTP
  • Mock
  • AWS 서비스

우리는 Lambda와 integeration할 것이므로 [Lambda 함수]를 선택한다. 그리고 Lambda 함수가 위치할 리전을 선택한다. .. 그러면 현재 어떤 Lambda 함수도 없다고 나오는데, [Lambda Function 생성]를 선택한다.


4. Lambda 생성 

그러면 Lambda 창이 하나 더 뜬다. 이제부터는 Lambda 이야기다.

Blank Function을 선택하고 트리거를 선택한다. 좌측에 빈 네모를 클릭하면 여러 선택지가 나오는데 API Gateway를 선택한다. 그러면 위에서 내가 만든 SarcAPI를 선택할 수 있게 된다.

언어는 기본으로 node가 설정되어 있다.

exports.handler = (event, context, callback) => {
    // TODO implement
    callback(null, 'Hello from Lambda');
};

이렇게 수정해보았다.

exports.handler = function(event, context) {
    console.log("** Sarc event :", JSON.stringify(event));
    var name = event.myname + ' from Sarc'; 
    context.succeed('** Hello Lambda from ' + name);
};

이렇게 생성을 하면 된다. 참고로 저장 시 Role 관련된 부분은 설정이 되어야 한다. 기존 Role을 사용하려면 IAM 관련하여 사전 설정이 되어 있어야 한다.

어쨌든 잘 마무리하고 Test를 해보자. 테스트 시에는 다음과 같은 본문을 붙인다.

{
    "myname":"stdio.h"
}

 결과는?

"** Hello Lambda from stdio.h from Sarc"

5. 배포

이제까지 AWS Management Console을 통해서 API를 만들었다. Test도 했다. 하지만 이 상태로는 사용할 수 없다. 뭘 더 해야 할까?

당근 배포를 해야 한다. [작업] 탭에서 [API 배포]를 선택한다. 단계 이름은 알아서 적자. 나는 "test"라고 적었다.

그러면 URL 하나를 준다. 급한 마음에 클릭을 했는데,

{"message":"Missing Authentication Token"}

라고 나온다.

(...)

당연한 것을, URL은 .../test로 끝났다. 즉. 리소스 정보를 안줬다. 끝에 /article을 추가하자.

잘 된다.

그냥 URL을 던지면 GET으로 넘어갈 것이다.

우리가 만든 코드는 POST 메소드에서 myname을 끄집어내어 콘솔에 보여주는 역할을 했었으므로 POST로 던져보자.

myname.json에 JSON 데이터를 넣고 curl을 실행해보자.

$ curl -X POST https://.../test/article -d @myname.json

6. Gateway 응답

API Gateway에서 정의한 응답 유형은 HTTP 상태 코드, 파라미터 매핑을 위한 추가 헤더, Payload 등으로 구성된다. 


7. CORS 설정

Access to XMLHttpRequest at '....' from origin 'http://abc.cdf' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

위와 같이 CORS 정책 관련 오류가 발생하면 API Gateway의 해당 메소드에서 CORS 활성화를 적용한다.


8. URL Path와 Lambda 파라미터 연결

8.1 API Gateway에서 리소스 생성

  • 리소스 생성 (Create Resource)
  • 리소스 이름, 리소스 경로 모두 {my_param}
  • 이 my_param은 Lambda 단에서 event.my_param

8.2. 통합 요청 (Integeration Request)

  • 매핑 템플릿
  • When no template matches the request Content-Type header
  • Add mapping template -> application/json
{
    "my_param": "$input.params('my_param')"
}