2023 年 6 月 30 日に AWS IoT Greengrass Version 1 は延長ライフサイクルフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日付以降、AWS IoT Greengrass V1 の機能、拡張機能、バグ修正、またはセキュリティパッチを提供するアップデートはリリースされません。AWS IoT Greengrass V1 で稼働中のデバイスは中断されず、引き続き動作し、クラウドに接続できます。重要な新機能や新たなプラットフォームのサポートが追加された AWS IoT Greengrass Version 2 への移行を強くお勧めします。
シークレットリソースを作成する方法 (コンソール)
この機能は AWS IoT Greengrass Core v1.7 以降で使用できます。
このチュートリアルでは、AWS Management Console を使用して Greengrass グループにシークレットリソースを追加する方法を示します。シークレットリソースは AWS Secrets Manager からシークレットへの参照です。詳細については、「AWS IoT Greengrass Core にシークレットをデプロイする」を参照してください。
AWS IoT Greengrass コアデバイス上のコネクタと Lambda 関数では、シークレットリソースを使用してサービスとアプリケーションの認証を行えます。パスワードやトークンといった認証情報のハードコーディングは不要です。
このチュートリアルでは、最初に AWS Secrets Manager コンソールでシークレットを作成します。次に、AWS IoT Greengrass コンソールで、グループの [Resources] (リソース) ページからシークレットリソースを Greengrass グループに追加します。このシークレットリソースは、Secrets Manager シークレットを参照します。後で、シークレットリソースを Lambda 関数にアタッチします。これにより、関数はローカルシークレットの値を取得できます。
注記
別の方法として、コネクタや Lambda 関数を設定するときに、コンソールでシークレットとシークレットリソースを作成することもできます。これはコネクタの [Configure parameters] (パラメータの設定) ページか、Lambda 関数の [Resources] (リソース) ページから実行できます。
シークレットのパラメータを含むコネクタのみがシークレットにアクセスできます。ローカルに保存された認証トークンを Twilio 通知コネクタがどのように使用するかを示すチュートリアルについては、「Greengrass コネクタの開始方法 (コンソール)」を参照してください。
このチュートリアルには、以下の手順の概要が含まれます。
このチュートリアルは完了までに約 20 分かかります。
前提条件
このチュートリアルを完了するには、以下が必要です。
-
Greengrass グループと Greengrass コア (v1.7 以降)。Greengrass のグループまたは Core を作成する方法については、「AWS IoT Greengrass の開始方法」を参照してください。開始方法チュートリアルには、AWS IoT Greengrass Core ソフトウェアのインストール手順も含まれています。
-
AWS IoT Greengrass はローカルシークレットをサポートするように設定する必要があります。詳細については、「シークレットの要件」を参照してください。
注記
この要件には、Secrets Manager シークレットへのアクセス許可が含まれます。デフォルトの Greengrass サービスロールを使用している場合、Greengrass は greengrass- で始まる名前の付いたシークレット値にアクセスできます。
-
ローカルシークレットの値を取得するには、ユーザー定義の Lambda 関数で AWS IoT Greengrass Core SDK v1.3.0 以降を使用する必要があります。
ステップ 1: Secrets Manager シークレットを作成する
この手順では、AWS Secrets Manager コンソールを使用してシークレットを作成します。
-
AWS Secrets Manager コンソール
にサインインします。 注記
このプロセスの詳細については、「AWS Secrets Manager ユーザーガイド」の「ステップ 1: AWS Secrets Manager でシークレットを作成および保存する」を参照してください。
-
[新しいシークレットを保存] を選択します。
-
[Choose secret type] (シークレットの種類を選択) で、[Other type of secrets] (他の種類のシークレット) を選択します。
-
[このシークレットに保存するキーと値のペアを指定します] で以下の操作を行います。
-
[キー] に「
test
」と入力します。 -
[Value (値)] に「
abcdefghi
」と入力します。
-
-
暗号化には aws/secretsmanager を暗号キーとして選択した状態で、[Next] (次へ) を選択します。
注記
Secrets Manager がアカウントで作成するデフォルトの AWS 管理キーを使用する場合、AWS KMS によって課金されることはありません。
-
[シークレット名] に「
greengrass-TestSecret
」と入力し、[次へ] を選択します。注記
Greengrass サービスロールのデフォルト設定では、AWS IoT Greengrass が greengrass- で始まる名前の付いたシークレットの値を取得することができます。詳細については、「シークレットの要件」を参照してください。
-
このチュートリアルではローテーションは不要であるため、[disable automatic rotation] (自動ローテーションを無効化)、Next (次へ) の順に選択します。
-
[確認] ページで、設定を確認し、[保存] を選択します。
次に、シークレットを参照する Greengrass グループにシークレットリソースを作成します。
ステップ 2: Greengrass グループにローカルシークレットリソースを追加する
この手順では、Secrets Manager シークレットを参照するグループリソースを設定します。
AWS IoT コンソールのナビゲーションペインの [Manage] (管理) で、[Greengrass devices] (Greengrass デバイス) を展開して、[Groups (V1)] (グループ (V1))を選択します。
-
シークレットリソースを追加するグループを選択します。
-
グループ設定ページの [Resources] (リソース) タブから、[Secrets] (シークレット) セクションを選択します。[Secrets] (シークレット) セクションには、グループに属するシークレットリソースが表示されます。このセクションからシークレットリソースを追加、編集、削除できます。
注記
別の方法として、コネクタや Lambda 関数を設定するときに、コンソールでシークレットとシークレットリソースを作成することもできます。これはコネクタの [Configure parameters] (パラメータの設定) ページか、Lambda 関数の [Resources] (リソース) ページから実行できます。
-
[Secrets] (シークレット) セクションから [Add] (追加) を選択します。
-
[Add a secret resource] (シークレットリソースに追加) ページで、[Resource name] (リソース名) に
MyTestSecret
を入力します。 -
[Secret] (シークレット) から[greengrass-testsecret]を選択します。
-
[Select labels (Optional)] (ラベルを選択 〔オプション〕) セクションの、AWSCURRENT ステージングラベルはシークレットの最新バージョンを表します。このラベルはシークレットリソースに常に含まれています。
注記
このチュートリアルでは、AWSCURRENT ラベルのみが必要です。オプションで、Lambda 関数またはコネクタで必要になるラベルを含めることができます。
-
[Add resource] (リソースを追加) を選択します。
ステップ 3: Lambda 関数デプロイパッケージを作成する
Lambda 関数を作成するには、関数のコードと依存関係を含む Lambda 関数デプロイパッケージを最初に作成する必要があります。Greengrass Lambda 関数には、コア環境での MQTT メッセージとの通信やローカルシークレットへのアクセスなどのタスクに使用する、AWS IoT Greengrass Core SDK が必要です。このチュートリアルでは Python 関数を作成するため、デプロイパッケージには Python 版の SDK を使用します。
注記
ローカルシークレットの値を取得するには、ユーザー定義の Lambda 関数で AWS IoT Greengrass Core SDK v1.3.0 以降を使用する必要があります。
-
AWS IoT Greengrass Core SDK のダウンロードページから、AWS IoT Greengrass Core SDK for Python をお使いのコンピュータにダウンロードします。
-
ダウンロードしたパッケージを解凍し、SDK を取得します。SDK は
greengrasssdk
フォルダです。 -
以下の Python コード関数を
secret_test.py
というローカルファイルに保存します。import greengrasssdk secrets_client = greengrasssdk.client("secretsmanager") iot_client = greengrasssdk.client("iot-data") secret_name = "greengrass-TestSecret" send_topic = "secrets/output" def function_handler(event, context): """ Gets a secret and publishes a message to indicate whether the secret was successfully retrieved. """ response = secrets_client.get_secret_value(SecretId=secret_name) secret_value = response.get("SecretString") message = ( f"Failed to retrieve secret {secret_name}." if secret_value is None else f"Successfully retrieved secret {secret_name}." ) iot_client.publish(topic=send_topic, payload=message) print("Published: " + message)
get_secret_value
関数は、SecretId
値として Secrets Manager シークレットの名前または ARN をサポートしています。この例では、シークレット名を使用しています。この例のシークレットでは、AWS IoT Greengrass がキーと値のペアとして{"test":"abcdefghi"}
を返します。重要
ユーザー定義の Lambda 関数がシークレットを安全に処理することと、シークレットに格納されている機密データをログに記録しないことを確認してください。詳細については、「AWS Secrets Manager ユーザーガイド」の「Lambda 関数のログ記録とデバッグのリスクを軽減する」を参照してください。このドキュメントでは特に回転関数について言及していますが、こうした推奨事項は Greengrass Lambda 関数にも適用されます。
-
以下の項目を
secret_test_python.zip
という名前のファイルに圧縮します。ZIP ファイルを作成するときに、コードと依存関係のみを含め、フォルダは含めません。-
secret_test.py アプリケーションロジック。
-
greengrasssdk。すべての Python Greengrass Lambda 関数に必要なライブラリ。
これが Lambda 関数デプロイパッケージです。
-
ステップ 4: Lambda 関数を作成する
このステップでは、AWS Lambda コンソールを使用して Lambda 関数を作成し、デプロイパッケージを使用するようにその関数を設定します。次に、関数のバージョンを公開し、エイリアスを作成します。
-
最初に Lambda 関数を作成します。
-
AWS Management Console で、[サービス] を選択し、AWS Lambda コンソールを開きます。
-
[Create function] (関数の作成) を選択し、[Author from scratch] (一から作成) を選択します。
-
[Basic information] セクションで、以下の値を使用します。
-
[関数名] に「
SecretTest
」と入力します。 -
[Runtime (ランタイム)] で [Python 3.7] を選択します。
-
[Permissions] (アクセス許可) はデフォルト設定のままにしておきます。これで Lambda への基本的なアクセス許可を付与する実行ロールが作成されます。このロールは、AWS IoT Greengrass によっては使用されません。
-
-
ページの下部で、[Create function] を選択します。
-
-
今度は、ハンドラを登録し、Lambda 関数デプロイパッケージをアップロードします。
-
[Code] (コード) タブの [Code source] (コードソース) で、[Upload from] (アップロード元) を選択します。ドロップダウンから [.zip file] (.zip ファイル) を選択します。
-
[Upload] (アップロード) を選択し、
secret_test_python.zip
デプロイパッケージを選択します。次に、[保存] を選択します。 -
関数の [Code] (コード) タブにある [Runtime settings] (ランタイム設定) で [Edit] (編集) を選択し、次の値を入力します。
-
[Runtime (ランタイム)] で [Python 3.7] を選択します。
-
[ハンドラ] に「
secret_test.function_handler
」と入力します。
-
-
[Save] を選択します。
注記
AWS Lambda コンソールの [Test] (テスト) ボタンは、この関数では機能しません。AWS IoT Greengrass Core SDK には、AWS Lambda コンソールで Greengrass Lambda 関数を個別に実行するために必要なモジュールは含まれていません。これらのモジュール (例えば
greengrass_common
) が関数に提供されるのは、Greengrass Core にデプロイされた後になります。
-
-
ここで、Lambda 関数の最初のバージョンを公開し、バージョンのエイリアスを作成します。
注記
Greengrass グループは、Lambda 関数をエイリアス別 (推奨) またはバージョン別に参照できます。エイリアスを使用すると、関数コードを更新する時にサブスクリプションテーブルやグループ定義を変更する必要がないため、コード更新を簡単に管理できます。その代わりに、新しい関数バージョンにエイリアスを指定するだけで済みます。
-
[SecretTest: 1] 設定ページで、[Actions (アクション)] メニューの [エイリアスの作成] を選択します。
-
[Create a new alias] ページで、次の値を使用します。
-
[名前] に
GG_SecretTest
と入力します。 -
[Version (バージョン)] で、[1] を選択します。
注記
AWS IoT Greengrass は、$LATEST バージョンの Lambda エイリアスをサポートしていません。
-
-
[Create] (作成) を選択します。
-
これで、Greengrass グループに Lambda 関数を追加し、シークレットリソースをアタッチする準備ができました。
ステップ 5: Lambda 関数を Greengrass グループに追加する
このステップでは、Lambda 関数を AWS IoT コンソールの Greengrass グループに追加します。
-
グループ設定ページで、[Lambda functions] (Lambda 関数) タブを選択します。
-
[My Lambda functions] (自分の Lambda 関数) セクションで、[Add](追加)を選択します。
-
[Lambda function] (Lambda 関数) で、[SecretTest]を選択します。
-
[Lambda function version] (Lambda 関数のバージョン) で、公開したバージョンのエイリアスを選択します。
次に、Lambda 関数のライフサイクルを設定します。
-
[Lambda function configuration] (Lambda 関数の設定) セクションで次のように更新します。
注記
ビジネスケースで要求される場合を除き、Lambda 関数を、コンテナ化を使用しないで実行することをお勧めします。これにより、デバイスリソースを設定しなくても、デバイスの GPU とカメラにアクセスできるようになります。コンテナ化を使用しないで実行する場合は、AWS IoT Greengrass Lambda 関数にもルートアクセスを付与する必要があります。
-
コンテナ化を使用せずに実行するには:
-
[System user and group] (システムユーザーとグループ) で、
Another user ID/group ID
を選択します。[System user ID] (システムユーザ ID) には、「0
」と入力します。[System group ID] (システムグループ ID) には、「0
」と入力します。これにより、Lambda 関数を root として実行できます。root として実行の詳細については、「グループ内の Lambda 関数に対するデフォルトのアクセス ID の設定」を参照してください。
ヒント
また、ルートアクセスを Lambda 関数に付与するように
config.json
ファイルを更新する必要があります。手順については、「root としての Lambda 関数の実行」を参照してください。 -
[Lambda function containerization] (Lambda 関数のコンテナ化) で、[No container] (コンテナなし) を選択します。
コンテナ化を使用しない実行の詳細については、「Lambda 関数のコンテナ化を選択する場合の考慮事項」を参照してください。
-
[Timeout (タイムアウト)] に「
10 seconds
」と入力します。 -
[Pinned] (固定)で、[True] を選択します。
詳細については、「Greengrass Lambda 関数のライフサイクル設定」を参照してください。
-
[Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。
-
-
代わりにコンテナ化モードで実行するには:
注記
ビジネスケースで要求されない限り、コンテナ化モードでの実行はお勧めしていません。
-
[System user and group] (システムユーザーとグループ) で、[Use group default] (グループのデフォルトを使用) を選択します。
-
[Lambda function containerization] (Lambda 関数のコンテナ化) で、[Use group default] (グループのデフォルトを使用) を選択します。
-
[メモリ制限] に「
1024 MB
」と入力します。 -
[Timeout (タイムアウト)] に「
10 seconds
」と入力します。 -
[Pinned] (固定)で、[True] を選択します。
詳細については、「Greengrass Lambda 関数のライフサイクル設定」を参照してください。
-
[Additional Parameter] (追加のパラメータ) の、[Read access to /sys directory] (/sys ディレクトリへの読み取りアクセス) で、[Enabled] (有効) を選択します。
-
-
-
[Add Lambda function] (Lambda 関数の追加) を選択します。
次に、シークレットリソースを関数に関連付けます。
ステップ 6: シークレットリソースを Lambda 関数にアタッチする
このステップでは、シークレットリソースを Greengrass グループの Lambda 関数に関連付けます。これで、リソースは関数に関連付けられて、ローカルシークレットの値を取得できるようになります。
-
グループ設定ページで、[Lambda functions] (Lambda 関数) タブを選択します。
-
[SecretTest] 関数を選択します。
-
関数の詳細ページで、[Resources] (リソース) を選択します。
-
シークレット セクションまでスクロールして、[Associate] (関連付け) を選択します。
-
[MyTestSecret]、[Associate] (関連付け) の順に選択します。
ステップ 7: サブスクリプションを Greengrass グループに追加する
このステップでは、AWS IoT と Lambda 関数にメッセージの交換を許可するサブスクリプションを追加します。1 つのサブスクリプションでは、AWS IoT に関数の呼び出しを許可し、もう 1 つのサブスクリプションでは、関数に AWS IoT へのデータの送信を許可します。
-
関数にメッセージを発行することを AWS IoT に許可するサブスクリプションを作成します。
グループ設定ページで、[Subscriptions] (サブスクリプション) タブ、[Add subscription] (サブスクリプションの追加) の順に選択します。
-
[Create a subscription] (サブスクリプションの作成) ページで、ソースおよびターゲットを次のように設定します。
-
[Source type] (ソースタイプ) で、[Lambda function] (Lambda 関数)、[IoT Cloud] (IoT クラウド) の順に選択します。
-
[Target type] (ターゲットタイプ) で、[Service] (サービス)、[SecretTest]の順に選択します。
-
[Topic filter] (トピックのフィルター) で、「
secrets/input
」と入力し、[Create subscription] (サブスクリプションの作成) を選択します。
-
-
2 つ目のサブスクリプションを追加します。[Subscriptions] (サブスクリプション) タブ、[Add subscription] (サブスクリプションの追加) の順に選択し、ソースとターゲットを次のように設定します。
-
[Source type] (ソースタイプ) で、[Services] (サービス)、[SecretTest]の順に選択します。
-
[Target type] (ターゲットタイプ) で、[Lambda function] (Lambda 関数)、 [IoT Cloud] (IoT クラウド) の順に選択します。
-
[Topic filter] (トピックのフィルター) で、「
secrets/output
」と入力し、[Create subscription] (サブスクリプションの作成) を選択します。
-
ステップ 8: Greengrass グループをデプロイする
Core デバイスにグループをデプロイします。デプロイ時に、AWS IoT Greengrass は Secrets Manager からシークレットの値を取り出し、暗号化されたローカルコピーを Core に作成します。
Lambda 関数をテストする
-
AWS IoT コンソールのホームページで、[Test] (テスト) を選択します。
-
[Subscribe to topic] (トピックへのサブスクライブ) で、以下の値を使用し、[Subscribe] (サブスクリプション) を選択します。
プロパティ
値
トピックのサブスクリプション
シークレット/出力
MQTT ペイロード表示
文字列としてペイロードを表示
-
[Publish to topic] (トピックに発行) で、以下の値を使用し、[Publish] (発行) を選択して関数を呼び出します。
プロパティ
値
トピック
シークレット/入力
メッセージ
デフォルトのメッセージを保持します。メッセージの発行では Lambda 関数を呼び出しますが、このチュートリアルの関数はメッセージ本文を処理しません。
成功した場合、関数は成功のメッセージを発行します。