イベント連携について¶
My-IoTでは、イベント連携と呼ばれるインストールされたクラウドアプリ間で連携する仕組みがあります。
イベント連携を利用することで、定期実行しているクラウドアプリをトリガーに他のクラウドアプリを起動することや、複数のクラウドアプリを連携して動作させることが可能になります。
イベント連携のアーキテクチャ¶
イベント連携のアーキテクチャは、下記のようになっています。
イベント連携を行うには、イベント登録元となるクラウドアプリ(カスタムLambda)と、イベント実行対象となるクラウドアプリの2つを作成し、システムパッケージ内で組み合わせてインストールします。
イベント登録元となるクラウドアプリでは、イベントを発生させたいタイミングでイベントを登録します。イベントには、イベントキーと呼ばれる予め指定済みの環境変数と、実行先のクラウドアプリに渡すペイロードやタイムアウト時間を指定して登録します。
イベントキーは、システムパッケージのインストールの際に、イベント実行対象となるクラウドアプリに紐づけられます。イベント登録時には、このイベントキーからイベント実行対象のクラウドアプリを特定し起動します。
イベント実行対象となるクラウドアプリでは、任意の処理を行ってイベントのクローズ処理を行います。
クローズ処理を行うことで一連のイベント連携が完了します。
もしイベント実行対象のクラウドアプリからタイムアウト時間内にクローズされなかった場合は、タイムアウトイベントが登録され、イベント実行対象クラウドアプリがリトライ実行されます。
リトライが一定回数行われると、リトライを中止しそれ以降処理は行われなくなります。
イベント連携を利用したクラウドアプリの作成と利用¶
開発者は、イベント登録元となるクラウドアプリと、イベント実行対象のクラウドアプリを作成する必要があります。
ここでは、イベント登録元となるクラウドアプリと、イベント実行対象のクラウドアプリの具体的な作成方法について説明します。
イベント連携を利用したクラウドアプリの作成例については、 用途別のクラウドアプリケーション構築 のパターン4~6にも記載されていますので、併せて参照してください。
イベント登録元クラウドアプリの作成¶
イベント登録元クラウドアプリでは、予め用意されている環境変数 EVENT_KEY
を使用して、イベント登録Lambdaを呼び出します。
イベント登録時には、イベント実行対象となるクラウドアプリに渡されるペイロードや、イベント実行対象クラウドアプリがタイムアウトとなる時間を指定することができます。
システムパッケージ内にイベント実行対象が複数ある場合は、全てのイベント実行対象クラウドアプリが起動されます。
全てのイベント実行対象のクラウドアプリが起動されるため、イベントに対して特定のクラウドアプリのみ処理したい場合は、ペイロードで判別できるように作成します。
ここでは、判別するための例として、ペイロードに event_name
キーを設定しています。
# イベントアクセスLambda関数名
EVENT_ACCESS_LAMBDA = 'myiot-rel-event-access-lambda'
# テナントIDを環境変数から取得
TENANT_ID = os.environ.get('TENANT_ID')
# イベントキーを環境変数から取得
EVENT_KEY = os.environ.get('EVENT_KEY')
# イベント実行対象へ渡すペイロードを作成
detail = {
'event_name': 'event_A',
}
# 共通Lambdaへ渡すペイロードを作成
payload = {
'method': 'register',
'tenantId': TENANT_ID,
'eventKey': EVENT_KEY,
'detail': detail
}
# 共通Lambdaでイベント登録を行う
res = boto3.client('lambda').invoke(
FunctionName=EVENT_ACCESS_LAMBDA,
InvocationType='RequestResponse',
Payload=json.dumps(payload)
)
イベント実行対象クラウドアプリの作成¶
イベント実行対象となるクラウドアプリでは、イベントによって呼び出された際の処理を作成します。
渡されたペイロードを利用した処理やイベントのクローズ処理、タイムアウトイベントによって呼び出された際の処理等を作成します。
イベント実行対象クラウドアプリからイベント登録を行い、更にイベント連携を行うことも可能です。
引数について¶
イベント実行対象クラウドアプリでは、呼び出された際に下記のパラメータを引数として受け取ります。
入力(JSON形式)
key名 |
型 |
必須 |
説明 |
---|---|---|---|
eventId |
文字列 |
○ |
イベントを識別するためのID。
イベントをクローズする際はこのイベントIDを指定する。
|
isTimeOut |
Boolean |
○ |
タイムアウト判別フラグ。
タイムアウトイベントによって呼び出された場合はTrueが設定される。
|
detail |
dict |
○ |
イベント登録時に指定したペイロード(JSON形式) |
実行対象かどうか判別する¶
イベント実行対象が複数ある場合は、自身が実行対象かどうかを判別する必要があります。
ここでは、例としてペイロード内の eventName
キーで判別します。
# 実行対象かどうかを判別します
detail = event.get('detail')
if detail['event_name'] is 'event_A':
# event_nameがevent_Aだった場合のみ処理を行います
# イベントによる処理を記載
print('イベントAによって起動されました')
else:
# event_nameがevent_Aではない場合は、実行対象でないため処理を終了します
print('実行対象ではありません')
タイムアウト時の処理を記載する¶
イベント実行対象となるクラウドアプリが一定時間内に終了しない場合、タイムアウトイベントが登録され、一定回数までイベント実行対象Lambdaの実行が繰り返されます。
タイムアウトイベントで呼び出されたかどうかは、引数の isTimeOut
パラメータで判別することができます。
# タイムアウトイベントで呼び出されたかどうかを判別します
isTimeout = event.get('isTimeOut')
if isTimeout is True:
# タイムアウトイベントで呼び出された場合
# タイムアウト時の処理を記載します
print('timeout error')
else:
# タイムアウトしていない場合(初回実行時)
# イベントによる処理を記載します
print('イベントによって起動されました')
# イベントの種別に関係なくイベントをクローズする
payload = {
'method': 'close',
'tenantId': TENANT_ID,
'eventId': eventId,
}
# 共通Lambdaでクローズ処理を記載する
boto3.client('lambda').invoke(
FunctionName=EVENT_ACCESS_LAMBDA,
InvocationType='RequestResponse',
Payload=json.dumps(payload)
)
イベントクローズ処理を記載する¶
任意の処理、またはタイムアウトイベント時の処理が終了した後はイベントのクローズ処理を作成します。
イベントをクローズするには、下記のようにテナントIDとペイロードに存在する eventId
をパラメータとして指定して共通Lambdaを呼び出します。
イベントで呼び出された際には必ずイベントクローズ処理を行う必要があります。イベントクローズ処理を行わない場合、タイムアウトイベントが呼び出されてリトライが行われ続けてしまうため、イベント実行対象クラウドアプリの作成時は、必ずイベントクローズ処理を作成するようにしてください。
payload = {
'method': 'close',
'tenantId': TENANT_ID,
'eventId': eventId,
}
# 共通Lambdaでクローズ処理を記載する
boto3.client('lambda').invoke(
FunctionName=EVENT_ACCESS_LAMBDA,
InvocationType='RequestResponse',
Payload=json.dumps(payload)
)
クラウドアプリを登録する¶
クラウドアプリの作成が完了したらクラウドアプリを登録します。
イベント実行対象のクラウドアプリは、IoTストアへの登録時にイベント実行対象として指定して登録する必要があります。
クラウドアプリの登録方法およびイベント実行対象としての指定方法については、 My-IoT ユーザーマニュアル を参照してください。
システムパッケージとして組み合わせる¶
イベント登録元のクラウドアプリとイベント実行対象のクラウドアプリを、システムパッケージとして組み合わせます。
システムパッケージとして組み合わせることで、イベントキーとイベント実行対象クラウドアプリの紐づけが行われ、イベント連携が可能になります。
他のシステムパッケージに存在するクラウドアプリとはイベント連携できませんのでご注意ください。