

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 如何使用 AWS 命令列界面設定本機資源存取
<a name="lra-cli"></a>

此功能適用於 AWS IoT Greengrass Core v1.3 和更新版本。

若要使用本機資源，您必須新增資源定義至部署到 Greengrass 核心裝置的群組定義中。群組定義必須在授與 Lambda 函數存取本機資源許可的地方含有 Lambda 函數定義。如需包括要求和限制的詳細資訊，請參閱[使用 Lambda 函數和連接器存取本機資源](access-local-resources.md)。

本教學課程說明使用 AWS Command Line Interface (CLI) 建立本機資源和設定其存取權的程序。為了執行教學課程中的步驟，您必須已經建立 [入門 AWS IoT Greengrass](gg-gs.md) 中所述的 Greengrass 群組。

如需使用 的教學課程 AWS 管理主控台，請參閱 [如何使用 設定本機資源存取 AWS 管理主控台](lra-console.md)。

## 建立本機資源
<a name="lra-cli-create-resources"></a>

首先，請您使用 `[CreateResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createresourcedefinition-post.html)` 命令建立資源定義，以指定要存取的資源。在此範例中，我們將建立兩個資源，`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": ""
                        }
                    }
                }
            }
        ]
    }
}'
```

**資源**：Greengrass 群組中的 `Resource` 物件清單。一個 Greengrass 群組最多可有 50 個資源。

**Resource\$1Id**：資源的唯一識別符。此 ID 用於查閱 Lambda 函數組態裡的資源。最大長度 128 個字元。模式：[a-zA-Z0-9:\$1-]\$1。

**Resource\$1Name**：資源的名稱。在 Greengrass 主控台中顯示的資源名稱。最大長度 128 個字元。模式：[a-zA-Z0-9:\$1-]\$1。

**LocalDeviceResourceData\$1SourcePath**：裝置資源確實的本機路徑。裝置資源的來源路徑可以只參閱在 `/dev` 下的字元裝置或區塊型儲存設備。

**LocalVolumeResourceData\$1SourcePath**：在 Greengrass 核心裝置上，磁碟區資源確實的本機路徑。此位置位於函數執行所在的[容器](lambda-group-config.md#lambda-function-containerization)外。磁碟區資源類型的來源路徑不能以 `/sys` 為開頭。

**LocalVolumeResourceData\$1DestinationPath**：Lambda 環境內磁碟區資源的確實路徑。此位置位於函數執行所在的容器內。

**GroupOwnerSetting**：可讓您為 Lambda 程序設定其他的群組權限。此欄位為選用欄位。如需詳細資訊，請參閱[群組擁有者檔案存取許可](access-local-resources.md#lra-group-owner)。

**GroupOwnerSetting\$1AutoAddGroupOwner**：如果為 true，則 Greengrass 會自動將資源的指定 Linux 作業系統群組擁有者新增至 Lambda 程序權限。因此，Lambda 程序對新增的 Linux 群組具有檔案存取許可。

**GroupOwnerSetting\$1GroupOwner**：指定已新增權限至 Lambda 程序的 Linux 作業系統群組名稱。此欄位為選用欄位。

資源定義版本 ARN 會由 `[CreateResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createresourcedefinition-post.html)` 傳回。應使用 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 函數
<a name="lra-cli-create-function"></a>

建立資源後，請使用 `[CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)` 命令建立 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**：包含`permission`授予 Lambda 函數資源存取權的 `resourceId`和 。Lambda 函數最多可以存取 20 個資源。

**ResourceAccessPolicy\$1Permission**：指定 Lambda 函數在資源上擁有的許可。可行的選項為 `rw` (讀取/寫入) 或 `ro` (唯讀)。

**AccessSysfs**：如果為 true，則 Lambda 程序可在 Greengrass 核心裝置上讀取 `/sys` 資料夾。在 Greengrass Lambda 函數需要從 讀取裝置資訊時使用`/sys`。

同樣地，`[CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)` 會傳回一個函數定義版本 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 函數新增至群組
<a name="lra-cli-add-function"></a>

最後，請使用 `[CreateGroupVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/creategroupversion-post.html)` 新增函數至群組。例如：

```
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](deployments.md#api-get-group-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 群組現在有 *lraTest* Lambda 函數，其擁有兩個資源的存取權： TestDirectory 和 TestCamera。

此範例 Lambda 函數「`lraTest.py`」，以 Python 寫入本機磁碟區資源：

```
# 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 提供，建立與管理資源定義和資源定義版本：
+ [CreateResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createresourcedefinition-post.html)
+ [CreateResourceDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/createresourcedefinitionversion-post.html)
+  [DeleteResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/deleteresourcedefinition-delete.html)
+  [GetResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/getresourcedefinition-get.html)
+  [GetResourceDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/getresourcedefinitionversion-get.html)
+  [ListResourceDefinitions](https://docs.aws.amazon.com/greengrass/v1/apireference/listresourcedefinitions-get.html)
+  [ListResourceDefinitionVersions](https://docs.aws.amazon.com/greengrass/v1/apireference/listresourcedefinitionversions-get.html)
+  [UpdateResourceDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/updateresourcedefinition-put.html)

## 疑難排解
<a name="lra-faqs"></a>
+ **問：**為什麼我的 Greengrass 群組部署失敗，發生與以下類似的狀況：

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

  **答：** 此失敗狀況表示 Lambda 程序並沒有存取指定資源的許可。解決方法為變更資源的檔案許可權限，讓 Lambda 可以存取即可。(如需詳細資訊，請參閱[群組擁有者檔案存取許可](access-local-resources.md#lra-group-owner))。
+ **問：**當我將 `/var/run` 設為磁碟區資源時，為什麼 Lambda 函數無法啟動，並在 runtime.log 出現錯誤訊息：

  ```
  [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 core 目前不支援將 `/var`、 `/var/run`和 組態`/var/lib`為磁碟區資源。一種解決方法是首先在另一個文件中掛載 `/var`、`/var/run` 或 `/var/lib`，然後再設定此資料夾做為磁碟區資源。
+ **問：**當我將 `/dev/shm` 設為唯讀許可的磁碟區資源時，為什麼 Lambda 函數無法啟動，並在 runtime.log 出現錯誤訊息：

  ```
  [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\\\"\""”
  ```

  **答：** `/dev/shm` 因為只能設定成 [讀取/寫入]。變更資源許可為 `rw` 以解決此問題。