Greengrass コネクタの開始方法 (CLI) - AWS IoT Greengrass

AWS IoT Greengrass Version 1 は、2023 年 6 月 30 日に延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付を過ぎる AWS IoT Greengrass V1 と、 は機能、機能強化、バグ修正、セキュリティパッチを提供する更新プログラムをリリースしません。で実行されるデバイスは中断 AWS IoT Greengrass V1 されず、引き続き動作し、クラウドに接続します。に移行する AWS IoT Greengrass Version 2ことを強くお勧めします。これにより、重要な新機能が追加され、追加のプラットフォームのサポートが追加されます

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

Greengrass コネクタの開始方法 (CLI)

この機能は AWS IoT Greengrass Core v1.7 以降で使用できます。

このチュートリアルでは、AWS CLI を使用してコネクタを操作する方法を示します。

コネクタを使用して、開発ライフサイクルを短縮します。コネクタは、サービス、プロトコル、リソースとのやり取りを簡略する、あらかじめ組み込まれた再利用可能なモジュールです。それらのモジュールは、Greengrass デバイスにビジネスロジックをよりすばやくデプロイするのに役立ちます。詳細については、「Greengrass コネクタを使用したサービスおよびプロトコルとの統合」を参照してください。

このチュートリアルでは、Twilio 通知コネクタを設定してデプロイします。コネクタは Twilio メッセージ情報を入力データとして受け取り、Twilio テキストメッセージをトリガーします。データフローを以下の図に示します。

Lambda 関数から Twilio 通知コネクタ、Twilio へのデータフロー。

コネクタを設定したら、Lambda 関数とサブスクリプションを作成します。

  • この関数は、温度センサーからシミュレートされたデータを評価します。その後、Twilio メッセージ情報を条件付きで MQTT トピックに発行します。このトピックは、コネクタによってサブスクライブされます。

  • このサブスクリプションでは、関数はトピックに発行でき、コネクタはトピックからデータを受信できます。

Twilio 通知コネクタには、Twilio API とやり取りするための Twilio 認証トークンが必要です。トークンは、AWS Secrets Manager で作成されてグループリソースから参照されるテキスト形式のシークレットです。これにより、AWS IoT Greengrass は Greengrass Core にシークレットのローカルコピーを作成できます。このコピーは暗号化され、コネクタで使用可能になります。詳細については、「AWS IoT Greengrass Core にシークレットをデプロイする」を参照してください。

このチュートリアルには、以下の手順の概要が含まれます。

このチュートリアルは完了までに約 30 分かかります。

AWS IoT Greengrass API を使用する

以下のパターンを理解しておくと、Greengrass のグループとグループコンポーネント (グループのコネクタ、関数、リソースなど) を操作するときに役立ちます。

  • 階層の最上部で、コンポーネントには definition オブジェクトがあり、definition は version オブジェクトのコンテナです。同様に、version は、コネクタ、関数、などのコンポーネントタイプのコンテナです。

  • Greengrass Core にデプロイするときは、特定のグループバージョンをデプロイします。グループバージョンには、各タイプのコンポーネントの 1 つのバージョンを含めることができます。Core は必須ですが、その他はオプションです。

  • バージョンは不変なので、変更するときは新しいバージョンを作成する必要があります。

ヒント

AWS CLI コマンドの実行時にエラーが発生した場合は、--debug パラメータを追加し、コマンドを再実行して、エラーに関する詳細情報を入手します。

AWS IoT Greengrass API を使用すると、コンポーネントタイプの複数の定義を作成できます。例えば、FunctionDefinitionVersion を作成するたびに FunctionDefinition オブジェクトを作成することも、既存の定義に新しいバージョンを追加することもできます。この柔軟性により、バージョニングシステムをカスタマイズできます。

前提条件

このチュートリアルを完了するには、以下が必要です。

  • Greengrass グループと Greengrass コア (v1.9.3 以降)。Greengrass のグループまたは Core を作成する方法については、「AWS IoT Greengrass の開始方法」を参照してください。開始方法チュートリアルには、AWS IoT Greengrass Core ソフトウェアのインストール手順も含まれています。

  • Python 3.7 は AWS IoT Greengrass コアデバイスにインストールされています。

  • シークレットの要件で説明されているように、AWS IoT Greengrass はローカルシークレットをサポートするように設定する必要があります。

    注記

    この要件には、Secrets Manager シークレットへのアクセス許可が含まれます。デフォルトの Greengrass サービスロールを使用している場合、Greengrass は greengrass- で始まる名前の付いたシークレット値にアクセスできます。

  • Twilio アカウントの SID、認証トークン、Twilio 対応の電話番号。Twilio プロジェクトを作成した後、これらの値をプロジェクトダッシュボードで使用できます。

    注記

    Twilio トライアルアカウントを使用できます。トライアルアカウントを使用している場合は、Twilio 以外の受信者の電話番号を、確認済みの電話番号リストに追加する必要があります。詳細については、「無料の Twilio トライアルアカウントを使用する方法」を参照してください。

  • コンピュータにインストールされて設定されている AWS CLI。詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS Command Line Interface のインストール」および「AWS CLI の設定」を参照してください。

     

    このチュートリアルの例は、Linux やその他の Unix ベースのシステム向けに書かれています。Windows を使用している場合、構文の違いについては、「AWS Command Line Interface のパラメータ値の指定」を参照してください。

    コマンドに JSON 文字列が含まれている場合、このチュートリアルでは、1 行形式の JSON の例を示しています。システムによっては、この形式を使用したほうが、コマンドの編集と実行が容易になる場合があります。

ステップ 1: Secrets Manager シークレットを作成する

このステップでは、AWS Secrets Manager API を使用して Twilio 認証トークンのシークレットを作成します。

  1. まず、シークレットを作成します。

    • twilio-auth-token を Twilio 認証トークンに置き換えます。

    aws secretsmanager create-secret --name greengrass-TwilioAuthToken --secret-string twilio-auth-token
    注記

    Greengrass サービスロールのデフォルト設定では、AWS IoT Greengrass が greengrass- で始まる名前の付いたシークレットの値を取得することができます。詳細については、「シークレットの要件」を参照してください。

  2. 出力からシークレットの ARN をコピーします。この情報は、シークレットリソースの作成時と Twilio 通知コネクタの設定時に使用します。

ステップ 2: リソースの定義とバージョンを作成する

このステップでは、AWS IoT Greengrass API を使用して Secrets Manager シークレットのシークレットリソースを作成します。

  1. 初期バージョンを含むリソース定義を作成します。

    • secret-arn を、前のステップでコピーしたシークレットの ARN に置き換えます。

     

    JSON Expanded
    aws greengrass create-resource-definition --name MyGreengrassResources --initial-version '{ "Resources": [ { "Id": "TwilioAuthToken", "Name": "MyTwilioAuthToken", "ResourceDataContainer": { "SecretsManagerSecretResourceData": { "ARN": "secret-arn" } } } ] }'
    JSON Single-line
    aws greengrass create-resource-definition \ --name MyGreengrassResources \ --initial-version '{"Resources": [{"Id": "TwilioAuthToken", "Name": "MyTwilioAuthToken", "ResourceDataContainer": {"SecretsManagerSecretResourceData": {"ARN": "secret-arn"}}}]}'
  2. 出力からリソース定義の LatestVersionArn をコピーします。この値を使用して、Core にデプロイするグループバージョンに、リソース定義バージョンを追加します。

ステップ 3: コネクタの定義とバージョンを作成する

このステップでは、Twilio 通知コネクタのパラメータを設定します。

  1. コネクタの定義と初期バージョンを作成します。

    • account-sid を Twilio アカウントの SID に置き換えます。

    • secret-arn を Secrets Manager シークレットの ARN に置き換えます。コネクタではこの ARN を使用してローカルシークレットの値を取得します。

    • phone-number を Twilio 対応の電話番号に置き換えます。Twilio はこの番号を使用してテキストメッセージを開始します。このメッセージは入力メッセージのペイロードで上書きできます。形式は以下のようになります: +19999999999

     

    JSON Expanded
    aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyTwilioNotificationsConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4", "Parameters": { "TWILIO_ACCOUNT_SID": "account-sid", "TwilioAuthTokenSecretArn": "secret-arn", "TwilioAuthTokenSecretArn-ResourceId": "TwilioAuthToken", "DefaultFromPhoneNumber": "phone-number" } } ] }'
    JSON Single-line
    aws greengrass create-connector-definition \ --name MyGreengrassConnectors \ --initial-version '{"Connectors": [{"Id": "MyTwilioNotificationsConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4", "Parameters": {"TWILIO_ACCOUNT_SID": "account-sid", "TwilioAuthTokenSecretArn": "secret-arn", "TwilioAuthTokenSecretArn-ResourceId": "TwilioAuthToken", "DefaultFromPhoneNumber": "phone-number"}}]}'
    注記

    TwilioAuthToken は、前のステップでシークレットリソースの作成に使用した ID です。

  2. 出力からコネクタ定義の LatestVersionArn をコピーします。この値を使用して、Core にデプロイするグループバージョンに、コネクタ定義バージョンを追加します。

ステップ 4: Lambda 関数デプロイパッケージを作成する

Lambda 関数を作成するには、関数のコードと依存関係を含む Lambda 関数デプロイパッケージを最初に作成する必要があります。Greengrass Lambda 関数には、コア環境での MQTT メッセージとの通信やローカルシークレットへのアクセスなどのタスクに使用する、AWS IoT Greengrass Core SDK が必要です。このチュートリアルでは Python 関数を作成するため、デプロイパッケージには Python 版の SDK を使用します。

  1. AWS IoT Greengrass Core SDK のダウンロードページから、AWS IoT Greengrass Core SDK for Python をお使いのコンピュータにダウンロードします。

  2. ダウンロードしたパッケージを解凍し、SDK を取得します。SDK は greengrasssdk フォルダです。

  3. 以下の Python コード関数を temp_monitor.py というローカルファイルに保存します。

    import greengrasssdk import json import random client = greengrasssdk.client('iot-data') # publish to the Twilio Notifications connector through the twilio/txt topic def function_handler(event, context): temp = event['temperature'] # check the temperature # if greater than 30C, send a notification if temp > 30: data = build_request(event) client.publish(topic='twilio/txt', payload=json.dumps(data)) print('published:' + str(data)) print('temperature:' + str(temp)) return # build the Twilio request from the input data def build_request(event): to_name = event['to_name'] to_number = event['to_number'] temp_report = 'temperature:' + str(event['temperature']) return { "request": { "recipient": { "name": to_name, "phone_number": to_number, "message": temp_report } }, "id": "request_" + str(random.randint(1,101)) }
  4. 以下の項目を temp_monitor_python.zip という名前のファイルに圧縮します。ZIP ファイルを作成するときは、コードおよび依存関係のみを含め、フォルダは含めません。

    • temp_monitor.py。アプリケーションロジック。

    • greengrasssdk。MQTT メッセージを発行する Python Greengrass Lambda 関数で必須のライブラリ。

    これが Lambda 関数デプロイパッケージです。

ステップ 5: Lambda 関数を作成する

ここでは、デプロイパッケージを使用する Lambda 関数を作成します。

  1. 関数の作成時に ARN を渡せるように、IAM ロールを作成します。

    JSON Expanded
    aws iam create-role --role-name Lambda_empty --assume-role-policy '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
    JSON Single-line
    aws iam create-role --role-name Lambda_empty --assume-role-policy '{"Version": "2012-10-17", "Statement": [{"Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"},"Action": "sts:AssumeRole"}]}'
    注記

    AWS IoT Greengrass はこのロールを使用しません。Greengrass Lambda 関数に対するアクセス許可は Greengrass グループロールで指定するためです。このチュートリアルでは、空のロールを作成します。

  2. 出力から Arn をコピーします。

  3. AWS Lambda API を使用して TempMonitor 関数を作成します。以下のコマンドでは、zip ファイルが現在のディレクトリにあるとします。

    • role-arn を、コピーした Arn に置き換えます。

    aws lambda create-function \ --function-name TempMonitor \ --zip-file fileb://temp_monitor_python.zip \ --role role-arn \ --handler temp_monitor.function_handler \ --runtime python3.7
  4. 関数のバージョンを発行します。

    aws lambda publish-version --function-name TempMonitor --description 'First version'
  5. 発行されるバージョンのエイリアスを作成します。

    Greengrass グループは、Lambda 関数をエイリアス別 (推奨) またはバージョン別に参照できます。エイリアスを使用すると、関数コードを更新する時にサブスクリプションテーブルやグループ定義を変更する必要がないため、コード更新を簡単に管理できます。その代わりに、新しい関数バージョンにエイリアスを指定するだけで済みます。

    注記

    AWS IoT Greengrass は、$LATEST バージョンの Lambda エイリアスをサポートしていません。

    aws lambda create-alias --function-name TempMonitor --name GG_TempMonitor --function-version 1
  6. 出力から AliasArn をコピーします。この値は、AWS IoT Greengrass の関数を設定するとき、およびサブスクリプションを作成するときに使用します。

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

ステップ 6: 関数の定義とバージョンを作成する

AWS IoT Greengrass Core で Lambda 関数を使用するには、エイリアスで Lambda 関数を参照する関数定義バージョンを作成し、グループレベルの設定を定義します。詳細については、「グループ固有の設定による Greengrass Lambda 関数の実行の制御」を参照してください。

  1. 初期バージョンを含む関数定義を作成します。

    • alias-arn を、エイリアスの作成時にコピーした AliasArn に置き換えます。

     

    JSON Expanded
    aws greengrass create-function-definition --name MyGreengrassFunctions --initial-version '{ "Functions": [ { "Id": "TempMonitorFunction", "FunctionArn": "alias-arn", "FunctionConfiguration": { "Executable": "temp_monitor.function_handler", "MemorySize": 16000, "Timeout": 5 } } ] }'
    JSON Single-line
    aws greengrass create-function-definition \ --name MyGreengrassFunctions \ --initial-version '{"Functions": [{"Id": "TempMonitorFunction", "FunctionArn": "alias-arn", "FunctionConfiguration": {"Executable": "temp_monitor.function_handler", "MemorySize": 16000,"Timeout": 5}}]}'
  2. 出力から LatestVersionArn をコピーします。この値を使用して、Core にデプロイするグループバージョンに、関数定義バージョンを追加します。

  3. 出力から Id をコピーします。この値は、後でその関数を更新するときに使用します。

ステップ 7: サブスクリプションの定義とバージョンを作成する

このステップでは、Lambda 関数にコネクタへの入力データの送信を許可するサブスクリプションを追加します。コネクタは、サブスクライブする MQTT トピックを定義しているため、このサブスクリプションはそのいずれかのトピックを使用します。これは、サンプル関数が発行するのと同じトピックです。

このチュートリアルでは、AWS IoT からのシミュレート温度値の受信を関数に許可し、コネクタからのステータス情報の受信を AWS IoT に許可するサブスクリプションも作成します。

  1. サブスクリプションを含む初期バージョンでサブスクリプション定義を作成します。

    • alias-arn を、関数のエイリアスの作成時にコピーした AliasArn に置き換えます。この ARN を両方のサブスクリプションに使用します。

     

    JSON Expanded
    aws greengrass create-subscription-definition --initial-version '{ "Subscriptions": [ { "Id": "TriggerNotification", "Source": "alias-arn", "Subject": "twilio/txt", "Target": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4" }, { "Id": "TemperatureInput", "Source": "cloud", "Subject": "temperature/input", "Target": "alias-arn" }, { "Id": "OutputStatus", "Source": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4", "Subject": "twilio/message/status", "Target": "cloud" } ] }'
    JSON Single-line
    aws greengrass create-subscription-definition \ --initial-version '{"Subscriptions": [{"Id": "TriggerNotification", "Source": "alias-arn", "Subject": "twilio/txt", "Target": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4"},{"Id": "TemperatureInput", "Source": "cloud", "Subject": "temperature/input", "Target": "alias-arn"},{"Id": "OutputStatus", "Source": "arn:aws:greengrass:region::/connectors/TwilioNotifications/versions/4", "Subject": "twilio/message/status", "Target": "cloud"}]}'
  2. 出力から LatestVersionArn をコピーします。この値を使用して、Core にデプロイするグループバージョンに、サブスクリプション定義バージョンを追加します。

ステップ 8: グループバージョンを作成する

デプロイするすべての項目を含むグループバージョンを作成する準備が整いました。ここでは、各コンポーネントタイプのターゲットバージョンを参照するグループバージョンを作成します。

まず、Core 定義バージョンのグループ ID と ARN を取得します。これらの値は、グループバージョンを作成するために必要です。

  1. グループ ID と最新のグループバージョンを取得します。

    1. ターゲットの Greengrass グループとグループのバージョンの ID を取得します。この手順では、これが最新のグループおよびグループのバージョンであると仮定します。次のクエリは、最後に作成されたグループを返します。

      aws greengrass list-groups --query "reverse(sort_by(Groups, &CreationTimestamp))[0]"

      または、名前でクエリを実行することもできます。グループ名は一意である必要はないため、複数のグループが返されることがあります。

      aws greengrass list-groups --query "Groups[?Name=='MyGroup']"
      注記

      これらの値は AWS IoT コンソールにもあります。グループ ID は、グループの [Settings (設定)] ページに表示されます。グループバージョン ID は、グループの [Deployments] (デプロイ) タブに表示されます。

    2. 出力からターゲットグループの Id をコピーします。この情報は、Core 定義バージョンの取得時とグループのデプロイ時に使用します。

    3. 出力から LatestVersion をコピーします。これは、グループに追加された最後のバージョンの ID です。この情報は、Core 定義バージョンの取得時に使用します。

  2. Core 定義バージョンの ARN を取得します。

    1. グループバージョンを取得します。このステップでは、最新のグループバージョンに Core 定義バージョンが含まれているものとします。

      • group-id を、グループのコピー済み Id に置き換えます。

      • group-version-id を、グループのコピー済み LatestVersion に置き換えます。

      aws greengrass get-group-version \ --group-id group-id \ --group-version-id group-version-id
    2. 出力から CoreDefinitionVersionArn をコピーします。

  3. グループバージョンを作成します。

    • group-id を、グループのコピー済み Id に置き換えます。

    • core-definition-version-arn を、Core 定義バージョンのコピー済み CoreDefinitionVersionArn に置き換えます。

    • resource-definition-version-arn を、リソース定義のコピー済み LatestVersionArn に置き換えます。

    • connector-definition-version-arn を、コネクタ定義のコピー済み LatestVersionArn に置き換えます。

    • function-definition-version-arn を、関数定義のコピー済み LatestVersionArn に置き換えます。

    • subscription-definition-version-arn を、サブスクリプション定義のコピー済み LatestVersionArn に置き換えます。

    aws greengrass create-group-version \ --group-id group-id \ --core-definition-version-arn core-definition-version-arn \ --resource-definition-version-arn resource-definition-version-arn \ --connector-definition-version-arn connector-definition-version-arn \ --function-definition-version-arn function-definition-version-arn \ --subscription-definition-version-arn subscription-definition-version-arn
  4. 出力から Version の値をコピーします。これはグループバージョンの ID です。この値を使用して、グループバージョンをデプロイします。

ステップ 9: デプロイを作成する

Core デバイスにグループをデプロイします。

  1. Core デバイスのターミナルで、AWS IoT Greengrass デーモンが実行されていることを確認します。

    1. デーモンが実行中であるかどうかを確認するには

      ps aux | grep -E 'greengrass.*daemon'

      出力に root/greengrass/ggc/packages/1.11.6/bin/daemon エントリが含まれる場合、デーモンは実行されています。

    2. 次のようにしてデーモンを開始します。

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. デプロイメントを作成する。

    • group-id を、グループのコピー済み Id に置き換えます。

    • 新しいグループバージョンにコピーした group-version-idVersion を置換えます。

    aws greengrass create-deployment \ --deployment-type NewDeployment \ --group-id group-id \ --group-version-id group-version-id
  3. 出力から DeploymentId をコピーします。

  4. デプロイのステータスを取得します。

    • group-id を、グループのコピー済み Id に置き換えます。

    • deployment-id を、デプロイのコピー済み DeploymentId に置き換えます。

    aws greengrass get-deployment-status \ --group-id group-id \ --deployment-id deployment-id

    ステータスが Success の場合、デプロイは成功しています。トラブルシューティングヘルプについては、AWS IoT Greengrass のトラブルシューティング を参照してください。

ソリューションをテストする

  1. AWS IoT コンソールのホームページで、[Test] (テスト) を選択します。

  2. [Subscribe to topic] (トピックへのサブスクライブ) で、以下の値を使用し、[Subscribe] (サブスクリプション) を選択します。Twilio 通知コネクタはこのトピックにステータス情報を発行します。

    プロパティ

    トピックのサブスクリプション

    twilio/message/status

    MQTT ペイロード表示

    文字列としてペイロードを表示

  3. [Publish to topic] (トピックに発行) で、以下の値を使用し、[Publish] (発行) を選択して関数を呼び出します。

    プロパティ

    トピック

    temperature/input

    Message

    recipient-name は名前に、recipient-phone-number はテキストメッセージの受取人の電話番号に置き換えます。例: +12345000000

    { "to_name": "recipient-name", "to_number": "recipient-phone-number", "temperature": 31 }

    トライアルアカウントを使用している場合は、Twilio 以外の受信者の電話番号を、確認済みの電話番号リストに追加する必要があります。詳細については、「個人の電話番号を認証する」を参照してください。

    正しく実行できていれば、受信者にテキストメッセージが届き、コンソールの出力データsuccess のステータスが表示されます。

    ここでは、入力メッセージの temperature29 に変更して発行します。これは 30 未満であるため、TempMonitor 関数は Twilio メッセージをトリガーしません。

以下も参照してください。