간단한 CRUD API 구축

이번에는 CRUD API를 실습한 내용을 정리 해봤습니다!
2021.06.19

안녕하세요 4월 클래스메소드(Classmethod)에 입사해서 현재 AWS컨설팅 사업본부에서 연수를 받고 있는 김재욱(Kim Jaewook)이라고합니다. 평소 서버레스가 무엇인지, 어떻게 동작하는지 궁금 했었는데, 이번에 서버레스를 실습을 해 볼 기회가 생겨, 실습 한 내용을 적어 보고자 합니다!

DynamoDB 생성

DynamoDB 생성은 엄청 간단합니다! 먼저 AWS DynamoDB로 들어가서 "DynamoDB 테이블 만들기"를 눌러 줍니다.

테이블 이름은 http-crud-test로 했고 기본 키는 id로 했습니다. 테이블 셋팅은 디폴트 값으로두고, 생성 버튼을 누르면 DynamoDB가 생성됩니다.

Lambda 생성

이어서 lambda도 생성 합니다.

먼저 새로 작성을 선택 해주고, 기본 정보에는 http-crud-function이라는 함수 이름을 적고, 런타임은 노드 js를 선택합니다. 기본 실핵 역할 변경은 AWS 정책 템플릿에서 새 역할 생성을 선택 합니다.

역할 이름을 적어주고, 정책 템플릿은 단순 마이크로서비스 권한을 선택 해주고, 함수 생성을 눌러 줍니다.

그리고 index.js에 다음 코드를 입력하고, 디플로이 버튼을 눌러 줍니다.

const AWS = require("aws-sdk");

const dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json"
  };

  try {
    switch (event.routeKey) {
      case "DELETE /items/{id}":
        await dynamo
          .delete({
            TableName: "http-crud-test",
            Key: {
              id: event.pathParameters.id
            }
          }).promise();
        break;
      case "GET /items":
        body = await dynamo.scan({ TableName: "http-crud-test" }).promise();
        break;
        case "PUT /items":
        let requestJSON = JSON.parse(event.body);
        await dynamo
          .put({
            TableName: "http-crud-test",
            Item: {
              id: requestJSON.id,
              price: requestJSON.price,
              name: requestJSON.name
            }
          }).promise();
          body = "Put item ${requestJSON.id}";
                  break;
      default:
        throw new Error(Unsupported route: "${event.routeKey}");
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers
  };
};

 여기서 전체 코드에는 「 body = "Put item ${requestJSON.id}";」와  「 throw new Error(Unsupported route: "${event.routeKey}");」는「"」로 적혀있지만「`」로 수정해주면 됩니다.  

HTTP API 만들기

API Gateway로 들어가서 HTTP API 구축을 눌러줍니다.

API 이름은 http-crud-api이라고 입력을하고, 나머지는 디폴트 값으로 생성을 합니다.

그리고 라우트로 들어오는 API 요청을 백엔드 리소스로 보낼려면 경로를 생성 해야합니다.

  • GET /items/{id}
  • GET /items
  • PUT /items
  • DELETE /items/{id}

다음과 같이 생성 해주면 됩니다.

그런 다음 통합을 눌러서 lambda와 API Gateway를 연결합니다.

통합 생성 및 연결을 눌러 줍니다.

통합 대상은 람다 함수를 선택해주고, 통합 대상은 좀 전에 만든 람다 함수를 선택하고 생성 버튼을 눌러 줍니다.

그 외 나머지 경로들도 람다 함수와 연결 하면 됩니다.

Cloud9 환경 구축

이어서, CURD API를 테스트 하기 위해서 Cloud9 환경을 구축합니다.

Cloud9은

AWS Cloud9는 통합 개발 환경 또는 IDE입니다. AWS Cloud9 IDE는 여러 프로그래밍 언어와 런타임 디버거, 내장 터미널을 지원하는 풍부한 코드 편집 경험을 제공합니다. 여기에는 소프트웨어를 코딩, 빌드, 실행, 테스트 및 디버그하는 데 사용하는 도구 모음이 포함되어 있으며 소프트웨어를 클라우드에 릴리스하는 데 도움이됩니다. 웹 브라우저를 통해 AWS Cloud9 IDE에 액세스합니다. 원하는대로 IDE를 구성 할 수 있습니다. 색상 테마를 전환하고, 바로 가기 키를 바인딩하고, 프로그래밍 언어 별 구문 색상 및 코드 서식을 활성화하는 등의 작업을 수행 할 수 있습니다.

즉 cloud9에서 여러 프로그래밍 언어를 사용할 수 있기 때문에, ec2가 아닌, cloud9 환경을 구축합니다.

Create environment버튼을 누르고, 이름을 입력해준 다음, 나머지는 디폴트 값으로 cloud9을 생성해주면 됩니다.

CURD API 테스트

테스트에 앞서, API Gateway의 URL을 복사합니다.

Cloud9에서 New Terminal을 눌러서 터미널을 실행시킵니다.

export INVOKE_URL="API Gateway의 URL"

해당 명령어로 URL을 호출 합니다.

curl -X "PUT" -H "Content-Type: application/json" -d "{
\"id\": \"crud-test\",
\"price\": 12345,
\"name\": \"myitem\"
}" $INVOKE_URL/items

crud-test라는 아이디로 아이템을 넣습니다.

curl -s $INVOKE_URL/items | js-beautify

전체 항목을 검색합니다.

curl -s $INVOKE_URL/items/crud-test | js-beautify

아이디 값으로 항목을 검색합니다.

curl -X "DELETE" $INVOKE_URL/items/crud-test

항목을 삭제합니다.

다시 검색해보면 항목이 비어있는 것을 볼 수 있습니다.