본문 바로가기

AWS Lambda ƛ/Lambda

AWS API Gateway - RESTful API 생성하기 with Lambda

Lambda_REST_API_Configuration.drawio
0.01MB

# AWS API Gateway RESTful 관련 구성도 (현재는 9번까지 작성함)

# RESTful API 란?

REST API(RESTful API, 레스트풀 API)란 REST 아키텍처의 제약 조건을 준수하는 애플리케이션 프로그래밍 인터페이스이다. REST는 웹의 창시자(HTTP) 중의 한 사람인 Roy Fielding의 2000년 논문에 의해서 소개되었다. 현재의 아키텍쳐가 웹의 본래 설계의 우수성을 많이 사용하지 못하고 있다고 판단했기 때문에, 웹의 장점을 최대한 활용할 수 있는 네트워크 기반의 아키텍쳐를 소개했는데 그것이 바로 Representational safe transfer (REST)이다.


# AWS의 API Gateway 서비스를 활용하여 RESTful API를 생성해 보자.

# 자 그럼 REST API가 무엇인지 부터 확인해 보자.
HTTP method인 POST, GET, PUT, DELETE에 해당하는 액션만 잘 이해하고 있어도 반이상은 구성하셨다고 볼 수 있다.

여기서 각각의 method는 아래와 같은 의미이다.

- POST: 새로 생성(Create)
- GET: 조회(Read)
- PUT: 수정(Update)
- DELETE: 삭제(delete)

아래의 표를 제대로 이해하고 있다면 RESTful API를 구성할 준비는 끝난다고 보면 된다.
우리가 웹이나 앱을 개발하면 URL 기반으로 아래와 같이 리소스를 출력한다.
리소스를 출력할때 어떤 메소드를 주느냐에 따라서 해당 값들이 변경된다고 생각하면 쉽다.

- 지금부터 본격적으로 API Gateway로 RESTful API를 구성해보자.

API Gateway는 API Gateway로 들어온 요청을 지정된곳으로 전달해주는 개념정도로 볼 수 있다.
우리는 POST, GET, PUT, DELETE로 요청된 resource를 일반적인 http로 보내는것이 아니라 Lambda Function을 실행하도록 구성을 해보자, Lambda는 이벤트 기반의 서비스리 코드로, 어떤 이벤트가 있을때 해당 값들을 연산 후 특정한 곳으로 전달해주는 기능을 수행한다.

1. AWS API Gateway 서비스로 이동 합니다 > API 생성을 클릭하여 생성을 진행 한다.

2. API 유형을 선택 합니다. 여기서 REST API를 구축한다.

3. API 생성 화면에서 API 이름과 간단한 설명을 입력합니다. API 생성 버튼을 클릭하여 생성을 한다.

4. 생성을 하면 RESTful API의 메서드를 선택하고 실행하는 화면으로 이동 한다.

여기서 POST, GET, PUT, DELETE 메소드를 생성하고 실행 할 수 있다.

5. 아래의 예제를 기반으로 REST API의 메소드를 생성하고 실행 한다.

6. 위의 이미지에서 처럼 우선 /dogs 라는 리소스를 생성한다.
- 리소스는 한마디로 데이터로, POST, GET, PUT, DELETE 메소드를 실행 했을때 이 리소스 기반으로 작업이 수행이 된다고 볼 수 있다. 예를들어 GET이라는 메소드를 실행 한다면 이 리소스의 데이터를 GET 즉 가져와서 화면에 뿌리는 역할을 한다고 볼 수 있다. 물론 GET을 할때도 JSON이나 기타 다른 포멧을 이용하여 세부적인 옵션을 설정 할 수 있다. 마치 SQL 쿼리에서 데이터를 불러오는 것처럼...

- 여튼 리소스를 생성해 줍니다.

7. 리소스를 생성을 했다면 이제 POST, GET, PUT, DELETE 작업을 수행하는 메소드를 생성해 주면 된다.

- POST 메소드 생성 : 작업을 클릭하여 메서드 생성에서 POST 메서드를 생성하고, 이전에 생성한 특정 값을 출력하는 람다 함수를 맵핑후 저장을 클릭하여 작업을 완료 합니다. (나머지 GET, PUT, DELETE 도 같은 방식으로 메소드 생성을 진행한다.)

맵핑을 위한 람다 함수를 아직 생성하지 않았다면, 아래의 링크로 이동하여 맵핑할 람다 함수를 생성한다.

그리고 위의 작업 중 Lambda 함수 맵핑 작업을 진행하면 된다.

2021.12.24 - [AWS Lambda ƛ/Lambda] - AWS Lambda에서 특정 문장을 출력하기

8. 리소스와 메소드가 생성된것을 확인 할 수 있다.

9. Lambda Function 구성

GET,PUT,DELETE도 마찬가지로 Lambda function을 먼저 만들고 그뒤에 API Gateway에서 각각에 맞는 Lambda function으로 할당해주어야 한다. 그러므로 우선 Lambda Funtion을 구성한다.

- 이전에 생성한 First-Lambda-Function 함수에 들어가보면 REST API가 연결된 것을 확인할 수 있다.

10. 람다 함수의 코드를 아래와 같이 변경을 한다.

- 함수가 성공 했을때 리턴되는 값이 ' ' 가 되도록 설정 한다. 

exports.handler = function(event, context) {
    console.log('event: ', JSON.stringify(event));
    context.succeed('')
};

- 테스트 탭으로 이동하여 JSON 형태의 값들을 아래와 같이 변경하여 테스트를 한다.

- JSON 형태의 데이터 

{
  "이름": "홍길동",
  "나이": "21",
  "성별": "남"
}

11. 변경한 데이터를 기반으로 테스트를 클릭하여 결과를 확인한다.

테스트 결과는 아래와 같다. 우리가 Lambda function 코드에서 항상 ""을 리턴해주고 event로 들어온값을 로그로 찍어준것처럼 아래에 값처럼 로그와 응답으로 넘어오게 된다.

이로써 기본적인 POST로의 연동은 끝났습니다.

나중에 실제 구현시에는 /dogs의 POST메소드는 dog 데이터를 생성해주는 작업을 하는 API이므로 이벤트에서 받는 값을 외부에서 생성된 데이터일 것이고 이 데이터들을 DB에 INSERT하는 코드를 Lambda Function 코드에 넣어주면 된다.

12. POST 메소드에 대해서 자세히 설명

- 기존의 코드를 조금 변경하여 람다 함수의 실행이 끝나고 ' ' 값을 Response 받는것이 아닌, event 로 들어오는 값을 Response 받고 싶다고 한다면 코드를 아래와 같이 변경하면 된다. (아주 심플...)

exports.handler = function(event, context) {
    console.log('event: ', JSON.stringify(event));
    context.succeed(event) //여기만 '' -> event 로 변경해 주면 실제 event 값을 Response 한다.
};

- 위의 코드를 Deploy 하고, 이전의 JSON으로 작성한 값들을 기반으로 테스트를 하면 아래와 같이 Response되는 값이 바뀔 것이다.

13. GET 메소드의 구현

GET의 방법도 POST를 구성하는 방식과 동일하다.
/dogs의 GET은 dog 와 관련된 테이블의 모든 데이터 리스트를 리턴해주는 작업을 하므로 DB에서 해당 dog 데이터들을 불러와서 context.succeed() 로 데이터 리스트들을 리턴시켜주면 된다.

14. PUT, DELETE 메소드의 구현

PUT과 DELETE는 /dogs 가 아닌 /dogs/1 과 같은 특정 dog의 id에 대한 동작이다.
PUT /dogs/1 은 1번 데이터에 해당하는 dog 정보를 수정하는 작업이고, DELTE /dogs/1 은 1번 데이터에 해당하는 dog 정보를 삭제하는 작업이다. 현재는 dogs/ 아래에 데이터가 없으므로 데이터를 생성하는 작업을 수행 한다.

- PUT, DELETE 메소드를 생성할때 리소스의 이름이 중요하다. PUT, DELETE의 경우 수정 및 삭제 하고자 하는 DB ID를 path값으로 넘겨줄 것이므로 path 아래와 같은 패턴이 될 것이다.

PUT /dogs/1111
PUT /dogs/2222
PUT /dogs/3333
PUT /dogs/4444

DELETE /dogs/1111
DELETE /dogs/2222
DELETE /dogs/3333
DELETE /dogs/4444

- 그렇기때문에 resource를 생성할때 resource path에 {id} 처럼 만들어주어 어떤 path parameter가 와도 받아줄 수 있도록 구성한다.

- 해당 resource 경로에서 새로운 리소스를  생성하여 아래와 같이 설정한다.

- 아래와 같이 기존에 작성한 PUT과 DELETE를 삭제하고, {id} 밑으로 넣어준다.

15. PUT과 DELETE 작업은 POST 및 GET 작업과 다르게 추가로 템플릿 개념을 추가해야 한다.

- API Gateway에서 [통합 요청]을 클릭하여 설정을 변경한다.

- 아래의 [Body Mapping Templates]에서 요청하는 request의 Content-Type을 지정하고 가장 기본으로 되어있는 템플릿을 지정한다. 자신만의 템플릿을 위해서 원하는대로 수정이 가능하다.

16. 변경한 설정이 잘 적용이 됐는지 테스트를 수행한다.

- 테스트를 클릭하면 아래와같이 테스트를 할 수 있는 화면으로 이동한다.
- path 파라미터에 11111을 넣는다는 의미는 PUT /dogs/11111을 실행한다는 의미와 같다.
- 테스트를 수행하면 응답 본문에 테스트된 값을 확인할 수 있다.

- PUT,DELTE에서 /dogs/11111로 요청하면서 body에 {"id": "may9noy"}로 들어오고 로그를 찍는것까지 해보았다.
실제 dogs의 11111데이터를 수정,삭제하는 작업은 그 다음단계에서 DB와 연동해서 작업을 하면 된다.

- 이 다음에는 실제 DB와 연동하여 작업을 진행을 해보자.

- 끝 -