SORACOM Air 이벤트 핸들러와 AWS Lambda를 함께 사용해 보세요.

7151 단어 SORACOM

소개



SORACOM 릴리스 기념 릴레이 블로그 의 10/8 분입니다!

SORACOM Beam 의 tcp to https 네타를 준비하고 있으면, 앞을 넘어 버렸다. (업계 용어로 말하면 "메소된") 때문에, 급거별의 네타입니다.

이벤트 핸들러란?



SORACOM Air에는 이벤트 핸들러라는 기능이 있습니다.

이벤트 핸들러는 SIM의 통신 용량을 트리거로
  • 이메일 알림
  • 속도 클래스 변경
  • AWS Lambda 함수 실행

  • 할 일입니다.

    위 2개는 「감시」기능에서도 사용되고 있습니다만, 3번째의 Lambda 펑션의 실행을 사용하면 여러가지 일이 생길 것 같아서, 시험해 보았습니다.

    AWS Lambda 함수를 모르는 분들에게 설명하면 JavaScript 및 Java 코드를 이벤트 중심으로 시작하기 위한 AWS 서비스가 됩니다.

    ※자세한 정보는 이벤트 핸들러 기능 상세을 참조

    예: 사용량이 일정을 초과하면 Slack에 알리기



    통신량 일정한 용량 이상에 도달했을 경우에, Slack의 채널에 노출되는 ^H^H 통지를 실시합니다.

    매개변수



    이벤트 핸들러에서 시작된 Lambda 함수에는 다음과 같이 이벤트 객체가 전달됩니다.
    {
      "imsi":"対象のimsi",
      "parameter1":"上記のparameter1",
      "parameter2":"上記のparameter2",
      "parameter3":"上記のparameter3"
    }
    

    parameter1 에는 Daily/Monthly/Total 의 종별, parameter2 에는 역치의 통신 용량, parameter3 에는 slack 의 web hook path 를 건네주기로 합니다.

    슬랙 설정



    먼저 https://{teamname}.slack.com/services/new/incoming-webhook로 이동하여 Slack의 incoming webhook을 만듭니다.
    이 때 발행되는 Webhook URLhttps://hooks.slack.com/services/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와 같은 형식이므로, parameter3에는/services 이후의/services/T04CJJPJP/B0C37JEH0/GsKRwBf5dWZcCUwca7Bk0Iw9을 전달합니다.

    AWS 측 설정



    Lambda Function 만들기



    Lambda의 Function을 만들고 HTTP를 요청하는 프로그램을 만듭니다.

  • Function 신규 작성 화면 엽니다
  • Configure function에 다음 예제와 같이 입력
  • 이름 : 선택 사항 (예 : lambda2slack)
  • Description: 선택
  • Runtime: Node.js

  • Lambda function code에 아래 코드를 붙여 넣으십시오
  • // Generated by CoffeeScript 1.10.0
    var https, slack;
    
    https = require('https');
    
    slack = {
      channel: "#general",
      username: "SORACOM",
      emoji: ":signal_strength:"
    };
    
    exports.handler = function(event, context) {
      var options, payload, req;
      options = {
        method: 'POST',
        hostname: 'hooks.slack.com',
        port: 443,
        path: event.parameter3
      };
      payload = {
        channel: slack.channel,
        username: slack.username,
        icon_emoji: slack.emoji,
        text: event.parameter1 + " traffic of your SIM (IMSI: " + event.imsi + ") exceeded " + event.parameter2 + "."
      };
      req = https.request(options, function(res) {
        res.setEncoding('utf8');
        return res.on('data', function(d) {
          console.log(d);
          context.succeed(d);
        });
      });
      req.on('error', function(e) {
        context.fail(e.message);
      });
      req.write(JSON.stringify(payload));
      req.end();
    };
    
    return;
    
    
  • Role은 드롭 다운에서 Create New Role 아래의 *Basic Exection Role을 선택하십시오.
    (새 탭이 열리지만 팝업 창이 차단 될 수 있으므로 허용하십시오)
  • 특별히 변경하지 않고 허용을 누르면 Role에 lambda_basic_exection이 선택됩니다
  • Next를 눌러 다음 화면에서 Create Function을 선택하면 Function 생성이 완료됩니다
  • Test 버튼을 눌러 Function을 테스트할 수 있습니다. 예로서 다음과 같은 파라미터를 지정해 주세요
  • {
      "imsi": "12345",
      "parameter1": "Daily",
      "parameter2": "1GB",
      "parameter3": "/services/.../..."
    }
    
  • Execution result: succeeded가 되고 ok가 표시되면 Lambda 설정이 완료됩니다.
    Slack에 Daily traffic of your SIM (IMSI: 12345) exceeded 1GB.와 같은 메시지가 게시되었는지 확인하십시오.

  • <테스트 실행 이미지>
    lambda2slack

    SORACOM 측 설정



    설정 내용을 JSON으로 작성하고 soracom event_handler create에 전달합니다 (매개 변수를 적절하게 읽으십시오).
    $ cat req.json
    {
        "targetOperatorId": "OP0000000000",
        "name": "1日1GBでslackに通知",
        "description": "1日1GB利用時",
        "ruleConfig": {
            "type": "DailyTrafficRule",
            "properties": {
                "inactiveTimeoutDateConst": "BEGINNING_OF_NEXT_DAY",
                "limitTotalTrafficMegaByte": 1000
            }
        },
        "actionConfigList": [
            {
              "properties": {
                "accessKey": "AWSアクセスキー",
                "secretAccessKey": "AWSシークレットキー",
                "endpoint": "https://lambda.ap-northeast-1.amazonaws.com",
                "functionName": "lambda2slack",
                "executionDateTimeConst": "IMMEDIATELY",
                "parameter1": "Daily",
                "parameter2": "1GB",
                "parameter3": "/services/T04CJJPJP/B0C37JEH0/GsKRwBf5dWZcCUwca7Bk0Iw9"
              },
              "type": "InvokeAWSLambdaAction"
            }
        ]
    }
    $ soracom event_handler create --req "$(cat req.json)"
    {
      "result": "success"
    }
    

    잠시 기다리면 슬랙에 게시되었습니다 (실험을 위해 임계 값을 1MB로 설정).
    slack

    결론



    Lambda 에서 SORACOM API client for Node.js 를 사용하는 것으로, 예를 들면 일정 이상 통신했을 때에 휴지하고 다음 달이 되면 해약, 라고 하는 처리를 넣는 것으로, 약간의 선불 SIM의 구조를 만들 수 있을 것 같네요.

    좋은 웹페이지 즐겨찾기