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 つのリソースとして TestDirectory
と TestCamera
を作成します。
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
に変更して、問題を解決します。