APIGateway

1. 디바이스 목록 조회 REST API 구축하기

다음과 같은 API 요청과 API 응답을 가지는 REST API를 Lambda 함수와 API Gateway를 이용하여 구축해본다.

단계1: AWS Toolkit을 통해 Lambda 함수 생성

  1. 다음 정보를 바탕으로 AWS Lambda 프로젝트를 JetBrains용 AWS Toolkit을 이용하여 생성한다.
    • Project name: ListingDeviceLambda
    • Rumtime:java11 - SDK: 11버전의 SDK를 선택하거나 없으면 다운로드한 후 선택
  2. 생성된 ListingDeviceLambdabuild.gradle 파일을 열고, 다음 의존성을 추가하고, 변경사항을 반영합니다.

     dependencies {
         ...
        implementation platform('com.amazonaws:aws-java-sdk-bom:1.12.529')
        implementation 'com.amazonaws:aws-java-sdk-iot'
        ...
    }
    
  3. src/main/java/helloworld/App.java 파일을 다음 코드로 바꿉니다.

     package helloworld;
     import java.util.List;
     import com.amazonaws.services.iot.AWSIot;
     import com.amazonaws.services.iot.AWSIotClientBuilder;
     import com.amazonaws.services.iot.model.ListThingsRequest;
     import com.amazonaws.services.iot.model.ListThingsResult;
     import com.amazonaws.services.iot.model.ThingAttribute;
     import com.amazonaws.services.lambda.runtime.Context;
     import com.amazonaws.services.lambda.runtime.RequestHandler;
    	
     public class App implements RequestHandler<Object, String> {
    	
         @Override
         public String handleRequest(Object input, Context context) {
    	
             // AWSIot 객체를 얻는다.
             AWSIot iot = AWSIotClientBuilder.standard().build();
    	
             // ListThingsRequest 객체 설정.
             ListThingsRequest listThingsRequest = new ListThingsRequest();
    	
             // listThings 메소드 호출하여 결과 얻음.
             ListThingsResult result = iot.listThings(listThingsRequest);
    	
             return getResultStr(result);
         }
    	
    	
         /**
          * ListThingsResult 객체인 result로 부터 ThingName과 ThingArn을 얻어서 Json문자 형식의
          * 응답모델을 만들어 반환한다.
          * {
          * 	"things": [
          *	     {
          *			"thingName": "string",
          *	      	"thingArn": "string"
          *	     },
          *		 ...
          *	   ]
          * }
          */
         private String getResultStr(ListThingsResult result) {
             List<ThingAttribute> things = result.getThings();
    	
             String resultString = "{ \"things\": [";
             for (int i =0; i<things.size(); i++) {
                 if (i!=0)
                     resultString +=",";
                 resultString += String.format("{\"thingName\":\"%s\", \"thingArn\":\"%s\"}",
                         things.get(i).getThingName(),
                         things.get(i).getThingArn());
    	
             }
             resultString += "]}";
             return resultString;
         }
    	
     }
    
  4. src/test/java/helloworld/AppTest.java 파일의 코드를 주석처리하여 컴파일 오류를 제거시킨다.

단계2: Lambda 함수의 로컬 테스트

작성된 Lambda함수가 정상적으로 동작하는 지를 테스트해 보기 위해서 다음 절차를 수행합니다.

  1. IntelliJ IDEA IDE의 화면 상단 타이틀 바에서 “[Local] HelloWorldFunction” 옆의 연두색 실행 버튼 (삼각형)을 클릭

  2. [Edit Configuration] 다이얼로그 화면에서 Text – Event Templates – 부분의 드롭다운 메뉴 중에서 API Gateway AWS Proxy를 선택

  1. Console 창에 다음과 같은 형식의 메시지가 마지막에 출력되는 지 확인합니다. (본인의 aws 계정에 생성된 사물 목록이 Json 형식으로 반환됨)

    ...	
    "{ \"things\": [{\"thingName\":\"MyMKRWiFi1010\", \"thingArn\":\"arn:aws:iot:ap-northeast-2:884579964612:thing/MyMKRWiFi1010\"}]}"
       
    

    단계3: Lambda 함수의 배포

단계5 API Gateway 콘솔에서 REST API 생성

  1. API Gateway 콘솔로 이동합니다.
  2. API 생성을 선택합니다.
  3. API 유형 선택에서 REST API구축를 클릭합니다.
  4. REST API 생성에서 새 API를 선택합니다.
  5. 이름 및 설명 설정에서 다음과 같이 합니다.
    • API 이름my-device-api를 입력합니다.
    • 필요한 경우 설명 필드에 설명을 입력합니다. 설명을 입력하지 않으려면 비워 둡니다.
    • 엔드포인트 유형 설정을 지역으로 그대로 둡니다.
  6. API 생성(Create API)을 선택합니다.
  7. 리소스 아래에 / 이외에는 아무 것도 보이지 않을 것입니다. 이는 API의 기본 경로 URL에 해당하는 루트 수준 리소스입니다.
  8. 리소스 아래에서 /를 선택한 후, 리소스 생성을 클릭합니다.
  9. 리소스 이름에 devices를 입력합니다.
  10. 리소스 생성을 선택합니다.
  11. 메서드 섹션에서 메소드 생성을 클릭합니다.
  12. 메서드 유형 드롭다운 메뉴에서 GET을 선택합니다.
  13. 통합 유형에서 Lambda 함수를 선택합니다.
  14. Lambda 함수에서 Lambda 함수를 생성한 리전을 선택한 후 드롭다운 메뉴에서 ListingDeviceLambda-HelloWorldFunction을 선택합니다. 메서드 생성을 클릭합니다.
  15. 테스트를 클릭하고, 아무 입력 없이 테스트버튼을 클릭하여 다음과 같은 결과가 나오는 지 확인합니다.

    /devices - GET 메서드 테스트 결과
    요청
    /devices
    지연 시간
    6399
    상태
    200
    응답 본문
    {"statusCode":200,"headers":{"X-Custom-Header":"application/json","Content-Type":"application/json"},"body":"{ \"things\": [{\"thingName\":\"MyMKRWiFi1010\", \"thingArn\":\"arn:aws:iot:ap-northeast-2:884579964612:thing/MyMKRWiFi1010\"}]}"}
    응답 헤더
    {
      "Content-Type": "application/json",
      "X-Amzn-Trace-Id": "Root=1-653e463c-0518263d2fe5ca0ab5d5bf9b;Sampled=0;lineage=ff092584:0"
    }
    ...
    

단계6: CORS 활성환 및 API Gateway 콘솔에서 REST API 배포

JavaScript는 Cross-Origin Resource Sharing (CORS) 요청을 기본적으로 제한합니다. 즉, JavaScript 코드가 동일 서버 내의 리소스를 접근하는 것은 허용하지만, 다른 서버의 리소스를 사용하고자 하는 경우에는 CORS 헤더 정보가 포함되어 있어야 합니다.

REST API 리소스에 대해 CORS 지원 활성화

  1. 리소스에서 /devices를 선택하고, CORS 활성화를 클릭합니다.
  2. 게이트웨이 응답과 Access-Control-Allow-Methods의 모든 체크박스를 선택합니다.
  3. 저장를 선택합니다.

2단계를 완료하면 API를 생성했지만 아직 실제로 사용할 수는 없습니다. 배포해야 하기 때문입니다.

  1. 베포 버튼을 클릭합니다.
  2. 배포 스테이지 드롭다운 메뉴에서 [새 스테이지]를 선택합니다.
  3. 스테이지 이름prod를 입력합니다.
  4. 배포을 선택합니다.

단계7: REST API 테스트

  1. prod 스테이지 편집기의 맨 위에 있는 호출 URL을 적어 둡니다.
  2. 웹 브라우저 주소창에 “호출 URL/devices”을 입력한 후 엔터를 쳐 봅니다.
    • 이번 REST API는 GET 메소드만을 이용한 것이므로, 웹 브라우저에서도 테스트가 가능하지만, 일반적으로 API 테스트는 cURL 또는 POSTMAN 등의 도구를 사용합니다
  3. 2.1절에서 정의한 응답모델과 동일한 형식의 JSon 문자열이 반환된 것을 확인할 수 있습니다.

단계8: REST API 활용한 JavaScript 기반 웹 프로그래밍