본문 바로가기

AWS/Networking & CDN

AWS - API Gateway와 Lambda를 이용한 RestFul API 생성

API Gateway와 Lambda를 이용한 RestFul API 생성

전체적인 로직

1. Client가 OpenAPI의 엔드포인트에 접근하여 특정 Request를 한다

2. 해당 엔드포인트의 요청에 맞는 메소드가 실행되며 Lambda Function 호출

3. Lambda에서 필요한 처리를 하여 Response를 한다

4. OpenAPI에서 받아 요청했던 사용자에게 Response한다.



1. Lambda 생성

- RESTApi 호출시 실행될 Lambda를 생성한다


1. Lambda_GET

- Get API를 위한 Lambda생성

1) 새로 생성을 체크한뒤 

간단히 이름을 적고 Runtime 환경에 사용될 언어를 선택한다


2) API Gateway를 통해 트리거 시킬 것이지만 생성된 API Gateway가 없으므로 우선은 비워둔다


3) body 부분에 자신이 알아볼 수 있도록 메시지를 바꾸어 넣고 우측 상단의 SAVE 버튼을 클릭한다



2. POST

1) 위와 같이 Function을 만든다 이름은 Lambda-hello-post 로 한다


2) API Gateway로 부터 넘어오는 데이터는 JSON형식으로 넘어오며 event안에 담겨있다

    JSON데이터에 key값을 "key"로 하여 Lambda에게 넘겨줄 예정이다  



2. API Gateway 생성

1. API 생성

1) API Gateway 서비스를 찾아 중앙의 Get Started 버튼을 클릭한다


2) Choose the Protocol : REST 프로토콜을 선택한다 

    Create new API : New API를 선택    


2. Resources 생성

- 사용자가 요청하게될 Resource이다(Endpoint)


1) "/" 를 선택한 뒤 Actions 버튼을 클릭하고 Create Resource를 선택한다


2) 적절한 이름을 부여하면 그것이 Endpoint가 된다


3. Method 생성

1. GET

1) 생성된 Resource를 클릭한 뒤 Actions버튼을 클릭하고 Create Method를 클릭한다


2) GET 메소드를 선택하고 "V" 버튼을 클릭한다


3) Integration type : Lambda Function (/hello 에 GET method로 요청할 시 Lambda Function을 실행한다)

    Lambda Region : Lambda Function을 생성한 리전을 선택한다

    Lambda Function : 위에서 생성한 Lambda Function을 선택한다 (복사한 ARN을 붙혀넣으면 자동으로 선택된다)


2. POST

1) 위와 같은 방식으로 POST 메소드를 생성하며 POST를 위해 만든 Lambda-hello-post를 지정한다



3. Lambda Function Trigger 확인

위의 메소드 설정 부분에서 생성한 Lambda를 지정해주면

아래 그림과 같이 Trigger부분에 자동으로 API Gateway가 등록된 것을 볼 수 있다.


4. Test

1. GET

1) 만들어진 GET메소드를 클릭한뒤 TEST를 클릭한다


2) GET 방식에는 Body에 메시지를 담을 수 없다 그냥 TEST를 눌러 진행한다


3) /hello에 대한 요청에대한 응답으로 200CODE가 왔고

   body 에는 Lambda에서 작성한 return 코드가 들어있다



2. POST

1)  GET Method와 다르게 Request Body를 넣을 수 있는 공간이 생겼다

    Lambda Function에서 key값을 "key"로 하기로 했으므로 아래와 같은 형식의 JSON 데이터를 입력하여 

    TEST를 눌러보자

   {

"key" : "GALID"

   }

  

Response Body에 : GALID hi 라는 data가 온것을 볼 수 있다



3. 한 자원에 대해 Method별로 Lambda Function을 만들기 귀찮다면?

*HTTP 프로토콜의 메소드에 대한 개념이 어느정도 있어야 한다

Lambda 의 handler에서는 Request 객체가 전달되지 않으므로 Method 종류를 파악하고 분기 조건을 만들기 어렵다

이때 파라미터로 전달되는 event 변수를 이용하여 분기조건을 만들 수 있다

API Gateway로 값을 전달할 때 "method" 라는 키를 가지는 데이터를 포함하는 규칙을 정하여 이를 통해 구분할 수 있다


1. Lambda 설정

아래와 같이 try 구문안에 event의 'method'를 키로 하는 값이 'POST' 인 경우 POST Method?! 라는 json값을 리턴하고

except 구문 안에는 GET Method?! 라는 리턴값을 주었다

try, except구문을 사용하는 이유는 GET 메소드에는 Request Body 값을 넣을 수 없기 때문에 event안의 값을 읽으려 하면

에러가 발생하기 때문이다 따라서 에러가 발생하는 경우에는 GET 메소드에 의한 요청이 온것이다.


2. API Gateway 설정

GET, POST Method에 대해 모두 같은 Lambda function을 지정해야 한다.


3. 테스트

1) GET

API Gateway의 자원에서 GET메소드를 클릭한뒤 Test를 누른다 우리가 원한 값이 나왔다


2) POST

POST 메소드를 선택한뒤 RequestBody에 우리가 약속한 "method"키값에 "POST"값을 쌍으로하는 데이터를 넣어 TEST를 누른다

원하는 값이 잘 전달 되었다



4. REST API 배포

배포 (AWS Docs)

 - https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/amazon-api-gateway-using-stage-variables.html


1. Stage 생성

1) 좌측 Resources탭을 클릭한뒤 "/"를 클릭한다

2) Actions를 클릭한뒤 Deploy API를 클릭한다


3) Deployment stage : [New Stage]를 선택한다

나머지는 편한대로 설정


4) 좌측의 Stages탭을 클릭하면 내가 생성한 Stage가 보인다 클릭하면 

     API에 접근하기위한 Endpoint가 보인다 클릭해보자


2. Missing Authentication Token Error

1) Invoke URL 에 적혀있는 URL은 "/" 즉 루트 Resource를 가리킨다

   "/" 에대한 메소드 정의가 되어있지 않으면 나타나는 오류이다 

  따라서 Method를 정의한 하위 URL을 추가로 작성하여 접근하면 에러가 나타나지 않는다


2) invokeURL/hello로 접근해보자

     다음과 같이 Lambda에서 작성한 return code가 나타남을 볼 수 있다.


4. Post Man을 이용하여 POST 메소드 요청

- 웹브라우저에서는 기본적으로는 POST 메소드 요청을 전달할 수 없다 

   PostMan이라는 응용프로그램을 이용해서 POST요청 전달을 해보도록 한다

  

1) POST를 선택한뒤 우측에는 invoke URL+"/hello" 을 써넣는다

그 후 Request Body 작성을 위해 Body를 클릭한다


2) raw 타입을 선택한 후 Request Body에 JSON형식에 데이터를 기입한다

"key" 값은 Lambda에서 필요한 "key"값을 사용한다


3) 성공적으로 응답이 왔다