チュートリアル: 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 コンソールが必要です。

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

    MQTT クライアントを使用してトピックをサブスクライブして公開できることを確認してください。クライアントを使用してMQTT、この手順で新しいルールをテストします。

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

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

  • AWS Lambda の概要を確認する

    AWS Lambda 以前に を使用したことがない場合は、AWS Lambda「」と「Lambda の使用開始」を確認して、その用語と概念を確認してください。

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

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

通知の送信にルールアクションチュートリアル: Amazon SNS通知の送信を使用した AWS IoT のチュートリアルとは異なり、このチュートリアルは の関数を使用して Lambda 関数から通知を送信します AWS SDK。ただし、このチュートリアルで使用される実際の 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. 実行ロール で、 AWS ポリシーテンプレート から新しいロールを作成する を選択します。

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

      4. ポリシーテンプレート - オプション で、Amazon SNS パブリッシュポリシー を検索して選択します。

      5. [Create function (関数の作成)] を選択します。

  2. Amazon SNS通知をフォーマットして送信するように設計図コードを変更します。

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

    2. format-high-temp-notification 詳細ページで、設定タブを選択し、関数コードパネルにスクロールします。

    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 リソースネーム (ARN) を検索しますチュートリアル: Amazon SNS通知の送信

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

    2. トピックページで、Amazon トピックのリストで high_temp_notice 通知SNSトピックを見つけます。

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

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

    1. コンソールの Lambda Functions ページで、format-high-temp-notification詳細ページで、ページの右上隅にあるテストイベントを選択 (無効になっているように見える場合でも) を選択し、テストイベントの設定 を選択します。

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

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

    4. イベント名 の下の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に表示されることを確認します。表示されない場合は、利用可能なテストイベントのリストから選択します。

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

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

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

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

このステップでは、ルールクエリステートメントを使用して、架空の気象センサーデバイスからのデータをフォーマットして 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 コンソール のルールハブを開きます。

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

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

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

      ルール名は AWS アカウント および リージョン内で一意でなければならず、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。

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

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

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

    1. 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

      このステートメント:

      • トピックフィルターに一致し、temperature値が 30 を超えるdevice/+/dataトピックを含む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メッセージを公開およびサブスクライブします。

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

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

    1. MQTT クライアントで、サブスクリプション で、トピック にサブスクライブを選択します。

    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 クライアントで、サブスクリプション で、トピック に発行 を選択します。

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

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

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

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

    1. MQTT クライアントでは、サブスクリプション の下に、以前にサブスクライブしたトピックの横に緑色のドットがあります。

      緑色のドットは、最後にメッセージを表示してから 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 クライアントで、サブスクリプション で、トピック に発行 を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • SMS メッセージを受信しない

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

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

      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