Lambda 関数から機械学習リソースにアクセスする - 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を強くお勧めします。これにより、重要な新機能が追加され、追加のプラットフォーム がサポートされます

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

Lambda 関数から機械学習リソースにアクセスする

ユーザー定義の Lambda 関数は、機械学習リソースにアクセスして、AWS IoT Greengrass Core でローカル推論を実行できます。機械学習リソースは、トレーニングを受けたモデルと、コアデバイスにダウンロードされるその他のアーティファクトで構成されます。

Lambda 関数がコアの機械学習リソースにアクセスできるようにするには、リソースを Lambda 関数にアタッチし、アクセス権限を定義する必要があります。その際の手順は、関連付けられた (またはアタッチされた) Lambda 関数のコンテナ化モードによって決まります。

機械学習リソースのアクセス権限

AWS IoT Greengrass Core v1.10.0 以降では、機械学習リソースのリソース所有者を定義できます。リソース所有者は、AWS IoT Greengrass がリソースアーティファクトのダウンロードに使用する OS グループと権限を表します。リソース所有者が定義されていない場合、ダウンロードされたリソースアーティファクトはルートにのみアクセスできます。

  • コンテナ化されていない Lambda 関数が機械学習リソースにアクセスする場合、コンテナからのアクセス権限制御がないため、リソースの所有者を定義する必要があります。コンテナ化されていない Lambda 関数は、リソース所有者のアクセス権限を継承し、それらを使用してリソースにアクセスできます。

     

  • コンテナ化された Lambda 関数だけがリソースにアクセスする場合は、リソース所有者を定義するのではなく、関数レベルのアクセス権限を使用することをお勧めします。

     

リソース所有者のプロパティ

リソース所有者は、グループ所有者とグループ所有者の権限を指定します。

グループの所有者。コアデバイス上の既存の Linux OS グループのグループ ID (GID)。グループの権限が Lambda プロセスに追加されます。具体的には、Lambda 関数の補足グループ ID に GID が追加されます。

Greengrass グループの Lambda 関数が、機械学習リソースのリソース所有者と同じ OS グループとして実行されるように設定されている場合は、そのリソースを Lambda 関数にアタッチする必要があります。そうしないと、この設定では、Lambda 関数が AWS IoT Greengrass の承認を得ずにリソースにアクセスできる暗黙のアクセス権限が与えられるため、デプロイは失敗します。Lambda 関数がルート (UID=0) として実行されている場合、デプロイ検証チェックはスキップされます。

Greengrass Core の他のリソース、Lambda 関数、ファイルで使用されていない OS グループを使用することをお勧めします。共有 OS グループを使用すると、アタッチされた Lambda 関数が必要以上に多くのアクセス権限を付与できます。共有 OS グループを使用する場合は、アタッチされた Lambda 関数も、その共有 OS グループを使用するすべての機械学習リソースにアタッチする必要があります。それ以外の場合、デプロイは失敗します。

グループ所有者の権限。Lambda プロセスに追加する読み取り専用権限、または読み取り/書き込み権限。

コンテナ化されていない Lambda 関数は、リソースに対するこれらのアクセス権限を継承する必要があります。コンテナ化された Lambda 関数は、これらのリソースレベルのアクセス権限を継承するか、関数レベルのアクセス権限を定義できます。関数レベルのアクセス権限を定義する場合、アクセス権限はリソースレベルのアクセス権限と同じか、制限がより大きいものである必要があります。

次のテーブルに、サポートされているアクセス権限の設定を示します。

GGC v1.10 or later
プロパティ コンテナ化された Lambda 関数のみがリソースにアクセスする場合 コンテナ化されていない Lambda 関数がリソースにアクセスする場合
関数レベルのプロパティ

権限 (読み取り/書き込み)

リソースがリソース所有者を定義していない場合は必須です。リソース所有者が定義されている場合、関数レベルのアクセス権限は、リソース所有者のアクセス権限と同じか、制限がより大きいものである必要があります。

コンテナ化された Lambda 関数だけがリソースにアクセスする場合は、リソースの所有者を定義しないことをお勧めします。

コンテナ化されていない Lambda 関数:

サポート外。コンテナ化されていない Lambda 関数は、リソースレベルのアクセス権限を継承する必要があります。

コンテナ化された Lambda 関数:

オプション。ただし、リソースレベルのアクセス権限と同じか制限がより大きいものである必要があります。

リソースレベルのプロパティ

リソース所有者

オプション (推奨しません)。

必須。

権限 (読み取り/書き込み)

オプション (推奨しません)。

必須。

GGC v1.9 or earlier
プロパティ コンテナ化された Lambda 関数のみがリソースにアクセスする場合 コンテナ化されていない Lambda 関数がリソースにアクセスする場合
関数レベルのプロパティ

権限 (読み取り/書き込み)

必須。

サポート外。

リソースレベルのプロパティ

リソース所有者

サポート外。

サポート外。

権限 (読み取り/書き込み)

サポート外。

サポート外。

注記

AWS IoT Greengrass API を使用して Lambda 関数とリソースを設定する場合は、関数レベルの ResourceId プロパティも必要です。ResourceId プロパティは、機械学習リソースを Lambda 関数にアタッチします。

Lambda 関数のアクセス権限の定義 (コンソール)

AWS IoT コンソールでは、機械学習リソースを設定するとき、または Lambda 関数にリソースをアタッチするときにアクセス権限を定義します。

コンテナ化された Lambda 関数

コンテナ化された Lambda 関数だけが機械学習リソースにアタッチされている場合:

  • 機械学習リソースのリソース所有者として [No system group] (システムグループなし) を選択します。これは、コンテナ化された Lambda 関数だけが機械学習リソースにアクセスする場合に推奨される設定です。そうしないと、アタッチされた Lambda 関数が必要以上に多くのアクセス権限を与える可能性があります。

     

 

コンテナ化されていない Lambda 関数 (GGC v1.10 以降が必要)

コンテナ化されていない Lambda 関数が機械学習リソースにアタッチされている場合:

  • 機械学習リソースのリソース所有者として使用する System group ID (GID) (システムグループ ID (GID)) を指定します。[Specify system group and permissions] (システムグループと権限を指定) を選択し、GID を入力します。コアデバイスで getent group コマンドを使用して、システムグループ ID を検索できます。

     

  • [System group permissions] (システムグループの権限) には [Read-only access] (読み取り専用アクセス) または [Read and write access] (読み取り/書き込みアクセス)] を選択します。

Lambda 関数 (API) のアクセス権限の定義

AWS IoT Greengrass API では、Lambda 関数の ResourceAccessPolicy プロパティまたはリソースの OwnerSetting プロパティで、機械学習リソースに対する権限を定義します。

コンテナ化された Lambda 関数

コンテナ化された Lambda 関数だけが機械学習リソースにアタッチされている場合:

  • コンテナ化された Lambda 関数の場合は、ResourceAccessPolicies プロパティの Permission プロパティにアクセス権限を定義します。例:

    "Functions": [ { "Id": "my-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id", "Permission": "ro-or-rw" } ] }, "MemorySize": 512, "Pinned": true, "Timeout": 5 } } ]
  • 機械学習リソースの場合は、OwnerSetting プロパティを省略します。例:

    "Resources": [ { "Id": "my-resource-id", "Name": "my-resource-name", "ResourceDataContainer": { "S3MachineLearningModelResourceData": { "DestinationPath": "/local-destination-path", "S3Uri": "s3://uri-to-resource-package" } } } ]

    これは、コンテナ化された Lambda 関数だけが機械学習リソースにアクセスする場合に推奨される設定です。そうしないと、アタッチされた Lambda 関数が必要以上に多くのアクセス権限を与える可能性があります。

 

コンテナ化されていない Lambda 関数 (GGC v1.10 以降が必要)

コンテナ化されていない Lambda 関数が機械学習リソースにアタッチされている場合:

  • コンテナ化されていない Lambda 関数の場合は、ResourceAccessPoliciesPermission プロパティを省略します。この設定は必須で、関数がリソースレベルのアクセス権限を継承できるようにします。例:

    "Functions": [ { "Id": "my-non-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "Execution": { "IsolationMode": "NoContainer", }, "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id" } ] }, "Pinned": true, "Timeout": 5 } } ]
  • 機械学習リソースにもアクセスするコンテナ化された Lambda 関数の場合は、ResourceAccessPoliciesPermission プロパティを省略するか、リソースレベルのアクセス権限と同じ、または制限のより厳しいアクセス権限を定義します。例:

    "Functions": [ { "Id": "my-containerized-function", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:function-name:alias-or-version", "FunctionConfiguration": { "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "my-resource-id", "Permission": "ro-or-rw" // Optional, but cannot exceed the GroupPermission defined for the resource. } ] }, "MemorySize": 512, "Pinned": true, "Timeout": 5 } } ]
  • 機械学習リソースの場合は、子 GroupOwner および GroupPermission プロパティを含む OwnerSetting プロパティを定義します。例:

    "Resources": [ { "Id": "my-resource-id", "Name": "my-resource-name", "ResourceDataContainer": { "S3MachineLearningModelResourceData": { "DestinationPath": "/local-destination-path", "S3Uri": "s3://uri-to-resource-package", "OwnerSetting": { "GroupOwner": "os-group-id", "GroupPermission": "ro-or-rw" } } } } ]

Lambda 関数コードから機械学習リソースにアクセスする

ユーザー定義の Lambda 関数は、プラットフォーム固有の OS インターフェイスを使用して、Core デバイスの機械学習リソースにアクセスします。

GGC v1.10 or later

コンテナ化された Lambda 関数の場合、リソースは Greengrass コンテナ内にマウントされ、リソースに対して定義されたローカルの送信先パスで利用できます。コンテナ化されていない Lambda 関数の場合、リソースは Lambda 専用の作業ディレクトリにシンボリックリンクされ、Lambda プロセス内の AWS_GG_RESOURCE_PREFIX 環境変数に渡されます。

機械学習リソースのダウンロードされたアーティファクトへのパスを取得するために、Lambda 関数は、リソースに対して定義されたローカルの送信先パスに AWS_GG_RESOURCE_PREFIX 環境変数を追加します。コンテナ化された Lambda 関数の場合、返される値は 1 つのスラッシュ (/) です。

resourcePath = os.getenv("AWS_GG_RESOURCE_PREFIX") + "/destination-path" with open(resourcePath, 'r') as f: # load_model(f)
GGC v1.9 or earlier

機械学習リソースのダウンロードされたアーティファクトは、リソースに対して定義されたローカルの送信先パスにあります。AWS IoT Greengrass Core v1.9 以前の機械学習リソースにアクセスできるのは、コンテナ化された Lambda 関数だけです。

resourcePath = "/local-destination-path" with open(resourcePath, 'r') as f: # load_model(f)

モデルのロード実装は、ML ライブラリによって異なります。

トラブルシューティング

次の情報を使用して、機械学習リソースへのアクセスに関する問題のトラブルシューティングに役立ててください。

InvalidMLModelOwner - GroupOwnerSetting ML モデルリソースで提供されますが、 GroupOwner または GroupPermission は存在しません

解決策: 機械学習リソースに ResourceDownloadOwnerSetting オブジェクトが含まれているが、必須の GroupOwnerまたは GroupPermissionプロパティが定義されていない場合、このエラーが表示されます。この問題を解決するには、不足しているプロパティを定義します。

 

NoContainer 関数は、 Machine Learning リソースをアタッチするときにアクセス許可を設定できません。<function-arn> は、リソースアクセスポリシーでアクセス許可 <ro/rw> を持つ Machine Learnin リソース <resource-id> を指します。

解決策: コンテナ化されていない Lambda 関数が機械学習リソースに対する関数レベルのアクセス権限を指定した場合、このエラーが表示されます。コンテナ化されていない関数は、機械学習リソースに定義されているリソース所有者のアクセス権限からアクセス権限を継承する必要があります。この問題を解決するには、コンソールから [inherit resource owner permissions] (リソース所有者のアクセス許可を継承する) を選択するか、API を使用して Lambda 関数のリソースアクセスポリシーからアクセス権限を削除するかを選択します。

 

関数 <function-arn> は、 ResourceAccessPolicy と の両方のリソースに不足しているアクセス許可を持つ Machine Learning リソース <resource-id> を指します OwnerSetting。

解決策: このエラーは、機械学習リソースへのアクセス権限が、アタッチされた Lambda 関数またはリソースに対して設定されていない場合に表示されます。この問題を解決するには、Lambda 関数の ResourceAccessPolicyプロパティまたは リソースの OwnerSettingプロパティでアクセス許可を設定します。

 

関数 <function-arn> は、アクセス許可 \"rw\" を持つMachine Learningリソース <resource-id> を指しますが、リソース所有者の設定 GroupPermissionでは \"ro\" のみが許可されます。

解決策: このエラーは、アタッチされた Lambda 関数に定義されたアクセス権限が、機械学習リソースに対して定義されたリソース所有者のアクセス権限を超えた場合に表示されます。この問題を解決するには、Lambda 関数に対して制限のより厳しいアクセス権限を設定するか、リソース所有者の制限がより低いアクセス権限を設定します。

 

NoContainer 関数 <function-arn> は、ネストされた送信先パスのリソースを指します。

解決策: コンテナ化されていない Lambda 関数にアタッチされた複数の機械学習リソースが同じ送信先パスまたはネストされた送信先パスを使用している場合に、このエラーが表示されます。この問題を解決するには、リソースに別の送信先パスを指定します。

 

Lambda <function-arn> は、同じグループ所有者 ID を共有することでリソース <resource-id> にアクセスします。

解決策: このエラーは、Lambda 関数の実行者 ID と、機械学習リソースのリソース所有者に同じ OS グループを指定しながら、リソースが Lambda 関数にアタッチされていない場合に runtime.log に記録されます。この設定では、Lambda 関数に暗黙のアクセス権限が付与されます。このアクセス権限は、AWS IoT Greengrass の認証なしでリソースにアクセスするために使用できます。

この問題を解決するには、プロパティの 1 つに別の OS グループを使用するか、機械学習リソースを Lambda 関数にアタッチします。

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