チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする - AWS IoT Core

チュートリアル: AWS Lambda 関数を使用して通知をフォーマットする

このチュートリアルでは、MQTT メッセージデータを AWS Lambda アクションに送信し、フォーマットして別の AWS のサービスに送信する方法を示します。このチュートリアルでは、AWS Lambda アクションは AWS SDK を使用して、チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルで作成した Amazon SNS トピックにフォーマットされたメッセージを送信します。

チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルでは、ルールのクエリステートメントから生成された JSON ドキュメントがテキストメッセージの本文として送信されました。その結果、次の例のようなテキストメッセージが表示されました。

{"device_id":"32","reported_temperature":38,"max_temperature":30}

このチュートリアルでは、AWS Lambda ルールアクションを使用して、ルールクエリステートメントのデータを、次の例のようにわかりやすい形式にフォーマットする AWS Lambda 関数を呼び出します。

Device 32 reports a temperature of 38, which exceeds the limit of 30.

このチュートリアルで作成する AWS Lambda 関数は、ルールクエリステートメントからのデータを使用してメッセージ文字列をフォーマットし、AWS SDK の SNS 発行関数を呼び出して通知を作成します。

このチュートリアルで学習する内容

  • AWS Lambda 関数を作成してテストする方法

  • AWS Lambda 関数で AWS SDK を使用して Amazon SNS 通知を発行する方法

  • ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法

  • MQTT クライアントを使用して AWS IoT ルールをテストする方法

このチュートリアルの完了には 45 分ほどかかります。

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。

  • AWS アカウント のセットアップ

    このチュートリアルを完了するには、AWS アカウント と AWS IoT コンソールが必要です。

  • AWS IoT MQTT クライアントでデバイスの MQTT メッセージを表示する を確認したこと

    トピックにサブスクライブおよび発行するために MQTT クライアントを使用できることを確認してください。この手順では、MQTT クライアントを使用して新しいルールをテストします。

  • このセクションのその他のルールチュートリアルを完了しました

    このチュートリアルでは、チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルで作成した SNS 通知トピックが必要です。また、このセクションの他のルール関連のチュートリアルを完了していることも前提としています。

  • AWS Lambda の概要を確認する

    これまで AWS Lambda を使用したことがない場合は、AWS LambdaLambda の開始方法を確認して、その用語と概念を確認してください。

ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する

このチュートリアルの AWS Lambda 関数は、ルールクエリステートメントの結果を受け取り、要素をテキスト文字列に挿入し、得られた文字列を通知に含まれるメッセージとして Amazon SNS に送信します。

AWS IoT ルールアクションを使用して通知を送信する、チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルとは異なり、このチュートリアルでは、AWS SDK の関数を使用して Lambda 関数から通知を送信します。ただし、このチュートリアルで使用されている実際の Amazon SNS 通知トピックは、チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルで使用したものと同じです。

テキストメッセージを送信する AWS Lambda 関数を作成するには

  1. 新しい AWS Lambda 関数を作成する

    1. AWS Lambda コンソールで、[関数の作成] を選択します。

    2. [Create function] (関数の作成) で、[Use a blueprint] (ブループリントを使用) を選択します。

      hello-world-python ブループリントを検索して選択し、[Configure] (設定) を選択します。

    3. [Basic information] (基本的な情報) で、次の操作を実行します。

      1. [Function name] (関数名) で、関数の名前 format-high-temp-notification を入力します。

      2. [Execution role] (実行ロール) で、[Create a new role from AWS policy templates] (AWS ポリシーテンプレートから新しいロールを作成) を選択します。

      3. [Role name] (ロール名) で、新しいロールの名前 format-high-temp-notification-role を入力します。

      4. [Policy templates - optional] (ポリシーテンプレート - オプション) で、[Amazon SNS publish policy] (Amazon SNS 発行ポリシー) を検索して選択します。

      5. [Create function] を選択します。

  2. ブループリントコードを変更して、Amazon SNS 通知をフォーマットして送信します。

    1. 関数を作成すると、format-high-temp-notification の詳細ページが表示されます。表示されない場合は、[Lambda Functions] (Lambda 関数) ページから開きます。

    2. format-high-temp-notification の詳細ページで、[Configuration] (設定) タブを選択し、[Function code] (関数コード) パネルまでスクロールします。

    3. [Function code] (関数コード) ウィンドウの [Environment] (環境) ペインで、Python ファイル lambda_function.py を選択します。

    4. [Function code] (関数コード) ウィンドウで、ブループリントから元のプログラムコードをすべて削除し、このコードに置き換えます。

      import boto3 # # expects event parameter to contain: # { # "device_id": "32", # "reported_temperature": 38, # "max_temperature": 30, # "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" # } # # sends a plain text string to be used in a text message # # "Device {0} reports a temperature of {1}, which exceeds the limit of {2}." # # where: # {0} is the device_id value # {1} is the reported_temperature value # {2} is the max_temperature value # def lambda_handler(event, context): # Create an SNS client to send notification sns = boto3.client('sns') # Format text message from data message_text = "Device {0} reports a temperature of {1}, which exceeds the limit of {2}.".format( str(event['device_id']), str(event['reported_temperature']), str(event['max_temperature']) ) # Publish the formatted message response = sns.publish( TopicArn = event['notify_topic_arn'], Message = message_text ) return response
    5. [デプロイ] を選択します。

  3. 新しいウィンドウで、チュートリアル: Amazon SNS 通知の送信 の方法に関するチュートリアルから、Amazon SNS トピックの Amazon リソースネーム (ARN)を検索します。

    1. 新しいウィンドウで、Amazon SNS コンソールの [Topics] (トピック) ページを開きます。

    2. [Topics] (トピック) ページで、Amazon SNS トピックのリストから high_temp_notice 通知トピックを見つけます。

    3. 次のステップで使用する high_temp_notice 通知トピックの ARN を見つけます。

  4. Lambda 関数のテストケースを作成します。

    1. コンソールの [Lambda Functions] (Lambda 関数) ページの format-high-temp-notification ページで、ページの右上にある (無効に見える) [Select a test event] (テストイベントの選択) を選択し、[Configure test events] (テストイベントの設定) を選択します。

    2. [Configure test event] (テストイベントの設定) で、[Create new test event] (新しいテストイベントの作成) を選択します。

    3. [Event name] (イベント名) で、SampleRuleOutput と入力します。

    4. [Event name] (イベント名) の下の JSON エディタで、このサンプル JSON ドキュメントを貼り付けます。これは、AWS IoT ルールが Lambda 関数に送信する内容の例です。

      { "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" }
    5. high_temp_notice 通知トピックの ARN があるウィンドウを参照し、ARN 値をコピーします。

    6. JSON エディターの notify_topic_arn 値を通知トピックの ARN に置き換えます。

      AWS IoT ルールを作成するときにこの ARN 値を再度使用できるように、このウィンドウを開いたままにします。

    7. [Create] を選択します。

  5. サンプルデータを使用して関数をテストします。

    1. format-high-temp-notification の詳細ページの右上で、SampleRuleOutput が [Test] (テスト) ボタンの横に表示されていることを確認します。表示されない場合は、利用可能なテストイベントのリストから選択します。

    2. サンプルルール出力メッセージを関数に送信するには、[Test] (テスト) を選択します。

関数と通知の両方が機能した場合は、通知にサブスクライブした電話でテキストメッセージが受信されます。

電話でテキストメッセージが受信されない場合は、操作の結果を確認してください。[Function code] (関数コード) パネルの [Execution result] (実行結果) タブで、応答を確認して、発生したエラーを見つけます。関数が電話に通知を送信できるようになるまで、次のステップに進まないでください。

ステップ 2: AWS Lambda ルールアクションの AWS IoT ルールを作成する

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットして Lambda 関数に送信します。この関数は、テキストメッセージをフォーマットして送信します。

気象装置から受信したサンプルメッセージペイロードは、次のようになります。

{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }

このルールでは、ルールクエリステートメントを使用して、次のような Lambda 関数のメッセージペイロードを作成します。

{ "device_id": "32", "reported_temperature": 38, "max_temperature": 30, "notify_topic_arn": "arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice" }

これには、Lambda 関数が正しいテキストメッセージをフォーマットして送信するために必要なすべての情報が含まれます。

Lambda 関数を呼び出す AWS IoT ルールを作成するには

  1. AWS IoT コンソールの [Rules] (ルール) ハブを開きます。

  2. [Rules] (ルール) で新しいルールの作成を開始するには、[Create] (作成) を選択します。

  3. [Create a rule] (ルールを作成) の上部で、次のように操作します。

    1. [Name] (名前) で、ルールの名前 wx_friendly_text を入力します。

      ルール名は、AWS アカウント とリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。

    2. [Description] (説明) で、ルールの説明を入力します。

      わかりやすい説明を使用すると、このルールの動作と作成した理由を簡単に思い出すことができます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。

  4. [Create a rule] (ルールを作成) の [Rule query statement] (ルールクエリステートメント) で、以下を実行します。

    1. [Using SQL version] (SQL バージョンの使用) で、2016-03-23 を選択します。

    2. [Rule query statement] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。

      SELECT cast(topic(2) AS DECIMAL) as device_id, temperature as reported_temperature, 30 as max_temperature, 'arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice' as notify_topic_arn FROM 'device/+/data' WHERE temperature > 30

      このステートメント:

      • device/+/data トピックフィルターに一致し、temperature 値が 30 より大きいトピックを含む MQTT メッセージをリッスンします。

      • トピック文字列から 2 番目の要素を選択し、それを 10 進数に変換してから、device_id フィールドに割り当てます。

      • メッセージペイロードから temperature フィールドの値を選択し、それを reported_temperature フィールドに割り当てます。

      • 制限値を表す定数値 30 を作成し、それを max_temperature フィールドに割り当てます。

      • notify_topic_arn フィールドの定数値を作成します。

    3. high_temp_notice 通知トピックの ARN があるウィンドウを参照し、ARN 値をコピーします。

    4. ルールクエリステートメントエディタの ARN 値 (arn:aws:sns:us-east-1:57EXAMPLE833:high_temp_notice)を通知トピックの ARN に置き換えます。

  5. [Set one or more actions] (1 つ以上のアクションを設定) で、以下を実行します。

    1. このルールのルールアクションのリストを開くには、[Add action] (アクションの追加) を選択します。

    2. [Select an action] (アクションを選択してください) で、[Send a message to a Lambda function] (Lambda 関数にメッセージを送信する) を選択します。

    3. 選択したアクションの設定ページを開くには、アクションリストの下部にある [Configure action] (アクションの設定) を選択します。

  6. [Configure action] (アクションの設定) で、次のとおり実行します。

    1. [Function name] (関数名) で、[Select] (選択) を選択します。

    2. format-high-temp-notification を選択します。

    3. [Configure action] (アクションの設定) の下部で、[Add action] (アクションの追加) を選択します。

    4. ルールを作成するには、[Create a rule] (ルールの作成) の下部にある [Create rule] (ルールの作成) を選択します。

ステップ 3: AWS IoT ルールと AWS Lambda ルールアクションをテストする

新しいルールをテストするには、MQTT クライアントを使用して、このルールで使用される MQTT メッセージを発行して、これにサブスクライブします。

新しいウィンドウの AWS IoT コンソールで MQTT クライアントを開きます。これで、MQTT クライアントの設定を失うことなくルールを編集できるようになりました。コンソールの別のページに移動するために MQTT クライアントを残すと、サブスクリプションやメッセージログは失われます。

MQTT クライアントを使用してルールをテストするには

  1. AWS IoT コンソールの MQTT クライアントで、入力トピック (この場合は device/+/data) をサブスクライブします。

    1. MQTT クライアントの [Subscription] (サブスクリプション)で、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

    2. [Subscription topic] (サブスクリプショントピック) で、入力トピックフィルター device/+/data のトピックを入力します。

    3. 残りのフィールドはデフォルト設定のままにします。

    4. [Subscribe to topic] を選択します。

      [Subscriptions] (サブスクリプション) 列の [Publish to a topic] (トピックへの発行) の下に device/+/data が表示されます。

  2. 特定のデバイス ID device/32/data を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含む MQTT トピックには発行できません。

    1. MQTT クライアントの [Subscription] (サブスクリプション)で、[Publish to topic] (トピックに発行) を選択します。

    2. [Publish] (発行) フィールドに、入力トピック名 device/32/data を入力します。

    3. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. MQTT メッセージを発行するには、[Publish to topic] (トピックに発行) を選択します。

  3. テキストメッセージが送信されたことを確認します。

    1. MQTT クライアントの [Subscriptions] (サブスクリプション) の下に、以前にサブスクライブしたトピックの隣に緑色のドットが表示されます。

      緑色のドットは、最後にメッセージを表示してから 1 つ以上の新しいメッセージが受信されたことを示します。

    2. [Subscriptions] (サブスクリプション) で、[device/+/data] を選択して、メッセージペイロードが発行したばかりのものと一致し、次のようになっていることを確認します。

      { "temperature": 38, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    3. SNS トピックのサブスクライブに使用した電話を確認し、メッセージペイロードの内容が次のようになっていることを確認します。

      Device 32 reports a temperature of 38, which exceeds the limit of 30.

      メッセージトピックのトピック ID 要素を変更する場合、topic(2) 値を数値にキャストすることは、メッセージトピックのその要素に数字のみが含まれている場合にのみ機能することに注意してください。

  4. 温度が制限を超えていない MQTT メッセージの送信を試みます。

    1. MQTT クライアントの [Subscription] (サブスクリプション)で、[Publish to topic] (トピックに発行) を選択します。

    2. [Publish] (発行) フィールドに、入力トピック名 device/33/data を入力します。

    3. ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。

      { "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
    4. MQTT メッセージを送信するには、[Publish to topic] (トピックに発行) を選択します。

    device/+/data サブスクリプションで送信したメッセージが表示されますが、温度値がルールクエリステートメントの最大温度を下回っているため、テキストメッセージは受信されません。

    正しい動作が確認できない場合は、トラブルシューティングのヒントを確認してください。

AWS Lambda ルールと通知のトラブルシューティング

想定する結果が得られない場合に備えて、確認すべき事項をいくつか示します。

  • エラーバナーが表示された

    入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。

  • MQTT クライアントで入力メッセージが表示されない

    手順で説明されているように device/+/data トピックフィルターをサブスクライブした場合、入力メッセージを device/32/data トピックに発行するたびに、そのメッセージが MQTT クライアントに表示されます。

    確認すべき事項

    • サブスクライブしたトピックフィルターを確認する

      手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。

      メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。

    • メッセージ発行機能を確認する

      MQTT クライアントの [Subscriptions] (サブスクリプション) で、[device/+/data] を選択し、パブリッシュ メッセージのトピックを確認してから、[Publish to topic] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。

  • SMS メッセージが届かない

    ルールが機能するには、メッセージの受信と SNS 通知の送信を許可する正しいポリシーを有しており、メッセージを受信する必要があります。

    確認すべき事項

    • MQTT クライアントの AWS リージョン と作成したルールを確認する

      MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。

    • メッセージペイロードの温度値がテストしきい値を超えていることを確認します。

      ルールクエリステートメントで定義されている温度値が 30 以下の場合、ルールはそのアクションを実行しません。

    • ルールクエリステートメントの入力メッセージのトピックを確認する

      ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。

      ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。

    • 入力メッセージペイロードの内容を確認する

      ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。

      ルールクエリステートメントの temperature フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントの temperature フィールドはメッセージペイロードの temperature フィールドと同じである必要があります。

      メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。

    • Amazon SNS 通知を確認する

      ステップ 1: SMS テキストメッセージを送信する Amazon SNS トピックを作成する では、Amazon SNS 通知をテストする方法を説明するステップ 3 を参照し、通知をテストして通知が機能することを確認します。

    • Lambda 関数を確認する

      ステップ 1: テキストメッセージを送信する AWS Lambda 関数を作成する では、テストデータを使用して Lambda 関数をテストする方法を説明するステップ 5 を参照し、Lambda 関数をテストします。

    • ルールによって使用されているロールを確認する

      ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。

      ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。

      これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。

ステップ 4: 結果と次のステップを確認する

このチュートリアルでは、次の作業を行いました。

  • カスタマイズされたメッセージペイロードを使用した Amazon SNS 通知を送信する Lambda 関数を呼び出す AWS IoT ルールを作成しました。

  • ルールクエリステートメントでシンプルな SQL クエリと関数を使用して、Lambda 関数の新しいメッセージペイロードを作成しました。

  • MQTT クライアントを使用して AWS IoT ルールをテストしました。

次のステップ

このルールを使用していくつかのテキストメッセージを送信した後、チュートリアルの一部を変更すると、メッセージと送信される場合にどのような影響があるかを試してみてください。手始めにいくつかアイデアをご紹介します。

  • をに変更device_idと入力し、テキストメッセージの内容に生じる影響を確認します。

  • ルールクエリステートメントで選択したフィールドを変更し、Lambda 関数を更新して新しいメッセージで使用し、テキストメッセージの内容に生じる影響を確認します。

  • ルールクエリステートメントのテストを変更して、最高温度ではなく最低温度をテストします。Lambda 関数を更新して新しいメッセージをフォーマットし、max_temperature の名前を変更することを忘れないでください。

  • AWS IoT ルールの開発および使用中に発生する可能性のあるエラーを見つける方法の詳細については、 のモニタリングAWS IoT を参照してください。