3.2 디바이스 상태 조회 REST API 구축하기

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

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

  1. 다음 정보를 바탕으로 AWS Lambda 프로젝트를 Eclipse용 AWS Toolkit을 이용하여 생성한다.
  2. 생성된 GetDeviceLambdaJavaProjectpom.xml 파일을 열고, <dependencies> 태그 안에 aws-java-sdk-iot에 대한 의존성을 추가한 후에, 파일을 저장합니다.

      <dependencies>
        ...    
        <dependency>
          <groupId>com.amazonaws</groupId>
          <artifactId>aws-java-sdk-iot</artifactId>
        </dependency>
    
      </dependencies>
  3. Eclipse 프로젝트 탐색기를 사용하여 GetDeviceLambdaJavaProject 프로젝트에서 GetDeviceHandler.java를 열고, 다음 코드로 바꿉니다.

    import com.amazonaws.services.iotdata.AWSIotData;
    import com.amazonaws.services.iotdata.AWSIotDataClientBuilder;
    import com.amazonaws.services.iotdata.model.GetThingShadowRequest;
    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    
    public class GetDeviceHandler implements RequestHandler<Event, String> {
    
        @Override
        public String handleRequest(Event event, Context context) {
            AWSIotData iotData = AWSIotDataClientBuilder.standard().build();
    
            GetThingShadowRequest getThingShadowRequest  = 
            new GetThingShadowRequest()
                .withThingName(event.device);
    
            iotData.getThingShadow(getThingShadowRequest);
    
            return new String(iotData.getThingShadow(getThingShadowRequest).getPayload().array());
        }
    }
    
    class Event {
        public String device;
    }
  4. Lambda에 함수를 업로드하려면, Eclipse 코드 창에서 마우스 오른쪽 버튼을 클릭하고 [AWS Lambda][Upload function to AWS Lambda]를 차례대로 선택합니다.

  5. [Select Target Lambda Function] 페이지에서 사용할 AWS 리전을 선택합니다. 이 리전은 Amazon S3 버킷에 대해 선택한 리전과 동일해야 합니다.

  6. 새 Lambda 함수 생성을 선택하고 함수 이름(예: GetDeviceFunction)을 입력한 후, [Next]를 선택합니다.

  7. 함수 구성(Function Configuration 페이지에서 대상 Lambda 함수에 대한 설명을 입력하고 함수에서 사용할 IAM 역할 선택합니다.

  8. Lambda 함수 코드를 저장할 S3 버킷을 선택합니다. 만약 새로운 Amazon S3 버킷을 생성하고 싶은 경우에는 생성 버튼을 클릭하고 버킷 생성 대화 상자에 버킷 이름을 입력합니다.

  9. Finish를 선택하여 Lambda 함수를 AWS에 업로드합니다.

  10. Lambda 함수를 실행하려면, Eclipse 코드 창에서 마우스 오른쪽 버튼을 클릭하고 AWS Lambda를 선택한 후 Run Function on AWS Lambda(AWS Lambda에서 함수 실행)를 선택합니다.

  11. Enter the JSON input for your function이 선택된 상태에서 입력 창에 다음 입력 문자열을 입력한다.

    {
        "device" : "MyMKRWiFi1010"
    }
  12. Invoke 버튼을 클릭한 후, Eclipse Console 창에 다음과 같은 결과가 출력되는 지 확인합니다.

    Skip uploading function code since no local change is found...
    Invoking function...
    ==================== FUNCTION OUTPUT ====================
    "{\"state\":{\"reported\":{\"temperature\":\"24.40\",\"LED\":\"OFF\"}},\"metadata\":{\"reported\":{\"temperature\":{\"timestamp\":1575178091},\"LED\":{\"timestamp\":1575178091}}},\"version\":4450,\"timestamp\":1575206310}"
    ==================== FUNCTION LOG OUTPUT ====================
    START RequestId: 0287aaca-379a-4467-ae0f-fdb0f01ac7cf Version: $LATEST
    END RequestId: 0287aaca-379a-4467-ae0f-fdb0f01ac7cf
    REPORT RequestId: 0287aaca-379a-4467-ae0f-fdb0f01ac7cf  Duration: 7100.97 ms    Billed Duration: 7200 ms    Memory Size: 512 MB Max Memory Used: 139 MB Init Duration: 331.18 ms    

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

  1. API Gateway 콘솔로 이동합니다.
  2. 이전에 생성한 my-device-api를 선택합니다.
  3. 리소스 이름(/devices)을 선택합니다.
  4. 작업 드롭다운 메뉴에서 리소스 생성을 선택합니다.
  5. 리소스 이름device를 입력합니다.
  6. 리소스 경로(Resource Path){device}로 바꿉니다. 이는 클라이언트에서 입력을 가져오는데 사용되는 템플릿 경로 변수로서, 나중에 이 경로 변수를 매핑 템플릿을 사용하여 Lambda 함수 입력에 매핑하는 방법을 보여줍니다.
  7. API Gateway Cors 활성화 옵션을 선택합니다.
  8. 리소스 생성을 클릭합니다.
  9. 새로 생성된 /{device} 리소스가 강조 표시되면 작업에서 메서드 생성(Create Method)을 선택합니다.
  10. 리소스 이름 (/{devices}) 아래에 드롭다운 메뉴가 보일 것입니다. GET을 선택한 후 확인 표시 아이콘(체크)을 선택하여 선택 사항을 저장합니다.
  11. /devices/{device} – GET – 설정 창의 통합 유형에서 Lambda 함수를 선택합니다.
  12. Lambda 프록시 통합 사용 상자를 선택하지 않은 상태로 놔둡니다.
  13. Lambda 리전에서 Lambda 함수를 생성한 리전을 선택합니다.
  14. Lambda 함수 필드에 문자를 입력한 후 드롭다운 메뉴에서 GetDeviceFunction을 선택합니다. 저장을 선택하여 선택 사항을 저장합니다
  15. Lambda 함수에 대한 권한 추가 팝업이 나타나면(Lambda 함수를 호출하기 위해 API Gateway에 권한을 부여하려고 합니다....”), 확인을 선택하여 API Gateway에 해당 권한을 부여합니다.

  16. /{device}의 GET 메서드를 선택하고 통합 요청(Integration Request)을 선택하여 본문 매핑 템플릿을 설정합니다.

  17. 매핑 템플릿(Mapping Templates) 섹션을 확장합니다. 매핑 템플릿 추가(Add mapping template)를 선택합니다. Content-Typeapplication/json을 입력합니다. 확인 표시 아이콘을 선택하여 설정을 저장합니다.

  18. 요청 본문 패스스루(Request body passthrough)에 권장되는 정의된 템플릿이 없는 경우(권장)를 선택합니다.

  19. 템플릿 생성(Generate template)아래 편집기에 다음을 입력합니다.

    {
      "device": "$input.params('device')"
    }
  20. 저장을 선택합니다.

  21. /devices/{device} – GET – 메소드 실행 창으로 이동하여, 클라이언트 부분의 테스트를 클릭합니다.

  22. {device} 경로에 본인이 만든 사물 이름(예, MyMKRWiFi1010)을 입력합니다.

  23. 테스트버튼을 클릭하여 다음과 같은 결과가 나오는 지 확인합니다.

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

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

  1. 리소스에서 /devices를 선택합니다. 그렇게 하면 리소스 상의 모든 메서드에 대해 CORS가 활성화됩니다.
  2. 작업 드롭다운 메뉴에서 CORS 활성화(Enable CORS)를 선택합니다.
  3. CORS 활성화 및 기존의 CORS 헤더 대체를 선택합니다.
  4. 메서드 변경사항 확인 창에서 예, 기존 값을 대체하겠습니다.를 선택합니다.

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

  1. 작업 드롭다운 메뉴에서 Deploy API(API 배포)를 선택합니다.
  2. 배포 스테이지 드롭다운 메뉴에서 prod를 선택합니다.
  3. 배포을 선택합니다.

4단계: REST API 테스트

  1. prod 스테이지 편집기의 맨 위에 있는 호출 URL을 적어 둡니다.
  2. 웹 브라우저 주소창에 호출 URL/devices/MyMKRWiFi1010을 입력한 후 엔터를 쳐 봅니다.

  3. 2.2절에서 정의한 응답모델과 동일한 형식의 JSon 문자열이 반환된 것을 확인할 수 있습니다.

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