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

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

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

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

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 コア上の他のリソース、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 OS group (OS グループなし)] を選択します。これは、コンテナ化された Lambda 関数だけが機械学習リソースにアクセスする場合に推奨される設定です。そうしないと、アタッチされた Lambda 関数が必要以上に多くのアクセス権限を与える可能性があります。

     

  • Lambda 関数のアクセス権限に対して、「Read-only access (読み取り専用アクセス)」または「Read and write access (読み取り/書き込みアクセス)」を選択します。これは、Lambda 関数を機械学習リソースにアタッチするときに行うことができます。

    
                  リソース所有者が [No OS group (OS グループなし)] に設定され、Lambda 関数のアクセス権限がリソース設定で [読み取り専用アクセス] に設定されている。

    または、機械学習リソースを Lambda 関数にアタッチすると、次のようになります。

    
                  リソース所有者が、関数設定で [No OS group (OS グループなし)] に設定され、Lambda 関数のアクセス権限が読み取り専用アクセスに設定されている。

 

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

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

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

     

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

    
                  機械学習リソースの OS グループとアクセス権限の指定。
  • コンテナ化されていない Lambda 関数アクセス権限の場合は、[Inherit resource owner permissions (リソース所有者の権限を継承)] を選択します。Lambda 関数とリソースを関連付けるときにこれを行うことができます。

    
                  機械学習リソースのアクセス権限を継承する。

    機械学習リソースにもアクセスするコンテナ化された Lambda 関数の場合は、OS グループのアクセス権限を継承するか、関数レベルのアクセス権限を選択します。関数レベルの権限を選択する場合、それらの権限は OS グループの権限と同じか、制限がより大きいものである必要があります。

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 or later が必要)

コンテナ化されていない 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 インターフェイスを使用して、コアデバイス上の機械学習リソースにアクセスします。

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 関数は、機械学習リソースをアタッチするときにアクセス権限を設定できません。<function-arn> は、リソースアクセスポリシーでアクセス権限 <ro/rw> を持つ機械学習リソース <resource-id> を参照します。

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

 

関数 <function-arn> は、ResourceAccessPolicy と resource OwnerSetting の両方でアクセス権限がない機械学習リソース <resource-id> を参照します。

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

 

関数 <function-arn> は、権限 \「rw\」の機械学習リソース <resource-id> を参照し、リソース所有者設定 GroupPermission は \「ro\」のみを許可します。

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

 

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

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

 

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

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

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

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