• 投稿日
  • SORACOM LTE-M Button powered by AWS を用いた開発 TIPS

    ボタン大好き、ソラコム松下(Max)です。

    11/1 に出荷開始となりました SORACOM LTE-M Button powered by AWS (以下、SORACOM LTE-M Button) ですが、皆様のお手元に続々と到着しているようで喜ばしい気持ちと共に若干ホッとしております。

    今回は 11/3 に大阪で開催された「JAWS FESTA 2018 OSAKA」で紹介しました「SORACOM LTE-M Button の開発 TIPS」をご紹介します。

    SORACOM LTE-M ボタンそのものや、AWS IoT 1-Click、AWS Lambda を知るには

    SORACOM LTE-M Button そのものや、AWS IoT 1-Click、AWS Lambda を知りたい方は 「SORACOM LTE-M Button powered by AWS でできる事や環境の準備まとめ」 をお読みください。

    ともかく最小限の Lambda 関数

    以下のコードでボタンからの event を CloudWatch Logs に記録することができます。
    (CloudWatch Logs へのログ出力ポリシーを割り当ててください)

    import json
    import logging
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    def lambda_handler(event, context):
        logger.info('Received event: ' + json.dumps(event))
        return {'statusCode': 200}
    

    CloudWatch Log の Lambda 関数のログへ以下のように出力されます。

    button-dev-tips / minimum

    その他のサンプルコード

    GitHub 上で公開しています
    functions ディレクトリの中に Slack、LINE、IFTTT の他、 AWS IoT Core や SORACOM のデータ収集・蓄積サービス SORACOM Harvest との連携も含まれています。

    SORACOM LTE-M Button の実機が無くても Lambda 関数を開発したい

    実機が無くても Lambda 関数を開発することは可能です。
    SORACOM LTE-M Button は AWS IoT 1-Click 対応デバイスであり、Lambda 関数に引き渡されるオブジェクトは AWS IoT 1-Click コールバックイベント に準拠しています。

    このオブジェクト(JSON)を Lambda 関数開発画面の「テストイベント」に設定すれば、ボタンの実機が無くても Lambda 関数の開発を進めることが可能です。

    button-dev-tips / stub

    特に活用したいデータ

    Lambda 関数に引き渡されるデータ中で、特に有用で活用したいデータは以下の通りです。

    • .deviceInfo.deviceId (String)
      • デバイスに割り当てられている一意な番号。 DSN (Device Serial Number) と呼ばれる
    • .deviceInfo.remainingLife (Float)
      • “(1 -Push回数/1500”) もしくは “(1 – 利用開始からの日数/365)” のいづれか小さい数
      • 電池残量とは異なります。電池残量を知りたい場合は後述
    • .deviceEvent.buttonClicked.clickType (String)
      • ボタンのアクション内容
      • 1回 = SINGLE 、 2回 = DOUBLE 、 長押し = LONG
      • 長押しは 1.2 秒以上で判定されます
    • .placementInfo.attributes (Hash->value:String)
      • AWS IoT 1-Click 上で設定できる「プレイスメント」に割り当てられた Key-Value (「テンプレート」と「プレイスメント」で解説します)

    .deviceInfo.deviceId (= DSN; Device Serial Number) について

    DSN は SORACOM LTE-M Button だけでなく AWS IoT エンタープライズボタンを含めた AWS IoT 1-Click 全体で一意になるようになっています。
    この特性を利用してビジネス上の ID として扱っても良いのですが、DSNにどっぷり依存した仕組みを構築してしまうと、ボタン故障などで交換した際に ID が変わってしまう事になります。例えば集計単位が変わってしまうといった形です。

    そのため、ビジネス上での識別子として DSN をそのまま利用するよりも、DSN とビジネス上の識別子をマップする仕組みを挟むことをお勧めします。
    方法としては DynamoDB 等の KVS を利用する方法の他、もっと手軽に行いたい場合は後述する「プレイスメント」上の属性として設定する方法があります。

    電池残量など、AWS IoT 1-Click では得られないデータを取得する

    SORACOM 上に SORACOM LTE-M Button を登録すると、使い始めの日付、電池残量、残りのクリック回数など、運用に必要な詳細な情報を見ることができるようになります。

    どのような情報が見られるかは SORACOM ガジェット管理で確認できること をご覧ください。

    登録方法

    SORACOM LTE-M Button を SORACOM に登録するには SORACOM ユーザーコンソール から ガジェット管理Buttons と進みます。

    button-dev-tips / registration

    「テンプレート」と「プレイスメント」

    AWS IoT 1-Click は「プロジェクト > テンプレート > プレイスメント」という階層構造になっています。

    独特の概念が「テンプレート」と「プレイスメント」です。
    テンプレートは「Lambda 関数 と AWS IoT 1-CLick 結びつける、Lambda 関数寄りの設定」、プレイスメントは「デバイスと AWS IoT 1-Click を結びつける、デバイス寄りの設定」と考えれば良いでしょう。

    button-dev-tips / placement and template

    プレイスメントにはデバイスに紐づく属性を Key-Value で値が設定できます。
    これはデバイスに対して仮想的な管理タグを設定できるようなもので、 Lambda 関数の event.placementInfo.attributes に Hash として設定されます。

    button-dev-tips / placement attr

    上記のようにプレイスメントの属性を設定した場合、 Lambda 関数に引き渡される event の中の placementInfo.attributes は以下のようになります。(一部省略)

    ...
    "placementInfo": {
        "attributes": {
            "Deployed": "RESTROOM",
            "DeviceID": "A001",
            "Manager": "John"
        }
    }
    ...
    

    ちなみに Key-Value 共に日本語も UTF-8 で入れることができます。(エンコード識別は Lambda 関数側の実装依存によるので気を付けてください)

    また、ボタンが多くなってきた際、いちいちすべてに設定するのが難しい場合を想定して、テンプレートに共通設定を仕込んでおくことも可能です。
    (オブジェクト指向プログラミング的に言えば、テンプレートをスーパークラスとしてプレイスメントをサブクラスとして扱うことができます。ですが、あくまでも実装(Lambda 関数)はスーパークラス側のみで、オーバーライドできるのはメンバ変数ということになります)

    テンプレート作成時の「SMS 送信」や「Email 送信」

    テンプレート作成時の「SMS 送信」や「Email 送信」は、それぞれ Amazon SNS や Amazon SES を利用する Lambda 関数を自動生成して、その生成された Lambda 関数をテンプレートに割り当てる仕組みです。
    また IAM ロールやポリシーも自動生成されますので、どういったロールが必要なのか等を確認するのに便利です。一方、作れば作っただけ自動生成されますので、めちゃくちゃ多くなることもあり得ますから、定期的なお掃除はお忘れなく。

    SMS は Amazon SNS を使います

    Amazon SNS から日本の携帯へ SMS を送り続けると、携帯電話キャリア側から遮断されることがあります。
    Amazon SNS の管理コンソール上から失敗したという事実はわかりますが、失敗の原因は正直分かりませんので、本当にお試し程度にしておいた方よろしいでしょう。

    Email は Amazon SES を使います

    Amazon SES でメールを送る際、一般的には事前にメールアドレスの Verify が必要になります。そのまま送ってもほぼ間違いなく送信エラーとなりますのでご注意ください。
    具体的には SES 管理画面上から対象のアドレスに対してVerify メールを送信し、送信先で Verify 用の URL を踏む必要があります。手順は Amazon SES でメールを送ってみた / Qiita をご覧ください。

    また、自動生成される Lambda 関数や Amazon SES の設定は共に us-west-2 (Oregon) になります。

    「プロジェクトが見当たらなくなってしまった!」

    AWS IoT 1-Click はほかのサービスと同様に、基本的にはリージョン毎に管理されています。ですが、デバイスの一覧表示だけはリージョンをまたいだ表示になるようです。(2018年11月現在)

    そのため、デバイスの詳細を開くと、そのデバイスが登録されているリージョンへ飛んでしまうため、例えばデバイスは us-west-2 登録されているが、プロジェクト(やテンプレート、プレイスメント)は ap-northeast-1 に作成すると、画面を進めている過程で「あれ?プロジェクトが無くなっちゃった?」という事に遭遇します。

    このような時は慌てず、リージョンを確認してください。
    ※デバイスの登録先リージョンは決めることができません。(2018年11月現在)

    デバイスは us-west-2 だけどプロジェクトや Lambda 関数を ap-northeast-1 で作り紐づけることは可能ですが、当面はデバイスと同じリージョンに作るのが安心かもしれません。

    button-dev-tips / where-is-my-prj

    「これは…なんのボタン?」

    非常に便利なボタンですが、数多く持ち始めると「これは…なんのボタン?」という問題が発生します。
    これについては「必殺、付箋の術」となるわけですが、せっかく貼ったのであれば「プレイスメント」にも同様にラベルを設定すると、物理と管理上の情報が一体になるのでお勧めです。

    button-dev-tips / many

    おわりに

    今回紹介しました内容は Slideshare にもアップしてありますので、ご覧ください。

    ソラコム 松下(Max)