

サポート終了通知: 2026 年 10 月 7 日、 AWS はサポートを終了します AWS IoT Greengrass Version 1。2026 年 10 月 7 日以降、 AWS IoT Greengrass V1 リソースにアクセスできなくなります。詳細については、[「 からの移行 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)」を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# モジュール 3 (パート 2): での Lambda 関数 AWS IoT Greengrass
<a name="module3-II"></a>

このモジュールでは、 AWS IoT Greengrass コアで実行されているオンデマンドの Lambda 関数と存続期間の長い Lambda 関数の違いについて説明します。

開始する前に、[Greengrass Device Setup](quick-start.md) スクリプトを実行するか、[モジュール 1](module1.md)、[モジュール 2](module2.md)、および[モジュール 3 (パート 1)](module3-I.md) を完了していることを確認します。

このモジュールは完了までに約 30 分かかります。

**Topics**
+ [Lambda 関数の作成とパッケージ化](package.md)
+ [の存続期間の長い Lambda 関数を設定する AWS IoT Greengrass](long-lived.md)
+ [存続期間の長い Lambda 関数のテスト](long-testing.md)
+ [オンデマンド Lambda 関数のテスト](on-demand.md)

# Lambda 関数の作成とパッケージ化
<a name="package"></a>

このステップでは、次の操作を行います。
+ Lambda 関数コードと依存関係を含む関数デプロイパッケージを作成します。
+ Lambda コンソールを使用して Lambda 関数を作成し、デプロイパッケージをアップロードします。
+ Lambda 関数のバージョンを発行し、そのバージョンを指すエイリアスを作成します。

 

1. コンピュータで、モジュール 3-1 の [Lambda 関数の作成とパッケージ化](create-lambda.md)でダウンロードして抽出した AWS IoT Greengrass Core SDK for Python に移動します。

   このモジュールの Lambda 関数では、以下を使用します。
   + `examples\HelloWorldCounter` の `greengrassHelloWorldCounter.py` ファイル。このファイルに、Lambda 関数コードが記述されています。
   + `greengrasssdk` フォルダ。これは SDK です。

1. Lambda 関数デプロイパッケージを作成します。

   1. `greengrassHelloWorldCounter.py` を含む `HelloWorldCounter` フォルダに `greengrasssdk` フォルダをコピーします。

   1. `greengrassHelloWorldCounter.py` と `greengrasssdk` フォルダを `hello_world_counter_python_lambda.zip` という名前の `zip` ファイルに保存します。`py` ファイルと `greengrasssdk` フォルダはディレクトリのルートにある必要があります。  
![\[zip 圧縮された hello_word_counter_python_lambda.zip の内容を示すスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-046.png)

      `zip` をインストールしたUNIX 互換システム (Mac のターミナルを含む) の場合は、次のコマンドを使用してファイルとフォルダをパッケージ化できます。

      ```
      zip -r hello_world_counter_python_lambda.zip greengrasssdk greengrassHelloWorldCounter.py
      ```

   これで、Lambda 関数を作成して、デプロイパッケージをアップロードする準備ができました。

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

1. **Author from scratch** (製作者を最初から) を選択します。

1. 関数に **Greengrass\$1HelloWorld\$1Counter** という名前を付け、残りのフィールドを以下のように設定します。
   + **[ランタイム]** で **[Python 3.7]** を選択します。
   + **[アクセス許可]** はデフォルト設定のままにしておきます。これで Lambda への基本的なアクセス許可を付与する実行ロールが作成されます。このロールは では使用されません AWS IoT Greengrass。または、モジュール 3-1 で作成したロールを再利用することもできます。

   [**Create function** (関数の作成)] を選択します。  
![\[[Function name] (関数名) フィールドが [Greengrass_HelloWorld] に設定され、[Runtime] (ランタイム) フィールドが [Python 3.7] に設定された [Basic information] (基本情報) セクション。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-023-3.png)

1. Lambda 関数のデプロイパッケージをアップロードします。

   1. <a name="lambda-console-upload"></a>**[Code]** (コード) タブの **[Code source]** (コードソース) で、**[Upload from]** (アップロード元) を選択します。ドロップダウンから **[.zip ファイル]** を選択します。  
![\[[.zip ファイル] が強調表示された [アップロード元] ドロップダウンリスト。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. **[アップロード]** を選択し、`hello_world_counter_python_lambda.zip` デプロイパッケージを選択します。次に、**[保存]** を選択します。

   1. <a name="lambda-console-runtime-settings-para"></a>関数の **[Code]** (コード) タブにある **[Runtime settings]** (ランタイム設定) で **[Edit]** (編集) を選択し、次の値を入力します。
      + **[ランタイム]** で **[Python 3.7]** を選択します。
      + **[ハンドラ]** に **greengrassHelloWorldCounter.function\$1handler** と入力します。

   1. <a name="lambda-console-save-config"></a>[**Save**] を選択します。
**注記**  
 AWS Lambda コンソールの**テスト**ボタンは、この関数では機能しません。 AWS IoT Greengrass Core SDK には、Greengrass Lambda 関数を AWS Lambda コンソールで個別に実行するために必要なモジュールは含まれていません。これらのモジュール (例えば `greengrass_common`) が関数に提供されるのは、Greengrass Core にデプロイされた後になります。

1. 関数の最初のバージョンを発行します。

   1. ページの上部の **[Actions]** (アクション) メニューから、**[Publish new version]** (新しいバージョンを発行) を選択します。[**バージョンの説明**] に「**First version**」と入力します。

   1. **[発行]** を選択します。

1. 関数バージョンのエイリアスを作成します。

   1. ページ上部の **[Actions]** (アクション) メニューから、**[Create alias]** (エイリアスの作成) を選択します。  
![\[[エイリアスの作成] に設定された [アクション] メニューのスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-028.png)

   1. **[名前]** に **GG\$1HW\$1Counter** と入力します。

   1. **[バージョン]** で、**[1]** を選択します。

   1. [**Save**] を選択します。  
![\[[Name] (名前) フィールドが [GG_HW_Counter] に設定され、[Version] (バージョン) フィールドが [1] に設定された、[Create alias] (エイリアスの作成) のスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-048.png)

   エイリアスは、Greengrass デバイスがサブスクライブできる Lambda 関数の単一のエンティティを作成します。この方法では、関数が変更されるたびにサブスクリプションを新しい Lambda 関数バージョン番号で更新する必要がありません。

# の存続期間の長い Lambda 関数を設定する AWS IoT Greengrass
<a name="long-lived"></a>

これで、 AWS IoT Greengrassの Lambda 関数を設定する準備が整いました。

1. <a name="console-gg-groups"></a> AWS IoT コンソールナビゲーションペインの**「管理**」で **Greengrass デバイス**を展開し、**「グループ (V1)**」を選択します。

1. **[Greengrass groups]** (Greengrass グループ) で、[モジュール 2](module2.md) で作成したグループを選択します。

1. グループ設定ページで、**[Lambda functions]** (Lambda 関数) タブを選択し、**[My Lambda functions]** (自分の Lambda 関数) で **[Add]** (追加)を選択します。

1. **[Lambda function]** (Lambda 関数) から**[Greengrass\$1HelloWorld\$1Counter]** を選択します。

1. **Lambda 関数のバージョン**で、公開したバージョンのエイリアスを選択します。

1. **[Timeout (seconds)]** (タイムアウト (秒)) には、**25** と入力します。この Lambda 関数は、各呼び出しの前に 20 秒間スリープします。

1. **[Pinned]** (固定) で、**[True]** を選択します。

1. 他のすべてのフィールドではデフォルト値を保持し、**[Add Lambda function]** (Lambda 関数を追加) を選択します。

# 存続期間の長い Lambda 関数のテスト
<a name="long-testing"></a>

*[存続期間の長い](lambda-functions.md#lambda-lifecycle)* Lambda 関数は、 AWS IoT Greengrass コアが 1 つのコンテナ (またはサンドボックス) で起動して実行されると自動的に起動します。関数ハンドラの外部で定義される変数と事前処理ロジックは、この関数ハンドラの毎回の呼び出しのために保持されます。ハンドラ関数の複数の呼び出しは、前の呼び出しが実行されるまでキューに入れられます。

 このモジュールで使用される `greengrassHelloWorldCounter.py` コードは、関数ハンドラの外部で `my_counter` 変数を定義します。

**注記**  
コードは、 AWS Lambda コンソールまたは GitHub の [AWS IoT Greengrass Core SDK for Python ](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py)で表示できます。

このステップでは、Lambda 関数と が MQTT メッセージを AWS IoT 交換できるようにするサブスクリプションを作成します。その後、グループをデプロイして関数をテストします。

1. グループの設定ページで **[Subscriptions]** (サブスクリプション)、**[Add]** (追加) の順に選択します。

1. **[Source type]** (ソースのタイプ) で、**[Lambda function]** (Lambda 機能) を選択し、次に **[Greengrass\$1HelloWorld\$1Counter]** を選択します。

1. **[Target type]** (ターゲットタイプ) から、**[Service]** (サービス)、**[IoT Cloud]** (IoT クラウド) の順に選択します。

1. [**トピックのフィルター**] に「**hello/world/counter**」と入力します。

1. [**Create subscription**] を選択します。

   この単一のサブスクリプションは、Lambda 関数から への 1 `Greengrass_HelloWorld_Counter` つの方向にのみ移行します AWS IoT。この Lambda 関数をクラウドから呼び出す (またはトリガーする) には、反対方向のサブスクリプションを作成する必要があります。

1. 以下の値を使用する別のサブスクリプションを追加するには、ステップ 1 ～ 5 に従ってください。このサブスクリプションにより、Lambda 関数は AWS IoTからのメッセージを受信することができます。このサブスクリプションは、 AWS IoT 関数を呼び出すコンソールからメッセージを送信するときに使用します。
   + ソースは、**[Service]** (サービス)、**[IoT Cloud]** (IoT クラウド) の順に選択します。
   + ターゲットは、**[Lambda function]** (Lambda 関数)、**[Greengrass\$1HelloWorld\$1Counter]** の順に選択します。
   + [トピックのフィルター] に「**hello/world/counter/trigger**」と入力します。

   このトピックのフィルターで `/trigger` 拡張を使用しているのは、2 つ作成したサブスクリプション間で相互の干渉を避けるためです。

1. 「[コアデバイスへのクラウド設定のデプロイ](configs-core.md)」の説明に従って Greengrass デーモンが実行されていることを確認します。

1. <a name="console-actions-deploy"></a>グループ設定ページで、**[Deploy]** (デプロイ) を選択します。

1. <a name="console-test-after-deploy"></a>デプロイが完了したら、 AWS IoT コンソールのホームページに戻り、**テスト**を選択します。

1. 以下のフィールドを設定します。
   + [**Subscription topic (サブスクリプショントピック)**] で、**hello/world/counter** と入力します。
   + [**サービスの品質**] で [**0**] を選択します。
   + [**MQTT ペイロード表示**] で、[**ペイロードを文字列として表示 (より正確)**] を選択します。

1. **[サブスクライブ]** を選択します。

   このモジュールの[パート 1](module3-I.md) とは異なり、`hello/world/counter` へのサブスクライブ後にメッセージは表示されません。これは、`hello/world/counter` トピックに発行する `greengrassHelloWorldCounter.py` コードが、関数が呼び出されたときにのみ実行される関数ハンドラの内部にあるためです。

   このモジュールでは、`hello/world/counter/trigger` トピックで MQTT メッセージを受信したときに呼び出される `Greengrass_HelloWorld_Counter` Lambda 関数を設定しました。

   [**Greengrass\$1HelloWorld\$1Counter**] から [**IoT クラウド**] へのサブスクリプションにより、この関数は `hello/world/counter` トピックで AWS IoT にメッセージを送信できます。**IoT Cloud** to **Greengrass\$1HelloWorld\$1Counter** サブスクリプションにより AWS IoT 、 は`hello/world/counter/trigger`トピックの 関数にメッセージを送信できます。

1. 存続期間の長いライフサイクルをテストするには、`hello/world/counter/trigger` トピックにメッセージを発行することで、Lambda 関数を呼び出します。デフォルトのメッセージを使用できます。  
![\[トピックへの発行ボタンが強調表示されたhello/world/counter/trigger に送信された AWS IoT コンソールメッセージからのデフォルトの Hello。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-057.png)
**注記**  
 この `Greengrass_HelloWorld_Counter` 関数は、受信したメッセージの内容を無視します。`function_handler` のコードを実行するだけで、`hello/world/counter` トピックにメッセージが送信されます。このコードは、GitHub の「[AWS IoT Greengrass Core SDK for Python](https://github.com/aws/aws-greengrass-core-sdk-python/blob/master/examples/HelloWorldCounter/greengrassHelloWorldCounter.py)」から確認できます。

`hello/world/counter/trigger` トピックにメッセージが発行されるたびに、`my_counter` 変数が増分されます。この呼び出し回数は、Lambda 関数から送信されたメッセージに示されています。関数ハンドラーには 20 秒のスリープサイクル (`time.sleep(20)`) が含まれているため、ハンドラーを繰り返しトリガーすると、 AWS IoT Greengrass コアからのレスポンスがキューに入れられます。

![\[1、2、そして 3 と [呼び出しカウント] の増分を示すスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-058.png)


# オンデマンド Lambda 関数のテスト
<a name="on-demand"></a>

*[オンデマンド](lambda-functions.md#lambda-lifecycle)* Lambda 関数は、クラウドベースの AWS Lambda 関数と似ています。オンデマンド Lambda 関数の複数の呼び出しは、同時に実行できます。Lambda 関数の呼び出しは、呼び出し処理に別のコンテナを作成するか、あるいは、リソースで許可される場合には、既存のコンテナを再使用します。関数ハンドラの外部で定義される変数や前処理は、作成したコンテナには保持されません。

1. グループ設定ページで、**[Lambda functions]** (Lambda 関数) タブを選択します。

1. **[My Lambda functions]** (自分の Lambda 関数)で、**Greengrass\$1HelloWorld\$1Counter**[Lambda function](Lambda 関数) を選択します。

1. **Greengrass\$1HelloWorld\$1Counter** [details](詳細) ページで、**[Edit]** (編集) を選択します。

1. **[Pinned]** (固定) で、**[False]**、**[Save]** (保存) の順に選択します。

1. <a name="console-actions-deploy"></a>グループ設定ページで、**[Deploy]** (デプロイ) を選択します。

1. <a name="console-test-after-deploy"></a>デプロイが完了したら、 AWS IoT コンソールのホームページに戻り、**テスト**を選択します。

1. 以下のフィールドを設定します。
   + [**Subscription topic (サブスクリプショントピック)**] で、**hello/world/counter** と入力します。
   + [**サービスの品質**] で [**0**] を選択します。
   + [**MQTT ペイロード表示**] で、[**ペイロードを文字列として表示 (より正確)**] を選択します。  
![\[[サブスクリプションテスト] ページのスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-056.png)

1. **[サブスクライブ]** を選択します。
**注記**  
サブスクリプション後にメッセージは表示されません。

1. オンデマンドのライフサイクルをテストするには、`hello/world/counter/trigger` トピックにメッセージを発行することで、関数を呼び出します。デフォルトのメッセージを使用できます。

   1. ボタンを押すたびに 5 秒以内に、**[Publish]** (発行) を 3 回すばやく選択します。  
![\[すばやく 3 回クリックする必要がある [トピックに発行] ボタンを示すスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-063.png)

      発行ごとに、関数ハンドラが呼び出され、各呼び出しのコンテナが作成されます。各オンデマンド Lambda 関数に独自のコンテナ/サンドボックスがあるため、3 回関数をトリガーしても呼び出しカウントが増分されることはありません。  
![\[[呼び出しカウント] が 1 で固定されていることを示すスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-064.png)

   1. 約 30 秒待機してから [**トピックに発行**] を選択します。呼び出しカウントを 2 に増分する必要があります。これは、前の呼び出しで以前に作成されたコンテナが再利用されており、関数ハンドラの外部の前処理変数が保存されていることを示しています。  
![\[[呼び出しカウント] が現在 2 であることを示すスクリーンショット。\]](http://docs.aws.amazon.com/ja_jp/greengrass/v1/developerguide/images/gg-get-started-065.png)

これで、 AWS IoT Greengrass コア上で実行できる 2 つのタイプの Lambda 関数を理解しました。次のモジュールである[モジュール 4](module4.md) では、ローカル IoT デバイスが AWS IoT Greengrass グループ内でどのようにやり取りできるかを示します。