AWS Lambda를 이용한 서버리스 컴퓨팅 시작하기

학습내용


1. 서버리스 컴퓨팅과 AWS Lambda

1.1 콘솔로 AWS Lambda 함수 만들기

1.2 Eclipse 용 AWS Toolkit 설정

  1. 다음 링크를 클릭하여, Eclipse 용 AWS Toolkit 설정 작업을 수행합니다.

  2. AWS 자격 증명 설정을 아래 절차에 따라 진행해 주세요

    1. AWS Identity and Access Management 콘솔에 로그인합니다.
    2. Users(사용자) > Add user(사용자 추가)를 선택합니다.
    3. 사용자 이름에 MyUser와 같은 사용자 이름을 입력합니다.
    4. Programmatic access(프로그래밍 방식 액세스)AWS Management 콘솔 access(액세스)를 선택합니다.
    5. 콘솔 비밀번호를 설정 한 다음에 다음:권한 버튼 클릭
    6. [권한 설정 (Set permissions)] 페이지에서 [기존 정책 직접 연결 (Attach existing policies directly)]를 선택합니다.
    7. AdministratorAccess의 체크박스를 체크한 다음, 다음:태그 버튼 클릭
    8. 다음 페이지에서, 다음:검토 선택후, [검토 (Review)] 페이지에서 [사용자 만들기]를 선택합니다.
    9. IAM 사용자가 생성되고 Access key ID(액세스 키 ID)가 표시됩니다. 예를 들면 다음과 같습니다.
      • AKIAIOSFODNN7EXAMPLE
      • Secret access key(보안 액세스 키)를 표시하려면 Show(표시)를 선택합니다. 예를 들면 다음과 같습니다.
        • wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
    10. 키 페어 파일을 다운로드하려면 [Download .csv file]을 선택합니다. 키를 안전한 위치에 저장합니다.
  3. 다음 링크를 클릭하여 AWS Toolkit for Eclipse에 AWS 액세스 키를 추가합니다.

1.3 Eclipse 용 AWS Toolkit을 이용하여 AWS Lambda 만들기


2. Amazon Simple Notification Service

2.1 Amazon SNS를 이용하여 이메일을 보내는 Lambda 함수 [실습]

  1. AWS Lambda Java 프로젝트를 Eclipse용 AWS Toolkit을 이용하여 생성한다.
  2. Finish 버튼을 클릭합니다.
  3. Eclipse 프로젝트 탐색기를 사용하여 SNSLambda 프로젝트에서 SNSTest.java를 엽니다.
  4. *handleRequest 함수의 내용을 다음 코드로 바꿉니다.

    final String AccessKey="chage-to-your-AccessKey";
    final String SecretKey="chage-to-your-SecretKey";
    final String topicArn="chage-to-your-topicArn";
        @Override
        public String handleRequest(Object input, Context context) {
            context.getLogger().log("Input: " + input);
    
            final String AccessKey="chage-to-your-accesskey";
            final String SecretKey="change-to-your-secretkey";
            final String topicArn="change-to-your-topicArn"; // 이전 단계에서 생성한 SNS 주제에 대한 Arn을 지정
    
            BasicAWSCredentials awsCreds = new BasicAWSCredentials(AccessKey, SecretKey);  
            AmazonSNS sns = AmazonSNSClientBuilder.standard()
                        .withRegion(Regions.AP_NORTHEAST_2)
                        .withCredentials( new AWSStaticCredentialsProvider(awsCreds) )
                        .build();
    
            String msg = "If you receive this message, publishing a message to an Amazon SNS topic works.";
            String subject = ""+input;
            PublishRequest publishRequest = new PublishRequest(topicArn, msg, subject);
            PublishResult publishResponse = sns.publish(publishRequest);
    
            // TODO: implement your handler
            return "SNS completed from Lambda!";
        }
    
  5. Lambda에 함수를 업로드하려면, Eclipse 코드 창에서 마우스 오른쪽 버튼을 클릭하고 [AWS Lambda][Upload function to AWS Lambda]를 차례대로 선택합니다.

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

  7. 새 Lambda 함수 생성을 선택하고 함수 이름(예: SNSFunction)을 입력합니다.

  8. [Next]를 선택합니다.

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

  10. Lambda 함수에 대해 새로운 Amazon S3 버킷을 생성하고 싶은 경우에는 함수 구성 페이지로 이동하여 함수 코드에 대한 S3 버킷 섹션에서 생성을 선택합니다. 버킷 생성 대화 상자에 버킷 이름을 입력합니다.

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

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

  13. 입력 상자에서 SNS Test와 같이 유효한 JSON 문자열을 입력합니다.

  14. Invoke를 선택하여 Lambda 함수에 입력 데이터를 전송합니다.

  15. SNS 주제에 구독중인 이메일로 메시지가 도착했는지 확인한다.


3. AWS Lambda를 이용한 IoT 백엔드 구축 실습

사전준비

단계1: 이메일을 위한 SNS 주제 설정

  1. Amazon SNS 시작하기 실습에서 진행한 방식대로 이메일을 위한 SNS 주제를 생성한다.

  2. 생성한 주제에 대한 구독을 생성합니다.

단계2: Lambda 함수 정의

  1. AWS Lambda 프로젝트를 Eclipse용 AWS Toolkit을 이용하여 생성한다.
  2. Finish 버튼을 클릭합니다.
  3. Eclipse 프로젝트 탐색기를 사용하여 MonitoringLambda 프로젝트에서 pom.xml를 엽니다.
  4. <dependencies> 태그 안에 gson에 대한 의존성을 추가합니다.

      <dependencies>
        ...    
        <dependency>
          <groupId>com.google.code.gson</groupId>
          <artifactId>gson</artifactId>
          <version>2.8.0</version>
        </dependency>
    
      </dependencies>
  5. Eclipse 프로젝트 탐색기를 사용하여 MonitoringLambda 프로젝트에서 Monitoring.java를 엽니다.

  6. *handleRequest 함수의 내용을 다음 코드로 바꿉니다.

    final String AccessKey="chage-to-your-AccessKey";
    final String SecretKey="chage-to-your-SecretKey";
    final String topicArn="chage-to-your-topicArn";
    @Override
    public String handleRequest(Object input, Context context) {
        context.getLogger().log("Input: " + input);
        String json = ""+input;
        JsonParser parser = new JsonParser();
        JsonElement element = parser.parse(json);
        JsonElement state = element.getAsJsonObject().get("state");
        JsonElement reported = state.getAsJsonObject().get("reported");
        String temperature = reported.getAsJsonObject().get("temperature").getAsString();
        double temp = Double.valueOf(temperature);
    
        final String AccessKey="chage-to-your-AccessKey";
        final String SecretKey="chage-to-your-SecretKey";
        final String topicArn="chage-to-your-topicArn";
    
        BasicAWSCredentials awsCreds = new BasicAWSCredentials(AccessKey, SecretKey);  
        AmazonSNS sns = AmazonSNSClientBuilder.standard()
                    .withRegion(Regions.AP_NORTHEAST_2)
                    .withCredentials( new AWSStaticCredentialsProvider(awsCreds) )
                    .build();
    
        final String msg = "*Temperature Critical*\n" + "Your device temperature is " + temp + "C";
        final String subject = "Critical Warning";
        if (temp >= 26.0) {
            PublishRequest publishRequest = new PublishRequest(topicArn, msg, subject);
            PublishResult publishResponse = sns.publish(publishRequest);
        }
    
        return subject+ "temperature = " + temperature + "!";
    }
  7. Lambda에 함수를 업로드하려면, Eclipse 코드 창에서 마우스 오른쪽 버튼을 클릭하고 [AWS Lambda][Upload function to AWS Lambda]를 차례대로 선택합니다.

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

  9. 새 Lambda 함수 생성을 선택하고 함수 이름(예: MonitoringFunction)을 입력합니다.

  10. [Next]를 선택합니다.

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

  12. Lambda 함수에 대해 새로운 Amazon S3 버킷을 생성하고 싶은 경우에는 함수 구성 페이지로 이동하여 함수 코드에 대한 S3 버킷 섹션에서 생성을 선택합니다. 버킷 생성 대화 상자에 버킷 이름을 입력합니다.

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

단계3: Lambda 함수 테스트

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

  1. Eclipse 코드 창에서 마우스 오른쪽 버튼을 클릭하고 AWS Lambda를 선택한 후, Run Function on AWS Lambda를 선택합니다.
  2. 입력 상자에서 다음과 같은 JSON 문자열을 입력합니다.

    {
        "state": {
            "reported": {
                "temperature": "27.0", "LED":"OFF"
            }
        }
    }
  3. Invoke 버튼을 선택하여 Console 창에 다음과 같은 메시지가 출력되는 지 확인하고, SNS 주제에 구독한 이메일로 메시지가 수신되었는지를 확인한다.

    ...
    ================== FUNCTION OUTPUT ===================
    "Critical Warning temperature = 27.0!"
    ================== FUNCTION LOG OUTPUT ===============
    ...

단계4: IoT 규칙 설정

  1. AWS IoT 콘솔로 이동하여 탐색 창에서 메시지 라우팅 > 규칙을 선택합니다.
  2. 규칙 생성을 클릭하여 AWS IoT 규칙을 생성합니다.
  3. 규칙 생성 페이지에서 규칙 이름(tempWarningRule)을 입력하고, 다음 버튼을 클릭합니다.
  4. SQL 문 구성 페이지에서 'SQL 문'란에 다음 쿼리를 입력하고, 다음 버튼을 클릭합니다.

    SELECT * FROM '$aws/things/MyMKRWiFi1010/shadow/update/accepted'
  5. [규칙 작업 연결] 페이지의 [규칙 작업]항목에서 작업 선택아래에서 Lambda를 선택한 다음, Lambda 함수에서 (MonitoringFunction)를 선택합니다.

  6. 규칙 작업 추가를 선택합니다.

단계4: 테스트

  1. AWS_IoT_DHT11을 다운로드하여 Arduino IDE에서 실행한다.
  2. arduino_secrets.h에서 다음 항목을 사용 환경에 맞도록 수정후, 빌드/업로드 한다.
  3. 아두이노 IDE의 시리얼 모니터를 열고, 접속이 제대로 이루어지는 지 확인해 본다.
  4. DHT-11 센서의 측정값이 26도를 초과하는 경우에 이메일이 수신되는 지 확인한다.