クラウドアプリケーションの開発¶
作業端末にて開発した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
ターミナルにて以下のコマンドを実行し、
python-lambda-local
をインストールしますsudo pip install python-lambda-local
または
sudo python3 -m pip install python-lambda-local
イベント引数を定義した
event.json
を作成しますevent.json
は、関数外部からevent
データを受け取り実行するLambda関数をローカルで疑似的に実行するために利用するものです 。記載例
{ "key1":"value1", "key2":"value2" }
※イベント引数が不要の場合は空オブジェクトを記載します 記載例
{}
ソースファイル
lambda_function.py
を作成し、event.json
と同じディレクトリに保存しますevent.json
で定義した引数はlambda_handler
関数の第一引数event
に格納されます。記載例
import json def lambda_handler(event, context): return event['key1']
ターミナルにて作成した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コマンドの実行結果として出力できるようにします。
ソースファイル
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) #*********************************************
ターミナルにて作成したLambdaソースのディレクトリまで移動し、以下のコマンドを実行して動作確認を行います
python lambda_function.py
実行結果例
> python lambda_function.py value1
My-IoTデータストアとメッセージを利用したソースコード実行手順¶
作業端末でクラウドアプリケーション(Lambda関数)を開発する際に実際にMy-IoTデータストアからデータを取得したり、My-IoTエッジへメッセージを送信して動作確認を行いながら開発を行うことができます。 そのためにはMy-IoTへのリクエストをローカル開発用プロキシアプリ経由で行う必要があるため、開発中のLambda関数のソースを以下のように「一時的に」変更する必要があります。
以下ではMy-IoTデータストアにアクセスする具体的な手順を解説します。
※本手順ではElasticsearchのクエリ文を使用します。設定方法についてはこちらを参照してください。
注意
①共通API呼び出し部分を関数呼び出しに変更¶
ElasticsearchアクセスAPIを使用している場合¶
注意
send_proxy.py
ファイルおよび、 send_proxy()
関数は deprecated となりますので、ご注意ください。ElasticsearchアクセスAPIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、My-IoTデータストアへアクセスすることが出来ます。
作業端末からはこのAPIを使ってアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更します。
ElasticsearchアクセスAPIの詳細については、別途 My-IoT プラットフォーム仕様書 を参照してください。
Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリの
sip_mtls_access.py
ファイルをインポートします記載例
import sip_mtls_access
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
Lambda関数内で環境変数の取得処理を定義している場合は、作業端末の環境構築 「環境変数の設定」の手順に従い登録します
IoT Coreへのメッセージ送信APIを使用している場合¶
IoT Coreへのメッセージ送信APIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、My-IoTエッジへメッセージを送信することができます。
作業端末からはこのAPIを使ってアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更します。
IoT Coreへのメッセージ送信APIの詳細については、別途 My-IoT プラットフォーム仕様書 を参照してください。
注意
Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリの
sip_mtls_access.py
ファイルをインポートします記載例
import sip_mtls_access
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
Lambda関数内で環境変数の取得処理を定義している場合は、作業端末の環境構築 「環境変数の設定」の手順に従い登録します
②ローカル開発用プロキシアプリ起動手順¶
次にローカル開発用プロキシアプリを起動し、①で修正を加えたPythonスクリプトを実際に実行します。Windows環境とLinux環境で実行手順が異なることに気をつけてください。
Windows環境での起動手順¶
コマンドプロンプトにて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
として出力されます。1.とは別のコマンドプロンプト・デバッグツール等で①の手順で修正済のLambdaソースコードを
python-lambda-local
コマンド(またはpython
コマンド)にて実行します実行例
python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json
python lambda_function.py
ログは実行時のコンソールへ出力されます
1.を実行したコンソール上でCtrl+Cを押下しローカル開発用プロキシアプリを終了します
Linux環境での起動手順¶
以下ファイルに
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
コンソールにて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
2.とは別のコンソール等で①の手順で修正済のLambdaソースコードを
python-lambda-local
コマンド(またはpython
コマンド)にて実行します実行例
python-lambda-local -t 30 -f lambda_handler lambda_function.py event.json
python lambda_function.py
終了する場合は
start_local_proxy.sh
を実行したコンソール上でCtrl+Cを押下し、ローカル開発用プロキシアプリを終了します
作業端末でのイベント連携を利用したソースコード実行手順¶
作業端末でクラウドアプリケーション(Lambda関数)を開発する際に、イベント連携の仕組みや動作を確認しながら開発を行うことができます。
作業端末内でプログラムを実行して疑似的にイベント連携を確認するため、開発中のLambda関数のソースを以下のように「一時的に」変更する必要があります。
以下ではイベント連携を作業端末で確認するための具体的な手順を解説します。
イベント連携の仕様については、別途 My-IoT プラットフォーム仕様書 を参照してください。
注意
①イベントアクセス共通API呼び出し部分を関数呼び出しに変更¶
イベントアクセス共通APIはMy-IoTが提供する共通APIです。開発者はこのAPIを利用し、イベントの登録やクローズを行うことが出来ます。
作業端末からはこのAPIを使ってイベントにアクセスすることができないため、以下の手順でLambda関数のソースを一時的に変更し、作業端末上で疑似的にイベント連携を実現します。
Lambda関数を定義するPythonスクリプトに対し、ローカル開発用プロキシアプリの
control_event.py
ファイルをインポートします記載例
import control_event
イベントアクセス共通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環境
登録を行うLambdaソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。
エクスプローラから、zipファイル作成用ディレクトリに移動する。
ディレクトリ内のすべてのファイル、ディレクトリを選択状態にし、右クリックする。
表示されるメニューの中から 送る>圧縮(zip 形式)ディレクトリーをクリックする。
zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。
Linux環境
登録を行うLambdaソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。
shellを起動し、cdコマンドを利用してzipファイル作成用ディレクトリに移動する。
cd zipファイル作成用ディレクトリのパス
その後zipコマンドを使用して、ディレクトリ内のすべてのファイルを一つのファイルとして圧縮する。以下は実行例。
zip -r function.zip *
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がそれぞれRestApi1
、RestApi2
の場合)
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環境
リソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。この時、 zipファイル作成用ディレクトリの直下にindex.htmlが存在する必要があります。
エクスプローラから、zipファイル作成用ディレクトリに移動する。
ディレクトリ内のすべてのファイル、ディレクトリを選択状態にし、右クリックする。
表示されるメニューの中から 送る>圧縮(zip 形式)ディレクトリをクリックする。
zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。
Linux環境
リソースファイル一式を、新たに作成したzipファイル作成用ディレクトリにまとめる。この時、 zipファイル作成用ディレクトリの直下にindex.htmlが存在する必要があります。
shellを起動し、cdコマンドを利用してzipファイル作成用ディレクトリに移動する。
cd zipファイル作成用ディレクトリのパス
その後zipコマンドを使用して、ディレクトリ内のすべてのファイルを一つのファイルとして圧縮する。以下は実行例。
zip -r function.zip *
zipファイルが生成されたことを確認する。ファイル名は拡張子がzipとなっていれば任意である。
Webアプリの作成方法¶
Web UIパッケージを利用したWebアプリケーションのサンプルや作成方法については、 My-IoTプラットフォーム仕様書 の 用途別のクラウドアプリケーション構築 の章を参照してください。