AWS コマンドラインインターフェイスを使用してローカルリソースアクセスを設定する方法 - 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ことを強くお勧めします。これにより、重要な新機能が追加され、追加のプラットフォームのサポートが追加されます

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

AWS コマンドラインインターフェイスを使用してローカルリソースアクセスを設定する方法

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

ローカルリソースを使用するには、Greengrass Core デバイスにデプロイされたグループ定義にリソース定義を追加する必要があります。グループ定義には、Lambda 関数にローカルリソースに対するアクセス権限を付与する Lambda 関数定義も含める必要があります。要件と制約を含む詳細については、「Lambda 関数とコネクタを使用してローカルリソースにアクセスする」を参照してください。

このチュートリアルでは、AWS Command Line Interface (CLI) を使用してローカルリソースを作成し、そのリソースへのアクセスを設定するプロセスについて説明します。このチュートリアルのステップを実行するには、「AWS IoT Greengrass の開始方法」で説明するように、Greengrass グループをすでに作成している必要があります。

AWS Management Console を使用するチュートリアルについては、「AWS Management Console を使用したローカルリソースアクセスを設定する方法」を参照してください。

ローカルリソースの作成

まず、CreateResourceDefinition コマンドを使用して、アクセス先のリソースを指定するリソース定義を作成します。この例では、2 つのリソースとして TestDirectoryTestCamera を作成します。

aws greengrass create-resource-definition --cli-input-json '{ "Name": "MyLocalVolumeResource", "InitialVersion": { "Resources": [ { "Id": "data-volume", "Name": "TestDirectory", "ResourceDataContainer": { "LocalVolumeResourceData": { "SourcePath": "/src/LRAtest", "DestinationPath": "/dest/LRAtest", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } }, { "Id": "data-device", "Name": "TestCamera", "ResourceDataContainer": { "LocalDeviceResourceData": { "SourcePath": "/dev/video0", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } } ] } }'

Resources: Greengrass グループの Resource オブジェクトのリスト。1 つの Greengrass グループには、最大 50 個のリソースを含めることができます。

Resource#Id: リソースの一意の識別子。この ID は、Lambda 関数の設定でリソースを参照するために使用されます。最大長: 128 文字。パターン: [a-zA-Z0-9:_-]+。

Resource#Name: リソースの論理名。このリソース名は、Greengrass コンソールに表示されます。最大長: 128 文字。パターン: [a-zA-Z0-9:_-]+。

LocalDeviceResourceData#SourcePath: デバイスリソースのローカル絶対パス。デバイスリソースのソースパスは、/dev の文字デバイスまたはブロックデバイスのみを参照できます。

LocalVolumeResourceData#SourcePath: Greengrass コアデバイスのボリュームリソースのローカル絶対パス。この場所は、関数が実行されるコンテナの外側です。ボリュームリソースタイプのソースパスは、/sys で始めることはできません。

LocalVolumeResourceData#DestinationPath: Lambda 環境内のボリュームリソースの絶対パス。この場所は、関数が実行されるコンテナの内側です。

GroupOwnerSetting: Lambda プロセスに追加のグループ権限を設定できます。このフィールドはオプションです。詳細については、「グループ所有者のファイルアクセス権限」を参照してください。

GroupOwnerSetting#AutoAddGroupOwner: true の場合、Greengrass はリソースの指定された Linux OS グループ所有者を Lambda プロセス権限に自動的に追加します。つまり、Lambda プロセスには、追加された Linux グループのファイルアクセス権限があります。

GroupOwnerSetting#GroupOwner: Lambda プロセスに権限を追加する Linux OS グループの名前を指定します。このフィールドはオプションです。

CreateResourceDefinition によって、リソース定義バージョン ARN が返されます。この ARN はグループ定義の更新時に使用する必要があります。

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373/versions/a4d9b882-d025-4760-9cfe-9d4fada5390d", "Name": "MyLocalVolumeResource", "LastUpdatedTimestamp": "2017-11-15T01:18:42.153Z", "LatestVersion": "a4d9b882-d025-4760-9cfe-9d4fada5390d", "CreationTimestamp": "2017-11-15T01:18:42.153Z", "Id": "ab14d0b5-116e-4951-a322-9cde24a30373", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373" }

Greengrass 関数を作成する

リソースが作成されたら、CreateFunctionDefinition コマンドを使用して Greengrass 関数を作成し、その関数にリソースへのアクセス許可を付与します。

aws greengrass create-function-definition --cli-input-json '{ "Name": "MyFunctionDefinition", "InitialVersion": { "Functions": [ { "Id": "greengrassLraTest", "FunctionArn": "arn:aws:lambda:us-west-2:012345678901:function:lraTest:1", "FunctionConfiguration": { "Pinned": false, "MemorySize": 16384, "Timeout": 30, "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "data-volume", "Permission": "rw" }, { "ResourceId": "data-device", "Permission": "ro" } ], "AccessSysfs": true } } } ] } }'

ResourceAccessPolicies: Lambda 関数にリソースへのアクセスpermissionを許可する resourceIdと が含まれます。Lambda 関数は最大 20 のリソースにアクセスできます。

ResourceAccessPolicy#Permission : Lambda 関数がリソースに対して持つアクセス許可を指定します。使用可能なオプションは、rw (読み取り/書き込み) または ro (読み取り専用) です。

AccessSysfs: true の場合、Lambda プロセスは Greengrass コアデバイスの /sysフォルダへの読み取りアクセス権を持つことができます。これは、Greengrass Lambda 関数が /sys からデバイス情報を読み取る必要がある場合に使用されます。

ここでも、CreateFunctionDefinition によって関数定義バージョン ARN が返されます。この ARN はグループ定義バージョンで使用する必要があります。

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad/versions/37f0d50e-ef50-4faf-b125-ade8ed12336e", "Name": "MyFunctionDefinition", "LastUpdatedTimestamp": "2017-11-22T02:28:02.325Z", "LatestVersion": "37f0d50e-ef50-4faf-b125-ade8ed12336e", "CreationTimestamp": "2017-11-22T02:28:02.325Z", "Id": "3c9b1685-634f-4592-8dfd-7ae1183c28ad", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad" }

グループに Lambda 関数を追加する

最後に、CreateGroupVersion を使用して関数をグループに追加します。例:

aws greengrass create-group-version --group-id "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" \ --resource-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/db6bf40b-29d3-4c4e-9574-21ab7d74316c/versions/31d0010f-e19a-4c4c-8098-68b79906fb87" \ --core-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/cores/adbf3475-f6f3-48e1-84d6-502f02729067/versions/297c419a-9deb-46dd-8ccc-341fc670138b" \ --function-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/d1123830-da38-4c4c-a4b7-e92eec7b6d3e/versions/a2e90400-caae-4ffd-b23a-db1892a33c78" \ --subscription-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/subscriptions/7a8ef3d8-1de3-426c-9554-5b55a32fbcb6/versions/470c858c-7eb3-4abd-9d48-230236bfbf6a"
注記

このコマンドで使用するグループ ID を取得する方法については、「グループ ID の取得」を参照してください。

新しいグループのバージョンが返されます。

{ "Arn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/groups/b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5/versions/291917fb-ec54-4895-823e-27b52da25481", "Version": "291917fb-ec54-4895-823e-27b52da25481", "CreationTimestamp": "2017-11-22T01:47:22.487Z", "Id": "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" }

Greengrass グループに、 TestDirectory と の 2 つのリソースにアクセスできる lraTest Lambda 関数が含まれるようになりました TestCamera。

Python で書かれたこのサンプル Lambda 関数 lraTest.py は、ローカルボリュームリソースを書き込みます。

# Demonstrates a simple use case of local resource access. # This Lambda function writes a file test to a volume mounted inside # the Lambda environment under destLRAtest. Then it reads the file and # publishes the content to the AWS IoT LRAtest topic. import sys import greengrasssdk import platform import os import logging # Setup logging to stdout logger = logging.getLogger(__name__) logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') volumePath = '/dest/LRAtest' def function_handler(event, context): try: client.publish(topic='LRA/test', payload='Sent from AWS IoT Greengrass Core.') volumeInfo = os.stat(volumePath) client.publish(topic='LRA/test', payload=str(volumeInfo)) with open(volumePath + '/test', 'a') as output: output.write('Successfully write to a file.') with open(volumePath + '/test', 'r') as myfile: data = myfile.read() client.publish(topic='LRA/test', payload=data) except Exception as e: logger.error('Failed to publish message: ' + repr(e)) return

以下のコマンドは Greengrass API に用意されており、リソース定義とリソース定義バージョンの作成と管理に使用します。

トラブルシューティング

  • Q: Greengrass グループのデプロイに失敗するのはなぜですか?

    group config is invalid: ggc_user or [ggc_group root tty] don't have ro permission on the file: /dev/tty0

    A: このエラーは、指定したリソースに対するアクセス権限が Lambda プロセスにないことを示します。解決策は、Lambda がアクセスできるようにリソースのファイルアクセス権限を変更することです。(詳細については、「グループ所有者のファイルアクセス権限」を参照してください)。

  • Q: ボリュームリソースとして /var/run を設定すると、runtime.log にエラーメッセージが記録され、Lambda 関数が開始されないのはなぜですか?

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/var/run\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/run\\\" caused \\\"invalid argument\\\"\""

    A: AWS IoT Greengrass コアは現在、ボリュームリソースとして、/var/var/run/var/lib の設定をサポートしていません。1 つの回避策は、最初に /var/var/run/var/lib を別のフォルダーにマウントし、そのフォルダーをボリュームリソースとして設定することです。

  • Q: /dev/shm を読み取り専用アクセス権限のあるボリュームリソースとして設定すると、runtime.log にエラーが記録されて、Lambda 関数が開始されないのはなぜですか?

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/dev/shm\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/dev/shm\\\" caused \\\"operation not permitted\\\"\""”

    A: /dev/shm は読み取り/書き込みとしてのみ設定できます。リソースに対するアクセス許可を rw に変更して、問題を解決します。