クラウドアプリケーションの開発

作業端末にて開発したPythonスクリプト(Lambda関数)をクラウドアプリケーションとしてIoTストアに登録するためには、以下3つのファイルが必要となります。

ファイル一覧

ソースファイルパッケージ(任意)

Lambda関数と、Lambda関数を動かすために必要なパッケージをまとめて圧縮したファイル。

Cloudformationテンプレート(必須)

Lambda関数をクラウドアプリとしてIoTストアへ登録する際に使用するCloudformationテンプレートファイル。

テンプレートパラメータファイル(任意)

利用者がシステムパッケージをインストールする際に、クラウドアプリのCloudformationテンプレートの設定値を指定するために利用するファイル。アラーム設定の閾値など、利用者によって設定したい値が異なるパラメータに対してテンプレートパラメータファイルを用意することで、利用者がそのパラメータの値を自由に指定できるようになる。

ソースファイルパッケージ

クラウドアプリケーションでは、My-IoTデータストアに蓄積されているデータを使用(※)した処理をLambda関数として実装することで、My-IoTクラウド上で様々な処理を実行することができます。
また、My-IoTデータストア以外にもCloudwatch EventなどのAWSのリソースを利用することで、定期実行や、あるデータが登録されたタイミングでの実行など、様々なタイミングで処理を実行することができます。

Lambda関数の具体的な実装例については My-IoT プラットフォーム仕様書 にいくつかの実装パターン例を記載しているので、そちらを参考にしてください。

Lambda関数の開発に関する一般的な詳細については、AWS公式のドキュメントを参照してください。

以下では、Lambda関数の開発の際に、作業端末上で動作確認を行う方法について解説します。

※イントラネット環境などのプロキシサーバーを介する環境ではMy-IoTデータストアとの連携が正常に動作しない可能性がありますので、注意してください。

作業端末でのLambdaソースコード実行手順

作業端末でクラウドアプリケーション(カスタムLambda関数)を開発する際、「python-lambda-local」モジュールを実行することでLambda関数として実装した処理を実行し、実行結果を出力します。

参考リンク:https://github.com/HDE/python-lambda-local

  1. ターミナルにて以下のコマンドを実行し、python-lambda-localをインストールします

    sudo pip install python-lambda-local

    または

    sudo python3 -m pip install python-lambda-local

  2. イベント引数を定義したevent.jsonを作成します

    event.jsonは、関数外部からeventデータを受け取り実行するLambda関数をローカルで疑似的に実行するために利用するものです 。

    記載例

    {
        "key1":"value1",
        "key2":"value2"
    }
    

    ※イベント引数が不要の場合は空オブジェクトを記載します 記載例

    {}
    
  3. ソースファイルlambda_function.pyを作成し、event.jsonと同じディレクトリに保存します

    event.jsonで定義した引数はlambda_handler関数の第一引数eventに格納されます。

    記載例

    import json
    
    def lambda_handler(event, context):
    
        return event['key1']
    
  4. ターミナルにて作成したLambdaソースのディレクトリまで移動し、以下のコマンドを実行して動作確認を行います

    python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json

    実行結果例

    [root - INFO - YYYY-MM-DD hh:mm:ss,000] Event: {'key1': 'value1', 'key2': 'value2'}
    [root - INFO - YYYY-MM-DD hh:mm:ss,000] START RequestId: b37eaaf7-c511-4feb-be24-56673c7e8ec2 Version:
    [root - INFO - YYYY-MM-DD hh:mm:ss,000] END RequestId: b37eaaf7-c511-4feb-be24-56673c7e8ec2
    [root - INFO - YYYY-MM-DD hh:mm:ss,000] REPORT RequestId: b37eaaf7-c511-4feb-be24-56673c7e8ec2  Duration: 2.55 ms
    [root - INFO - YYYY-MM-DD hh:mm:ss,000] RESULT:
    value1
    

「python-lambda-local」を使用できない場合

何らかの理由で「python-lambda-local」をインストールできない場合は、Lambda関数を定義するPythonスクリプトを修正し、Pythonコマンドによってスクリプトを直接実行することでLambda関数として実装した処理を実行し、処理結果をPythonコマンドの実行結果として出力できるようにします。

  1. ソースファイルlambda_function.pyを作成し、末尾に以下の処理を追加します

    これにより、PythonコマンドでLambda関数のソースを実行することでmain関数が実行されるようになります。

    def main():
        event ={"key1":"value1","key2":"value2"}
        context = {}
        return lambda_handler(event, context)
    
    if __name__=='__main__':
        rtn = main()
        # ログ表示用
        print(rtn) 
    
    • 追加後のlambda_function.pyの例

    import json
    
    def lambda_handler(event, context):
    
        return event['key1']
    
    
    #*********************************************
    # 追加
    #
    def main():
        event ={"key1":"value1","key2":"value2"}
        context = {}
        return lambda_handler(event, context)
    
    if __name__=='__main__':
        rtn = main()
        # ログ表示用
        print(rtn) 
    #*********************************************
    
  2. ターミナルにて作成したLambdaソースのディレクトリまで移動し、以下のコマンドを実行して動作確認を行います

    python lambda_function.py

    実行結果例

    > python lambda_function.py
    value1
    

My-IoTデータストアとメッセージを利用したソースコード実行手順

作業端末でクラウドアプリケーション(Lambda関数)を開発する際に実際にMy-IoTデータストアからデータを取得したり、My-IoTエッジへメッセージを送信して動作確認を行いながら開発を行うことができます。 そのためにはMy-IoTへのリクエストをローカル開発用プロキシアプリ経由で行う必要があるため、開発中のLambda関数のソースを以下のように「一時的に」変更する必要があります。

以下ではMy-IoTデータストアにアクセスする具体的な手順を解説します。
※本手順ではElasticsearchのクエリ文を使用します。設定方法についてはこちらを参照してください。

注意

IoTストアの実行基盤上に構築されているMy-IoTデータストアがDynamoDBの場合は、ローカル開発用プロキシアプリを使用した開発を行うことができません。
My-IoTデータストアの種別については、別途 My-IoT プラットフォーム仕様書 を参照してください。

①共通API呼び出し部分を関数呼び出しに変更

ElasticsearchアクセスAPIを使用している場合

注意

ローカル開発用プロキシアプリを利用したElasticsearchアクセスAPIの使用方法、および関数名が変更になっています。
以前のバージョンで使用していた send_proxy.py ファイルおよび、 send_proxy() 関数は deprecated となりますので、ご注意ください。

ElasticsearchアクセスAPIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、My-IoTデータストアへアクセスすることが出来ます。
作業端末からはこのAPIを使ってアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更します。

ElasticsearchアクセスAPIの詳細については、別途 My-IoT プラットフォーム仕様書 を参照してください。

  1. Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリのsip_mtls_access.pyファイルをインポートします

    記載例

    import sip_mtls_access
    
  2. ElasticsearchアクセスAPIのGETリクエスト処理 (boto3.client('lambda').invoke())の箇所を無効化し、sip_mtls_access.pyファイルのaccess_es関数呼び出しに置き換えます

    ここで指定するElasticsearchのインデックスには、エッジアプリによってMy-IoTデータストアに送信されたデータが格納されています。
    関数仕様については基本的にElasticsearchアクセスAPIと同一となります(access_es関数ではmethod = Postは使用不可)

    記載例(lambda_function.py)

    import json
    import os
    import boto3
    import sip_mtls_access
    from datetime import datetime
    from dateutil import tz
    
    TENANT_ID = os.environ.get('TENANT_ID')
    
    def lambda_handler(event, context):
        query = {
            'query':{
                'match_all':{},
            }
        }
    
        # テナントIDと日付からインデックス名を生成する(テナントID_YYYY.MM.DD)
        # 例: エッジアプリからMy-IoTデータストアに今日送信されたデータを取得する場合
        JST = tz.gettz('Asia/Tokyo')
        today = datetime.now(JST).strftime('%Y.%m.%d')
        index_name = '{}_{}'.format(TENANT_ID, today)
    
        payload = {
            'method': 'Get',
            'index': index_name,
            'query': query
        }
    
        # ElasticsearchアクセスAPIの呼び出し処理を無効化する
        # res = boto3.client('lambda').invoke(
        #     FunctionName='myiot-rel-es-access-lambda',
        #     InvocationType='RequestResponse',
        #     Payload=json.dumps(payload)
        # )
    
        # Lambda呼び出し部分を関数に置き換える
        res = sip_mtls_access.access_es(json.dumps(payload))
    
        return res
    
  3. Lambda関数内で環境変数の取得処理を定義している場合は、作業端末の環境構築 「環境変数の設定」の手順に従い登録します

IoT Coreへのメッセージ送信APIを使用している場合

IoT Coreへのメッセージ送信APIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、My-IoTエッジへメッセージを送信することができます。
作業端末からはこのAPIを使ってアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更します。

IoT Coreへのメッセージ送信APIの詳細については、別途 My-IoT プラットフォーム仕様書 を参照してください。

注意

IoTストアの実行基盤上に構築されているMy-IoTデータストアがDynamoDBの場合は、ローカル開発用プロキシアプリを使用した開発を行うことができません。
My-IoTデータストアの種別については、別途 My-IoT プラットフォーム仕様書 を参照してください。
  1. Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリのsip_mtls_access.pyファイルをインポートします

    記載例

    import sip_mtls_access
    
  2. IoT Coreへのメッセージ送信APIのリクエスト処理 (boto3.client('lambda').invoke())の箇所を無効化し、sip_mtls_access.pyファイルのpublish_mqtt関数呼び出しに置き換えます

    ここで指定するエッジIDは、My-IoTからのメッセージを受信できるエッジを指定します。 関数仕様についてはIoT Coreへのメッセージ送信APIと同一です。

    My-IoTからのメッセージを受信する方法については、 My-IoT プラットフォーム仕様書 を参照してください。

    記載例(lambda_function.py)

    import json
    import os
    import boto3
    import sip_mtls_access
    
    TENANT_ID = os.environ.get('TENANT_ID')
    
    def lambda_handler(event, context):
    
        # qosレベルを設定する
        qos_level = 1
    
        # IoT Coreへのメッセージ送信APIへ渡すペイロードを生成する
        payload = {
            'tenantId': TENANT_ID,
            'edgeId': '任意のエッジID',
            'payload': {
                'message': 'test message'
            },
            'qos': qos_level
        }
    
        # IoT Coreへのメッセージ送信APIの呼び出し処理を無効化する
        # response = boto3.client('lambda').invoke(
        #     FunctionName='myiot-rel-publish-mqtt-lambda',
        #     InvocationType='RequestResponse',
        #     Payload=json.dumps(payload)
        # )
    
        # Lambda呼び出し部分を関数に置き換える
        res = sip_mtls_access.publish_mqtt(json.dumps(payload))
    
        return res
    
  3. Lambda関数内で環境変数の取得処理を定義している場合は、作業端末の環境構築 「環境変数の設定」の手順に従い登録します

②ローカル開発用プロキシアプリ起動手順

次にローカル開発用プロキシアプリを起動し、①で修正を加えたPythonスクリプトを実際に実行します。Windows環境とLinux環境で実行手順が異なることに気をつけてください。

Windows環境での起動手順
  1. コマンドプロンプトにてLambdaソースコード格納ディレクトリに移動し、start_local_proxy.batを実行します

    ディレクトリ構成は以下の通りです。

    ローカルプログラム格納ディレクトリ
    └ Lambdaソースコード格納ディレクトリ
        ├ lambda_function.py (Lambdaソースコード)
        ├ event.json(eventデータを格納)
        ├ start_local_proxy.bat
        ├ sip-mtls-proxy.py
        ├ sip_mtls_access.py
        ├ control_event.py
        └ logging.conf
    

    実行するとlocalhostのhttpサーバが起動し、ローカル開発用プロキシアプリの待ち受け状態となります。 ログは実行時のコンソールへ出力、およびLambdaソースコード格納ディレクトリにtest.logとして出力されます。

  2. 1.とは別のコマンドプロンプト・デバッグツール等で①の手順で修正済のLambdaソースコードをpython-lambda-localコマンド(またはpythonコマンド)にて実行します

    実行例

    python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json
    
    python lambda_function.py
    
  3. ログは実行時のコンソールへ出力されます

  4. 1.を実行したコンソール上でCtrl+Cを押下しローカル開発用プロキシアプリを終了します

Linux環境での起動手順
  1. 以下ファイルにchmodコマンドにて実行権限を付与します

    • start_local_proxy.sh(ローカル開発用プロキシアプリ起動シェルスクリプト)

    • sip-mtls-proxy.py(ローカル開発用プロキシアプリ本体)

    • sip_mtls_access.py(import用プログラム)

    例:start_local_proxy.shにユーザーアクセスで実行権限を付与する場合

    chmod u+rx start_local_proxy.sh
    
  2. コンソールにてLambdaソースコード格納ディレクトリに移動し、start_local_proxy.shを実行します。ディレクトリ構成は以下の通りです

    ローカルプログラム格納ディレクトリ
    └ Lambdaソースコード格納ディレクトリ
        ├ lambda_function.py (Lambdaソースコード)
        ├ event.json(eventデータを格納)
        ├ start_local_proxy.sh
        ├ sip-mtls-proxy.py
        ├ sip_mtls_access.py
        ├ control_event.py
        └ logging.conf
    

    実行するとlocalhostのhttpサーバが起動し、ローカル開発用プロキシアプリの待ち受け状態となります。 ログは実行時のコンソールへ出力、およびLambdaソースコード格納ディレクトリにtest.logとして出力されます。

    ※Debian系環境では実行した際に以下のようなワーニングメッセージが出る場合があります。

    RequestsDependencyWarning: urllib3 (1.26.4) or chardet (3.0.4) doesn't match a supported version!  
    

    メッセージが出た場合は、以下のコマンドを使用してrequestsをアップグレードしてください。

    pip install --upgrade requests
    
  3. 2.とは別のコンソール等で①の手順で修正済のLambdaソースコードをpython-lambda-localコマンド(またはpythonコマンド)にて実行します

    実行例

    python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json
    
    python lambda_function.py
    
  4. 終了する場合はstart_local_proxy.shを実行したコンソール上でCtrl+Cを押下し、ローカル開発用プロキシアプリを終了します

作業端末でのイベント連携を利用したソースコード実行手順

作業端末でクラウドアプリケーション(Lambda関数)を開発する際に、イベント連携の仕組みや動作を確認しながら開発を行うことができます。
作業端末内でプログラムを実行して疑似的にイベント連携を確認するため、開発中のLambda関数のソースを以下のように「一時的に」変更する必要があります。

以下ではイベント連携を作業端末で確認するための具体的な手順を解説します。

イベント連携の仕様については、別途 My-IoT プラットフォーム仕様書 を参照してください。

注意

IoTストアの実行基盤上に構築されているMy-IoTデータストアがDynamoDBの場合は、ローカル開発用プロキシアプリを使用した開発を行うことができません。
My-IoTデータストアの種別については、別途 My-IoT プラットフォーム仕様書 を参照してください。

①イベントアクセス共通API呼び出し部分を関数呼び出しに変更

イベントアクセス共通APIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、イベントの登録やクローズを行うことが出来ます。
作業端末からはこのAPIを使ってイベントにアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更し、作業端末上で疑似的にイベント連携を実現します。

  1. Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリのcontrol_event.pyファイルをインポートします

    記載例

    import control_event
    
  2. イベントアクセス共通APIのリクエスト処理 (boto3.client('lambda').invoke())の箇所を無効化し、control_event.pyファイルのcontrol_event関数呼び出しに置き換えます

    関数仕様については基本的にイベントアクセス共通APIと同一です(control_event関数ではmethod = getは指定不可)

    イベント登録側のクラウドアプリ記載例(lambda_function.py)

    import boto3
    import json
    import logging
    import os
    import sip_mtls_access
    
    # テナントID
    TENANT_ID = os.environ.get('TENANT_ID')
    # イベントキー
    EVENT_KEY = os.environ.get('EVENT_KEY')
    
    def lambda_handler(event, context):
    
        # イベント連携先へ渡すペイロードを生成
        detail = {
            'eventName': 'light_alert',
            'edgeId': edgeId
        }
    
        # イベントアクセス共通APIへ渡すペイロードを生成
        # イベント登録を行う
        payload = {
            'method': 'register',
            'tenantId': TENANT_ID,
            'eventKey': EVENT_KEY,
            'detail': detail
        }
    
        # イベントアクセス共通APIの呼び出し処理を無効化する
        # response = boto3.client('lambda').invoke(
        #     FunctionName='myiot-rel-dynamodb-access-lambda',
        #     InvocationType='RequestResponse',
        #     Payload=json.dumps(payload)
        # )
    
        # Lambda呼び出し部分を関数に置き換える
        res = control_event.control_event(json.dumps(payload))
    
        return res
    

    イベント実行対象側のクラウドアプリ記載例(lambda_function.py)

    import boto3
    import json
    import logging
    import os
    import sip_mtls_access
    
    # テナントID
    TENANT_ID = os.environ.get('TENANT_ID')
    # イベントキー
    EVENT_KEY = os.environ.get('EVENT_KEY')
    
    def lambda_handler(event, context):
    
        # イベントIDを取得します
        eventId = event.get('eventId')
    
        # タイムアウトイベントで呼び出されたかどうかを判別する
        isTimeout = event.get('isTimeOut')
        if isTimeout is True:
            # タイムアウトイベントで呼び出された時の処理を記載する
            print('Timeout previous event.')
        else:
            # タイムアウトしていない場合の処理を記載する
            print('Event lambda invoked.')
    
        # イベントアクセス共通APIへ渡すペイロードを生成
        # イベントクローズを行う
        payload = {
            'method': 'close',
            'tenantId': TENANT_ID,
            'eventId': eventId,
        }
    
        # イベントアクセス共通APIの呼び出し処理を無効化する
        # response = boto3.client('lambda').invoke(
        #     FunctionName=EVENT_ACCESS_LAMBDA,
        #     InvocationType='RequestResponse',
        #     Payload=json.dumps(payload)
        # )
    
        # Lambda呼び出し部分を関数に置き換える
        res = control_event.control_event(json.dumps(payload))
        return res
    

②作成したLambdaソースコードの配置

①で作成したLambdaソースコードを、下記のようにディレクトリに配置します。

Windows環境の場合
ローカルプログラム格納ディレクトリ
└ Lambdaソースコード格納ディレクトリ
    ├ start_local_proxy.bat
    ├ lambda_function.py(イベント登録側Lambda)
    ├ TARGET(イベント実行対象格納ディレクトリ)
    │   └ lambda_function.py(イベント実行対象側Lambda)
    ├ sip-mtls-proxy.py
    ├ sip_mtls_access.py
    ├ control_event.py
    └ logging.conf
Linux環境の場合
ローカルプログラム格納ディレクトリ
└ Lambdaソースコード格納ディレクトリ
    ├ start_local_proxy.sh
    ├ lambda_function.py(イベント登録側Lambda)
    ├ TARGET(イベント実行対象格納ディレクトリ)
    │    └ lambda_function.py(イベント実行対象側Lambda)
    ├ sip-mtls-proxy.py
    ├ sip_mtls_access.py
    ├ control_event.py
    └ logging.conf

③イベント連携処理の確認

②で配置したイベント登録側Lambdaのソースコードを、python-lambda-localコマンド(またはpythonコマンド)にて実行します。

python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json
python lambda_function.py

ソースコードを実行すると、疑似的なイベント連携によりTARGETディレクトリに格納したイベント実行対象のLambdaソースコードが実行され、 イベント実行対象へのペイロード受け渡しの確認や、イベントタイムアウト時の処理を確認することができます。

イベント実行対象のLambdaがタイムアウトした場合は、タイムアウトイベントが登録され、イベント実行対象のLambdaソースコードが再実行されます。
既定の回数タイムアウトイベントが発生するとエラーを出力して終了します。

パッケージング

作業端末で開発したLambda関数を動かすソースファイル一式(lambda_function.pyなどのプログラムとライブラリなど)をzip形式で圧縮したものをソースファイルパッケージと呼びます。
このソースファイルパッケージを用いて、IoTストアへの登録・導入を行います。以下に、ソースファイルパッケージを作成する手順を説明します。
(作業端末でのLambdaソースコード実行手順の「python-lambda-local」を使用できない場合、またはMy-IoTデータストアを利用したソースコード実行手順の手順を実施した場合には、修正個所はすべて元に戻す必要があることに注意してください。)

  • Windows環境

  1. 登録を行うLambdaソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。

  2. エクスプローラから、zipファイル作成用ディレクトリに移動する。

  3. ディレクトリ内のすべてのファイル、ディレクトリを選択状態にし、右クリックする。

  4. 表示されるメニューの中から 送る>圧縮(zip 形式)ディレクトリーをクリックする。

  5. zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。

  • Linux環境

  1. 登録を行うLambdaソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。

  2. shellを起動し、cdコマンドを利用してzipファイル作成用ディレクトリに移動する。

    cd zipファイル作成用ディレクトリのパス
    
  3. その後zipコマンドを使用して、ディレクトリ内のすべてのファイルを一つのファイルとして圧縮する。以下は実行例。

    zip -r function.zip *
    
  4. zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。

CloudFormationテンプレート

Lambda関数や、クラウドアプリケーションに必要なAWSリソースに関する設定を記述します。

Cloudformationテンプレートの形式

  • 形式

    • JSON/YAMLファイル(ファイル名は任意)

  • ファイルサイズ上限

    • 50KB

Cloudformationテンプレート仕様

具体的な記述方法については My-IoT プラットフォーム仕様書 に記載の構成パターン例と、その構成パターン例に対応するCloudFormationテンプレートファイルの記載例を参照してください。

Cloudformationのより詳しい記述方法や仕様については、 AWSの公式ドキュメント を参考にしてください。

テンプレートパラメータファイル

利用者がシステムパッケージとしてクラウドアプリケーションを導入する際に、Cloudformationテンプレートの設定値を指定するために利用するファイルです。
利用者によって設定したい値が異なるパラメータに対してテンプレートパラメータファイルを用意することで、システムパッケージへクラウドアプリを設定する際に、クラウドアプリパラメータ設定という機能で利用者がパラメータの値を自由に指定できるようになります。

テンプレートパラメータファイルを利用することで、設定値ごとに異なるCloudFormationテンプレートの作成、クラウドアプリとしての登録が不要となります。

作成方法の詳細は以下の「テンプレートパラメータのファイル構文」および「各パラメータの仕様」を参照してください。

テンプレートパラメータファイルの形式

JSON形式(ファイル名は任意)

テンプレートパラメータファイルの構文

[
    {
        "title":"String",
        "target":"String",
        "targetType":"String",
        "inputType":"String",
        "default": "String",
        "validate":"String",
        "description":"String"
    }
]

各パラメータの仕様

key名

必須

説明

title

String

設定画面に表示する項目名

target

String

CloudFormationテンプレートの変更対象を指定する
・targetTypeの値がpath(または省略)の場合
CloudFormationテンプレート内の設定値を変更したいパラメータのパスを指定する
無効なパスを指定した場合は無視される
<導入時の動き>
targetに指定したCloudFormationテンプレートのパスの設定値を、設定画面で入力した情報に置き換える
・targetTypeの値がrepleceの場合
CloudFormationテンプレート内の置換したい文字列を指定する
<導入時の動き>
targetに指定した文字列をCloudFormationテンプレートから検索し、設定画面で入力した情報に置き換える
<注意>
CloudFormationテンプレート内で指定した文字列と一致した箇所が全て置換される
置換したい箇所のみが置き換わるようにCloudFormationテンプレートを作成すること

targetType

String

pathまたはreplaceが設定可能(左記以外は省略として扱う)
省略した場合はpathが設定されているとして扱う

inputType

String

導入時パラメータ設定画面(HTML)のパラメータ入力欄のinputタグのtype属性に設定する値を設定する
省略した場合は"text"が設定されているとして扱う
下記の無効値が設定されていた場合、省略時と同じ扱いとする
無効値:
"hidden"、"search"、"passwrd"、"file"、"range"、"checkbox"、"radio"、"submit"、"image"、"reset"、"button"

default

String

デフォルトで設定される値を指定する
指定した値がデフォルト値としてパラメータ設定画面に表示される
システムパッケージへクラウドアプリを設定する際に、クラウドアプリパラメータ設定を行わない場合はここで指定した値でパラメータ設定が行われる

validate

String

正規表現を指定する
<導入時の動き>
指定した正規表現にて、設定画面の入力値のチェックを行う
導入時パラメータ設定画面のパラメータ入力欄に正規表現と一致しない情報を入力すると、入力欄が赤色表示される

description

String

設定画面の行ホバー時にツールチップとして表示する文字列を指定する

CloudFormationテンプレート内にLambda関数の環境変数として定義された設定値としてTHRESHOLD(閾値)があるケースで、クラウドアプリケーション導入時(後述)にTHRESHOLD(閾値)の設定値を1~199の範囲で変更できるようにするためのテンプレートパラメータファイルの作成例を以下に示します。

CloudFormationテンプレート例(一部抜粋)

AWSTemplateFormatVersion: '2010-09-09'
Description: An AWS function.
Resources:
  sipSamplePattern05lm:
    Type: 'AWS::Lambda::Function'
    Properties:
      Environment:
        Variables:
          #************************************************************
          # 設定値をテンプレートパラメータファイルで変更する部分
          THRESHOLD: '100'
          #************************************************************
    ~(省略)~

テンプレートパラメータファイル例

[
    {
        "title": "THRESHOLD",
        "target": "Resources.sipSamplePattern05lm.Properties.Environment.Variables.THRESHOLD",
        "inputType": "number",
        "default": "100",
        "validate": "^[1-9]$|^[1-9][0-9]$|^1[0-9]{2}$",
        "description": "Sensor Data Threshold"
    }
]

IoTストアでの導入時パラメータ設定画面イメージ

クラウドアプリにテンプレートパラメータファイルを設定すると、利用者がシステムパッケージを登録する際に、下記のようなパラメータ設定画面が表示されます。

テンプレートパラメータ画面イメージ

テンプレートパラメータファイルにて、validateによる入力値のチェックを指定した場合は、指定した内容で入力値チェックが行われます。利用者が入力した値が指定した形式に該当しない場合は、パラメータ設定後にエラーダイアログが表示されます。

テンプレートパラメータ画面イメージ

Webアプリケーションを作成する

クラウドアプリケーションでは、HTMLファイルなどのリソースをMy-IoTクラウド上に展開してWebアプリケーションを作成することができます。
WebアプリとAPI GatewayやLambda関数をまとめてクラウドアプリとして作成することで、様々な処理を実行するWebアプリケーションを作成することができます。

Webアプリへのアクセス

利用者がインストールしたWebアプリにアクセスする際は、ユーザー認証が必要となります。
Webアプリをインストールしたユーザーおよびインストールしたユーザーと同一テナントのMy-IoTアカウントのみアクセスすることができます。

Web UIパッケージ

Webアプリケーションを作成するには、HTMLファイルやJavaScriptファイルなどのWebアプリケーションに必要なリソースファイル一式をzip形式で圧縮した、Web UIパッケージと呼ばれるものが必要となります。

クラウドアプリにWeb UIパッケージを設定することで、クラウドアプリのインストール時にWeb UIパッケージが展開され、インターネット経由でリソースファイルにアクセスすることができるようになります。

config.jsonファイル

クラウドアプリのインストール時に、展開されたWeb UIパッケージのルートディレクトリにconfig.jsonというファイルが作成されます。

config.jsonには、WebアプリからREST APIやクラウドアプリを使用する場合の情報が出力されており、Webアプリから読み込んで使用します。

config.jsonには、API GatewayのURLが自動的に出力されます。
CloudformationテンプレートでAPI GatewayにAPI Keyを設定している場合は、API GatewayのAPI Keyも同時に出力されます。
CloudformationテンプレートでOutputsセクションを指定している場合は、Outputsセクションの内容も同時に出力されます。

API Gatewayを使用しない場合など、出力される情報が一つも存在しない場合は、Keyが存在しない空のJSONファイルが作成されます。

config.jsonファイルの構文

{
    "ApiUrl": "https://xxxxxxx.execute-api.xx-xxxx-x.amazonaws.com/Prod/",
    "ApiKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "${OutPutsで指定したLogical ID}": ${Outputsで指定したValue},
    …
}

config.jsonファイルの仕様

key名

必須

説明

ApiUrl

String

API GatewayのURL

ApiKey

String

API GatewayのAPI Key

OutPutsで指定したLogical ID

String

Outputsで指定したValue

複数のAPI Gatewayが存在する場合は、下記のようにCloudformationテンプレートで定義したRestApiのNameがキー名の末尾に追加されます(APIのNameがそれぞれRestApi1RestApi2の場合)

  • Cloudformationテンプレート例

RestApi1:
  Type: 'AWS::ApiGateway::RestApi'
  Properties:
    Description: lambda deploy api
    Name: RestApi1
    EndpointConfiguration:
      Types:
        - REGIONAL

~省略~

RestApi2:
  Type: 'AWS::ApiGateway::RestApi'
  Properties:
    Description: lambda deploy api
    Name: RestApi2
    EndpointConfiguration:
      Types:
        - REGIONAL
  • 出力されるconfig.jsonの例

{
    "ApiUrlRestApi1": "https://xxxxxxx.execute-api.xx-xxxx-x.amazonaws.com/Prod/",
    "ApiKeyRestApi1": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "ApiUrlRestApi2": "https://xxxxxxx.execute-api.xx-xxxx-x.amazonaws.com/Prod/",
    "ApiKeyRestApi2": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    …
}

API Gatewayへのアクセス

Web UIパッケージを設定したクラウドアプリでは、API Gatewayに自動的にCognito認証が設定されます。
WebアプリからAPI Gatewayへアクセスする際は、下記の仕様に従ってアクセスする必要があります。

  • HTTPヘッダーのAuthorizationに、末尾がidTokenのCookieを設定する

設定方法についての具体的な例や詳細は、 My-IoTプラットフォーム仕様書 を参照してください。

Web UIパッケージのパッケージング

Web UIパッケージを作成する場合は、下記の手順で行います。

  • Windows環境

  1. リソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。この時、 zipファイル作成用ディレクトリの直下にindex.htmlが存在する必要があります。

  2. エクスプローラから、zipファイル作成用ディレクトリに移動する。

  3. ディレクトリ内のすべてのファイル、ディレクトリを選択状態にし、右クリックする。

  4. 表示されるメニューの中から 送る>圧縮(zip 形式)ディレクトリをクリックする。

  5. zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。

  • Linux環境

  1. リソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。この時、 zipファイル作成用ディレクトリの直下にindex.htmlが存在する必要があります。

  2. shellを起動し、cdコマンドを利用してzipファイル作成用ディレクトリに移動する。

    cd zipファイル作成用ディレクトリのパス
    
  3. その後zipコマンドを使用して、ディレクトリ内のすべてのファイルを一つのファイルとして圧縮する。以下は実行例。

    zip -r function.zip *
    
  4. zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。

Webアプリの作成方法

Web UIパッケージを利用したWebアプリケーションのサンプルや作成方法については、 My-IoTプラットフォーム仕様書用途別のクラウドアプリケーション構築 の章を参照してください。