

支援終止通知：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 IoT Greengrass 核心上執行 Lambda 函數
<a name="lambda-functions"></a>

AWS IoT Greengrass 為您撰寫的使用者定義程式碼提供容器化 Lambda 執行期環境 AWS Lambda。部署至 AWS IoT Greengrass 核心執行的 Lambda 函數會在核心的本機 Lambda 執行時間中執行。本機 Lambda 函數可由本機事件、來自雲端的訊息和其他來源觸發，將本機運算功能帶入用戶端裝置。例如，您可以在將資料傳輸至雲端之前，使用 Greengrass Lambda 函數來篩選裝置資料。

若要將 Lambda 函數部署至核心，請將函數新增至 Greengrass 群組 （透過參考現有的 Lambda 函數）、設定函數的群組特定設定，然後部署群組。如果函數存取 AWS 服務，您也必須將任何必要的許可新增至 [Greengrass 群組角色](group-role.md)。

您可以設定參數來決定 Lambda 函數的執行方式，包括許可、隔離、記憶體限制等。如需詳細資訊，請參閱[使用群組特定的組態控制 Greengrass Lambda 函數的執行](lambda-group-config.md)。

**注意**  
這些設定也可讓您 AWS IoT Greengrass 在 Docker 容器中執行。如需詳細資訊，請參閱[AWS IoT Greengrass 在 Docker 容器中執行](run-gg-in-docker-container.md)。

下表列出支援的[AWS Lambda 執行時間](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)及其可執行的 AWS IoT Greengrass Core 軟體版本。


****  

| 語言或平台 | GGC 版本 | 
| --- | --- | 
| Python 3.8 | 1.11 | 
| Python 3.7 | 1.9 或更新版本 | 
| Python 2.7 \$1 | 1.0 或更新版本 | 
| Java 8 | 1.1 或更新版本 | 
| Node.js 12.x \$1 | 1.10 或更新版本 | 
| Node.js 8.10 \$1 | 1.9 或更新版本 | 
| Node.js 6.10 \$1 | 1.1 或更新版本 | 
| C、C\$1\$1 | 1.6 或更新版本 | 

\$1 您可以在支援的 版本上執行使用這些執行時間的 Lambda 函數 AWS IoT Greengrass，但您無法在其中建立這些函數 AWS Lambda。如果裝置上的執行時間與該函數指定的 AWS Lambda 執行時間不同，您可以在 `FunctionRuntimeOverride`中使用 選擇您自己的執行時間`FunctionDefintionVersion`。如需詳細資訊，請參閱 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html)。如需支援執行時間的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[執行時間支援政策](https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html)。

## 適用於 Greengrass Lambda 函數SDKs
<a name="lambda-sdks"></a>

AWS 提供三個軟體SDKs，可供在 AWS IoT Greengrass 核心上執行的 Greengrass Lambda 函數使用。這些軟體開發套件包含在不同的套裝服務中，因此函數可以同時使用它們。若要在 Greengrass Lambda 函數中使用 SDK，請在您上傳到的 Lambda 函數部署套件中包含它 AWS Lambda。

**AWS IoT Greengrass 核心 SDK**  <a name="lambda-sdks-core"></a>
讓本機 Lambda 函數與核心互動，以便：  <a name="gg-core-sdk-functionality"></a>
+ 與 交換 MQTT 訊息 AWS IoT Core。
+ 使用 Greengrass 群組中的連接器、用戶端裝置和其他 Lambda 函數交換 MQTT 訊息。
+ 與本機陰影服務互動。
+ 叫用其他本機 Lambda 函數。
+ 存取[私密資源](secrets.md)。
+ 與[串流管理員](stream-manager.md)交動。
AWS IoT Greengrass 在 GitHub 上以下列語言和平台提供 AWS IoT Greengrass 核心 SDK。  <a name="gg-core-sdk-download-list"></a>
+ [AWS IoT Greengrass 適用於 Java 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-java/)
+ [AWS IoT Greengrass 適用於 Node.js 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-js/)
+ [AWS IoT Greengrass 適用於 Python 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-python/)
+ [AWS IoT Greengrass 適用於 C 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-c/)
若要在 Lambda 函數部署套件中包含 AWS IoT Greengrass 核心 SDK 相依性：  

1. 下載符合 Lambda 函數執行時間之 AWS IoT Greengrass Core SDK 套件的語言或平台。

1. 解壓縮下載的封裝，以取得軟體開發套件。SDK 為 `greengrasssdk` 資料夾。

1. 在包含函數程式碼的 Lambda 函數部署套件`greengrasssdk`中包含 。這是您在建立 Lambda 函數 AWS Lambda 時上傳至 的套件。
   
 **StreamManagerClient**  
只有下列 AWS IoT Greengrass 核心 SDKs 可用於[串流管理員](stream-manager.md)操作：  <a name="streammanagerclient-sdk-versions"></a>
+ Java 開發套件 (1.4.0 版或更新版本）
+ Python SDK (1.5.0 版或更新版本）
+ Node.js SDK (1.6.0 版或更新版本）
若要使用適用於 Python AWS IoT Greengrass 的核心 SDK 與串流管理員互動，您必須安裝 Python 3.7 或更新版本。您還必須安裝相依性，以包含在 Python Lambda 函數部署套件中：  <a name="python-sdk-dependencies-stream-manager"></a>

1. 前往包含 `requirements.txt` 檔案的軟體開發套件目錄。這個檔案會列出相依性。

1. 安裝軟體開發套件相依性。例如，執行下列 `pip` 命令，將它們安裝在目前的目錄中：

   ```
   pip install --target . -r requirements.txt
   ```
   
 **在 AWS IoT Greengrass 核心裝置上安裝適用於 Python 的核心 SDK**  
如果您正在執行 Python Lambda 函數，您也可以使用 在 AWS IoT Greengrass 核心裝置上[https://pypi.org/project/pip/](https://pypi.org/project/pip/)安裝適用於 Python 的核心 SDK。然後，您可以部署函數，而無需在 Lambda 函數部署套件中包含 SDK。如需詳細資訊，請參閱 [greengrasssdk](https://pypi.org/project/greengrasssdk/)。  
此支援適用於具有大小限制的核心。我們建議您盡可能在 Lambda 函數部署套件中包含 開發套件。  
 

**AWS IoT Greengrass Machine Learning SDK**  <a name="lambda-sdks-ml"></a>
讓本機 Lambda 函數使用部署到 Greengrass 核心作為 ML 資源的機器學習 (ML) 模型。Lambda 函數可以使用 SDK 來叫用本機推論服務，並與部署到核心做為連接器的本機推論服務互動。Lambda 函數和 ML 連接器也可以使用 SDK 將資料傳送至 ML Feedback 連接器，以進行上傳和發佈。如需詳細資訊，包括使用開發套件的程式碼範例，請參閱 [ML 影像分類連接器](image-classification-connector.md)、[ML 物件偵測連接器](obj-detection-connector.md)和 [ML 回饋連接器](ml-feedback-connector.md)。  
下表列出 SDK 版本支援的語言或平台，以及他們可以執行 AWS IoT Greengrass 的核心軟體版本。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/lambda-functions.html)
如需下載資訊，請參閱 [AWS IoT Greengrass ML 開發套件軟體](what-is-gg.md#gg-ml-sdk-download)。

**AWS SDKs**  <a name="lambda-sdks-aws"></a>
讓本機 Lambda 函數直接呼叫 AWS 服務，例如 Amazon S3 AWS IoT、DynamoDB 和 AWS IoT Greengrass。若要在 Greengrass Lambda 函數中使用 AWS SDK，您必須在部署套件中包含它。當您在與 AWS IoT Greengrass Core AWS SDK 相同的套件中使用 SDK 時，請確定您的 Lambda 函數使用正確的命名空間。當核心離線時，Greengrass Lambda 函數無法與雲端服務通訊。  
從[入門資源中心](https://aws.amazon.com/getting-started/tools-sdks/)下載 AWS SDKs。

如需建立部署套件的詳細資訊，請參閱《 入門教學》[建立和封裝 Lambda 函數](create-lambda.md)中的 或《 *AWS Lambda 開發人員指南*》中的[建立部署套件](https://docs.aws.amazon.com/lambda/latest/dg/deployment-package-v2.html)。

### 遷移雲端型 Lambda 函數
<a name="lambda-migrate-sdks"></a>

 AWS IoT Greengrass 核心 SDK 遵循 AWS SDK 程式設計模型，可讓您輕鬆地將為雲端開發的 Lambda 函數移植到在 AWS IoT Greengrass 核心上執行的 Lambda 函數。

例如，下列 Python Lambda 函數使用 適用於 Python (Boto3) 的 AWS SDK 將訊息發佈至`some/topic`雲端中的 主題：

```
import boto3

iot_client = boto3.client("iot-data")
response = iot_client.publish(
    topic="some/topic", qos=0, payload="Some payload".encode()
)
```

若要移植 AWS IoT Greengrass 核心的 函數，請在 `import`陳述式和`client`初始化中，將`boto3`模組名稱變更為 `greengrasssdk`，如下列範例所示：

```
import greengrasssdk

iot_client = greengrasssdk.client("iot-data")
iot_client.publish(topic="some/topic", qos=0, payload="Some payload".encode())
```

**注意**  
 AWS IoT Greengrass 核心 SDK 僅支援傳送 QoS = 0 的 MQTT 訊息。如需詳細資訊，請參閱[訊息服務品質](gg-core.md#message-quality-of-service)。

程式設計模型之間的相似性也可讓您在雲端開發 Lambda 函數，然後 AWS IoT Greengrass 輕鬆遷移到 。[Lambda 可執行檔](#lambda-executables)不會在雲端執行，因此您無法在部署之前使用 AWS SDK 在雲端中進行開發。

## 依別名或版本參考 Lambda 函數
<a name="lambda-versions-aliases"></a>

Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。別名會在群組部署期間解析為版本號碼。當您使用別名會更新解析的版本別名，此別名會指向部署的時間。

AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。**\$1LATEST** 版本不受限於不可變、已發佈的函數版本，並且可以隨時變更，這與 AWS IoT Greengrass 版本不可變性原則相反。

透過程式碼變更來保持 Greengrass Lambda 函數更新的常見做法是使用 Greengrass 群組和訂閱**PRODUCTION**中名為 的別名。當您將 Lambda 函數的新版本提升為生產環境時，請將別名指向最新的穩定版本，然後重新部署群組。您也可以使用此方法轉返至舊版本。

# 使用群組特定的組態控制 Greengrass Lambda 函數的執行
<a name="lambda-group-config"></a>

AWS IoT Greengrass 提供 Greengrass Lambda 函數的雲端型管理。雖然 Lambda 函數的程式碼和相依性是使用 管理 AWS Lambda，但您可以設定 Lambda 函數在 Greengrass 群組中執行時的行為。

## 群組專屬組態設定
<a name="lambda-group-config-properties"></a>

AWS IoT Greengrass 為 Greengrass Lambda 函數提供下列群組特定的組態設定。

**系統使用者和群組**  <a name="lambda-access-identity"></a>
用來執行 Lambda 函數的存取身分。根據預設，Lambda 函數會以群組[的預設存取身分](#lambda-access-identity-groupsettings)執行。一般而言，這是標準的 AWS IoT Greengrass 系統帳戶 (ggc\$1user 和 ggc\$1group)。您可以變更設定，並選擇具有執行 Lambda 函數所需許可的使用者 ID 和群組 ID。您可以同時覆寫 UID 和 GID，或如果另一個欄位留白，可以只覆寫一個。此設定可讓您更精細地控制對裝置資源的存取。建議您使用適當的資源限制、檔案許可和磁碟配額來設定 Greengrass 硬體，以用於執行 Lambda 函數的使用者和群組。  
此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。  
除非絕對必要，否則建議您避免將 Lambda 函數作為根函數執行。以根目錄執行會增加下列風險：  
+ 意外變更的風險，例如意外刪除關鍵檔案。
+ 惡意個人對您的資料和裝置造成的風險。
+ 當 Docker 容器搭配 `--net=host`和 執行時，容器逸出的風險`UID=EUID=0`。
如果您確實需要以根身分執行 ，則必須更新 AWS IoT Greengrass 組態以啟用它。如需詳細資訊，請參閱[執行 Lambda 函數做為根](#lambda-running-as-root)。  
**系統使用者 ID （數字）**  
具有執行 Lambda 函數所需許可之使用者的使用者 ID。只有在您選擇以**另一個使用者 ID/群組 ID** 執行時，才能使用此設定。您可以在 AWS IoT Greengrass 核心裝置上使用 **getent passwd**命令來查詢要用來執行 Lambda 函數的使用者 ID。  
如果您使用相同的 UID 在 Greengrass 核心裝置上執行程序和 Lambda 函數，您的 Greengrass 群組角色可以授予程序臨時登入資料。這些程序可以使用 Greengrass 核心部署的臨時登入資料。  
**系統群組 ID （數字）**  
具有執行 Lambda 函數所需許可的群組的群組 ID。只有在您選擇以**另一個使用者 ID/群組 ID** 執行時，才能使用此設定。您可以在 AWS IoT Greengrass 核心裝置上使用 **getent group**命令來查詢要用來執行 Lambda 函數的群組 ID。

**Lambda 函數容器化**  <a name="lambda-function-containerization"></a>
選擇 Lambda 函數是否使用群組的預設容器化執行，或指定應一律用於此 Lambda 函數的容器化。  
Lambda 函數的容器化模式決定其隔離層級。  
+ 容器化 Lambda 函數會以 **Greengrass 容器**模式執行。Lambda 函數會在 AWS IoT Greengrass 容器內的隔離執行時間環境 （或命名空間） 中執行。
+ 非容器化 Lambda 函數會以**無容器**模式執行。Lambda 函數會以一般 Linux 程序執行，而沒有任何隔離。
此功能適用於 AWS IoT Greengrass Core v1.7 和更新版本。  
建議您在 Greengrass 容器中執行 Lambda 函數，除非您的使用案例要求它們在沒有容器化的情況下執行。當您的 Lambda 函數在 Greengrass 容器中執行時，您可以使用連接的本機和裝置資源，並取得隔離和提高安全性的優勢。請先參閱[選擇 Lambda 函數容器化時的考量事項](#lambda-containerization-considerations)，再變更 containerization (容器化)。  
若要在不啟用裝置核心命名空間和 cgroup 的情況下執行 ，所有 Lambda 函數都必須在沒有容器化的情況下執行。只要設定群組的預設容器化，即可輕鬆達成此目標。如需相關資訊，請參閱[為群組中的 Lambda 函數設定預設容器化](#lambda-containerization-groupsettings)。

**Memory limit (記憶體限制)**  
函數所需記憶體的分配。預設為 16 MB。  
當您將 Lambda 函數變更為在沒有容器化的情況下執行時，記憶體限制設定會變成無法使用。在沒有容器化的情況下執行的 Lambda 函數沒有記憶體限制。當您將 Lambda 函數或群組預設容器化設定變更為在沒有容器化的情況下執行時，會捨棄記憶體限制設定。

**Timeout (逾時)**  
在函數或要求終止前的時間值。預設為 3 秒。

**固定**  
Lambda 函數生命週期可以是*隨需*或*長期。*預設為隨需。  
呼叫時，隨需 Lambda 函數會在新的或重複使用的容器中啟動。請求任何可以處理的函數。**Lambda 函數會在 AWS IoT Greengrass 啟動後自動啟動，並在自己的容器 （或沙盒） 中持續執行。所有請求函數的要求皆由相同的容器處理。如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。

**Read access to /sys directory (對 /sys 目錄的讀取存取)**  
不管該函數可以存取主機的 /sys 資料夾。當函數必須讀取 /sys 的裝置資訊時，請使用此函數。預設值為 false。  
當您在沒有容器化的情況下執行 Lambda 函數時，無法使用此設定。當您將 Lambda 函數變更為在沒有容器化的情況下執行時，會捨棄此設定的值。

**編碼類型**  
函數輸入承載預期的編碼類型，可能是 JSON 或二進位。預設值為 JSON。  
從 AWS IoT Greengrass Core Software v1.5.0 和 AWS IoT Greengrass Core SDK v1.1.0 開始，即可支援二進位編碼類型。接受二進位輸入資料可幫助函數與裝置資料互動，因為裝置硬體的限制讓他們自身難以或無法建構 JSON 資料類型。  
[Lambda 可執行檔](lambda-functions.md#lambda-executables)僅支援二進位編碼類型，不支援 JSON。

**程序引數**  
命令列引數會在執行時傳遞至 Lambda 函數。

**環境變數**  
金鑰值組可動態地將設定傳給函數程式碼和二進位程式庫。本機環境變數會執行的方式與 [AWS Lambda 函數環境變數](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) 一樣，但是，不同在於可在核心環境取得。

**資源存取政策**  
允許 Lambda 函數存取的最多 10 個[本機資源](access-local-resources.md)、[秘密資源](secrets.md)和[機器學習資源](ml-inference.md)的清單，以及對應的 `read-only`或 `read-write`許可。在 主控台中，這些*附屬*資源會列在**資源**索引標籤的群組組態頁面上。  
[容器化模式](#lambda-function-containerization)會影響 Lambda 函數如何存取本機裝置和磁碟區資源，以及機器學習資源。  
+ 非容器化 Lambda 函數必須透過核心裝置上的檔案系統直接存取本機裝置和磁碟區資源。
+ 若要允許非容器化 Lambda 函數存取 Greengrass 群組中的機器學習資源，您必須在機器學習資源上設定資源擁有者和存取許可屬性。如需詳細資訊，請參閱[從 Lambda 函數存取機器學習資源](access-ml-resources.md)。

如需有關使用 AWS IoT Greengrass API 為使用者定義的 Lambda 函數設定群組特定組態設定的資訊，請參閱*AWS IoT Greengrass Version 1 《 API 參考*》中的 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html) 或《 *AWS CLI 命令參考*》中的 [create-function-definition](https://docs.aws.amazon.com/cli/latest/reference/greengrass/create-function-definition.html)。若要將 Lambda 函數部署至 Greengrass 核心，請建立包含函數的函數定義版本，建立參考函數定義版本和其他群組元件的群組版本，然後[部署群組](deployments.md)。

## 執行 Lambda 函數做為根
<a name="lambda-running-as-root"></a>

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

您必須先更新 AWS IoT Greengrass 組態以啟用支援，才能執行一或多個 Lambda 函數做為根目錄。支援在根目錄關閉時執行 Lambda 函數。如果您嘗試部署 Lambda 函數並以根 (UID 和 GID 為 0) 執行，且尚未更新 AWS IoT Greengrass 組態，則部署會失敗。類似以下的錯誤會出現在執行時間日誌 (*greengrass\$1root*/ggc/var/log/system/runtime.log) 中：

```
lambda(s)
[list of function arns] are configured to run as root while Greengrass is not configured to run lambdas with root permissions
```

**重要**  
除非絕對必要，否則建議您避免將 Lambda 函數作為根函數執行。以根目錄執行會增加下列風險：  
意外變更的風險，例如意外刪除關鍵檔案。
惡意個人對您的資料和裝置造成的風險。
當 Docker 容器搭配 `--net=host`和 執行時，容器逸出的風險`UID=EUID=0`。

**允許 Lambda 函數以根目錄執行**

1. 在您的裝置上 AWS IoT Greengrass ，導覽至 *greengrass-root*/config 資料夾。
**注意**  
根據預設，*greengrass-root* 為 /greengrass 目錄。

1. 編輯 config.json 檔案，以將 `"allowFunctionsToRunAsRoot" : "yes"` 新增到 `runtime` 欄位。例如：

   ```
   {
     "coreThing" : {
       ...
     },
     "runtime" : {
       ...
       "allowFunctionsToRunAsRoot" : "yes"
     },
     ...
   }
   ```

1. 使用以下命令重新啟動 AWS IoT Greengrass：

   ```
   cd /greengrass/ggc/core
   sudo ./greengrassd restart
   ```

   現在，您可以將 Lambda 函數的使用者 ID 和群組 ID (UID/GID) 設定為 0，以將該 Lambda 函數執行為根。

如果您想要不允許 Lambda 函數做為根函數執行 AWS IoT Greengrass ，您可以將 的值變更為 `"allowFunctionsToRunAsRoot"``"no"`並重新啟動。

## 選擇 Lambda 函數容器化時的考量事項
<a name="lambda-containerization-considerations"></a>

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

根據預設，Lambda 函數會在 AWS IoT Greengrass 容器內執行。該容器會隔離您的函數和主機，為容器內的主機和函數提供更多安全性。

建議您在 Greengrass 容器中執行 Lambda 函數，除非您的使用案例要求它們在沒有容器化的情況下執行。透過在 Greengrass 容器中執行 Lambda 函數，您可以更好地控制限制對 資源的存取。

以下是一些在無容器情況下執行的範例使用案例：
+ 您想要 AWS IoT Greengrass 在不支援容器模式的裝置上執行 （例如，因為您使用的是特殊 Linux 發行版本或核心版本太舊）。
+ 您想要在另一個容器環境中使用自己的 OverlayFS 執行 Lambda 函數，但在 Greengrass 容器中執行時遇到 OverlayFS 衝突。
+ 您需要存取無法在部署期間確定路徑的本機資源，或其路徑會在部署後變更，例如插入式裝置。
+ 您有一個已寫入程序的舊版應用程式，且在以容器化 Lambda 函數執行它時遇到問題。


**容器化差異**  

| 容器化 | 備註 | 
| --- | --- | 
| Greengrass 容器 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/lambda-group-config.html) | 
| 沒有容器 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/lambda-group-config.html) | 

**注意**  
Greengrass 群組的預設容器化設定不適用於[連接器](connectors.md)。

變更 Lambda 函數的容器化可能會在您部署時造成問題。如果您已將本機資源指派給新的容器化設定不再可用的 Lambda 函數，則部署會失敗。
+ 當您將 Lambda 函數從 Greengrass 容器中執行變更為在沒有容器化的情況下執行時，會捨棄函數的記憶體限制。您必須直接存取檔案系統，而不是使用連接的本機資源。您必須在部署前移除所有連接的資源。
+ 當您將 Lambda 函數從在沒有容器化的情況下執行變更為在容器中執行時，您的 Lambda 函數會失去檔案系統的直接存取權。您必須定義各函數的記憶體上限，或接受預設值 16 MB。您可以在部署之前為每個 Lambda 函數設定這些設定。<a name="change-containerization-lambda"></a>

**變更 Lambda 函數的容器化設定**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="lambda-choose-group"></a>選擇包含您要變更其設定之 Lambda 函數的群組。

1. <a name="lambda-choose-lambdas"></a>選擇 **Lambda 函數**索引標籤。

1. <a name="lambda-edit-lambda"></a>在您要變更的 Lambda 函數上，選擇省略符號 (**...**)，然後選擇**編輯組態**。

1. 變更容器化設定。如果您將 Lambda 函數設定為在 Greengrass 容器中執行，您還必須設定**記憶體限制**和對 **/sys 目錄的讀取存取權**。

1. <a name="lambda-save-changes"></a>選擇**儲存**，然後選擇**確認**以儲存對 Lambda 函數的變更。

變更會在群組部署後生效。

您也可以使用 *AWS IoT Greengrass API 參考*中的 [CreateFunctionDefinition](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinition-post.html) 和 [CreateFunctionDefinitionVersion](https://docs.aws.amazon.com/greengrass/v1/apireference/createfunctiondefinitionversion-post.html)。如果您要變更容器化設定，請務必也要更新其他參數。例如，如果您要從在 Greengrass 容器中執行 Lambda 函數變更為在沒有容器化的情況下執行，請務必清除 `MemorySize` 參數。

### 判斷您 Greengrass 裝置支援的隔離模式
<a name="dependency-checker-tests-isolation"></a>

您可以使用 AWS IoT Greengrass 相依性檢查程式來判斷 Greengrass 裝置支援哪些隔離模式 (Greengrass 容器/無容器）。

**執行 AWS IoT Greengrass 相依性檢查程式**

1. 從 [GitHub 儲存庫](https://github.com/aws-samples/aws-greengrass-samples)下載並執行 AWS IoT Greengrass 相依性檢查程式。

   ```
   wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.11.x.zip
   unzip greengrass-dependency-checker-GGCv1.11.x.zip
   cd greengrass-dependency-checker-GGCv1.11.x
   sudo modprobe configs
   sudo ./check_ggc_dependencies | more
   ```

1. 在 `more` 出現的位置，按 Spacebar 鍵可顯示另一頁文字。

如需 **modprobe** 命令的資訊，請在終端機中執行 **man modprobe**。

## 為群組中的 Lambda 函數設定預設存取身分
<a name="lambda-access-identity-groupsettings"></a>

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

如需進一步控制裝置資源的存取，您可以設定用於在 群組中執行 Lambda 函數的預設存取身分。此設定會決定在核心裝置上執行 Lambda 函數時授予的預設許可。若要覆寫群組中的個別函數設定，您可以使用函數的 **Run as (執行身分)** 屬性。如需詳細資訊，請參閱[執行身分](#lambda-access-identity)。

此群組層級設定也用於執行基礎 AWS IoT Greengrass Core 軟體。這包含管理操作的系統 Lambda 函數，例如訊息路由、本機陰影同步和自動 IP 地址偵測。

預設存取身分可設定為做為標準 AWS IoT Greengrass 系統帳戶 (ggc\$1user 和 ggc\$1group) 執行，或使用其他使用者或群組的許可。建議您針對其許可用於執行使用者定義或系統 Lambda 函數的任何使用者和群組，使用適當的資源限制、檔案許可和磁碟配額來設定 Greengrass 硬體。

**修改 AWS IoT Greengrass 群組的預設存取身分**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-group"></a>選擇您希望變更設定的群組。

1. 選擇 **Lambda 函數**索引標籤，然後在**預設 Lambda 函數執行期環境**區段下，選擇**編輯**。

1. 在**編輯預設 Lambda 函數執行期環境**頁面**的預設系統使用者和群組**下，選擇**另一個使用者 ID/群組 ID**。

   當您選擇此選項時，系統**使用者 ID （數字）** 和**系統群組 ID （數字）** 欄位會顯示。

1. 輸入使用者 ID、群組 ID 或兩者。如果您將欄位留白，則會使用個別的 Greengrass 系統帳戶 (ggc\$1user 或 ggc\$1group)。
   + 在**系統使用者 ID （數字）** 中，輸入具有預設要在群組中執行 Lambda 函數之許可的使用者 ID。您可以使用 AWS IoT Greengrass 裝置上的 **getent passwd** 命令查看使用者 ID。
   + 針對**系統群組 ID （數字）**，輸入群組的群組 ID，該群組具有預設要在群組中執行 Lambda 函數的許可。您可以使用 AWS IoT Greengrass 裝置上的 **getent group** 命令查看群組 ID。
**重要**  
執行身分為根使用者會增加資料和裝置的風險。除非您的商業案例要求，否則請勿以根執行 (UID/GID = 0)。如需詳細資訊，請參閱[執行 Lambda 函數做為根](#lambda-running-as-root)。

變更會在群組部署後生效。

## 為群組中的 Lambda 函數設定預設容器化
<a name="lambda-containerization-groupsettings"></a>

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

Greengrass 群組的容器化設定會決定群組中 Lambda 函數的預設容器化。
+ 在 **Greengrass 容器**模式中，Lambda 函數預設會在 AWS IoT Greengrass 容器內的隔離執行時間環境中執行。
+ 在**無容器**模式中，Lambda 函數預設會以一般 Linux 程序執行。

您可以修改群組設定，以指定群組中 Lambda 函數的預設容器化。如果您想要 Lambda 函數以與群組預設值不同的容器化執行，您可以覆寫群組中一或多個 Lambda 函數的此設定。請先參閱[選擇 Lambda 函數容器化時的考量事項](#lambda-containerization-considerations)，再變更容器化設定。

**重要**  
如果您想要變更群組的預設容器化，但有一或多個函數使用不同的容器化，請在變更群組設定之前變更 Lambda 函數的設定。如果您先變更群組容器化設定，就會捨棄 **Memory limit (記憶體限制)** 和 **Read access to /sys directory (對 /sys 目錄的讀取存取)** 設定。

**修改 AWS IoT Greengrass 群組的容器化設定**

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-group"></a>選擇您希望變更設定的群組。

1. 選擇 **Lambda 函數**索引標籤。

1. 在**預設 Lambda 函數執行期環境中**，選擇**編輯**。

1. 在**編輯預設 Lambda 函數執行期環境**頁面**的預設 Lambda 函數容器化**下，變更容器化設定。

1. 選擇**儲存**。

變更會在群組部署後生效。

## Greengrass Lambda 函數的通訊流程
<a name="lambda-communication"></a>

Greengrass Lambda 函數支援數種與 AWS IoT Greengrass 群組的其他成員、本機服務和雲端服務 （包括 AWS 服務） 通訊的方法。

### 使用 MQTT 訊息進行通訊
<a name="lambda-messages"></a>

Lambda 函數可以使用由訂閱控制的發佈訂閱模式來傳送和接收 MQTT 訊息。

此通訊流程可讓 Lambda 函數與下列實體交換訊息：
+ 群組中的用戶端裝置。
+ 該群組中的連接器。
+ 群組中的其他 Lambda 函數。
+ AWS IoT.
+ 本機裝置陰影服務。

訂閱會定義將訊息從來源路由到目標時所用的訊息來源、訊息目標和主題 (或主體)。發佈至 Lambda 函數的訊息會傳遞至函數的已註冊處理常式。訂閱啟用更多安全性，和提供可預測的互動。如需詳細資訊，請參閱[MQTT 簡訊工作流程中的受管訂閱](gg-sec.md#gg-msg-workflow)。

**注意**  
當核心離線時，Greengrass Lambda 函數可以與用戶端裝置、連接器、其他函數和本機影子交換訊息，但訊息 AWS IoT 會排入佇列。如需詳細資訊，請參閱[雲端目標的 MQTT 訊息佇列](gg-core.md#mqtt-message-queue)。

### 其他通訊流程
<a name="lambda-other-communication"></a>
+ 為了在核心裝置上與本機裝置和磁碟區資源和機器學習模型互動，Greengrass Lambda 函數會使用平台特定的作業系統介面。例如，您可以在 Python 函數的 [os](https://docs.python.org/2/library/os.html) 模組中使用 `open`方法。若要允許函數存取資源，該函數必須*隸屬*於資源並授與 `read-only` 或 `read-write` 許可。如需詳細資訊，包括 AWS IoT Greengrass 核心版本可用性，請參閱 [使用 Lambda 函數和連接器存取本機資源](access-local-resources.md)和 [從 Lambda 函數程式碼存取機器學習資源](access-ml-resources.md#access-resource-function-code)。
**注意**  
如果您在沒有容器化的情況下執行 Lambda 函數，則無法使用連接的本機裝置和磁碟區資源，而且必須直接存取這些資源。
+ Lambda 函數可以使用 AWS IoT Greengrass 核心 SDK 中的`Lambda`用戶端來叫用 Greengrass 群組中的其他 Lambda 函數。
+ Lambda 函數可以使用 AWS SDK 與 AWS 服務通訊。如需詳細資訊，請參閱 [AWS SDK](#aws-sdk)。
+ Lambda 函數可以使用第三方界面與外部雲端服務通訊，類似於雲端型 Lambda 函數。

**注意**  
當核心離線時，Greengrass Lambda 函數無法與 AWS 或其他雲端服務通訊。

## 擷取輸入 MQTT 主題 (或主旨)
<a name="lambda-get-mqtt-topic"></a>

AWS IoT Greengrass 使用訂閱來控制用戶端裝置、Lambda 函數和群組中的連接器，以及 AWS IoT 或本機影子服務之間的 MQTT 訊息交換。訂閱會定義訊息來源、訊息目標，以及用於路由訊息的 MQTT 主題。當目標為 Lambda 函數時，當來源發佈訊息時，會叫用函數的處理常式。如需詳細資訊，請參閱[使用 MQTT 訊息進行通訊](#lambda-messages)。

下列範例顯示 Lambda 函數如何從傳遞給處理常式`context`的 取得輸入主題。方式是從內容階層 (`context.client_context.custom['subject']`) 存取 `subject` 金鑰。範例也會剖析輸入 JSON 訊息，並發佈剖析的主題和訊息。

**注意**  
在 AWS IoT Greengrass API 中，[訂閱](https://docs.aws.amazon.com/greengrass/v1/apireference/definitions-subscription.html)的主題由 `subject` 屬性表示。

```
import greengrasssdk
import logging

client = greengrasssdk.client('iot-data')

OUTPUT_TOPIC = 'test/topic_results'

def get_input_topic(context):
    try:
        topic = context.client_context.custom['subject']
    except Exception as e:
        logging.error('Topic could not be parsed. ' + repr(e))
    return topic
    
def get_input_message(event):
    try:
        message = event['test-key']
    except Exception as e:
        logging.error('Message could not be parsed. ' + repr(e))
    return message

def function_handler(event, context):
    try:
        input_topic = get_input_topic(context)
        input_message = get_input_message(event)
        response = 'Invoked on topic "%s" with message "%s"' % (input_topic, input_message)
        logging.info(response)
    except Exception as e:
        logging.error(e)

    client.publish(topic=OUTPUT_TOPIC, payload=response)

    return
```

若要測試函數，請使用預設的組態設定將其新增至群組。接著，新增以下訂閱並部署群組。如需說明，請參閱[單元 3 （第 1 部分）： 上的 Lambda 函數 AWS IoT Greengrass](module3-I.md)。


****  

| 來源 | Target | 主題篩選條件 | 
| --- | --- | --- | 
| IoT Cloud (IoT 雲端) | 此函數 | test/input\$1message | 
| 此函數 | IoT Cloud (IoT 雲端) | test/topic\$1results | 

部署完成後，呼叫該函數。

1. 在 AWS IoT 主控台中，開啟 **MQTT 測試用戶端**頁面。

1. 選取訂閱`test/topic_results`主題索引標籤**來訂閱主題**。

1. 選取發佈至`test/input_message`主題索引標籤，將訊息**發佈至主題**。在此範例中，您必須於 JSON 訊息包含 `test-key` 屬性。

   ```
   {
     "test-key": "Some string value"
   }
   ```

   如果成功，函數會將輸入主題和訊息字串發佈至 `test/topic_results` 主題。

## Greengrass Lambda 函數的生命週期組態
<a name="lambda-lifecycle"></a>

Greengrass Lambda 函數生命週期會決定函數何時啟動，以及它如何建立和使用容器。生命週期也可決定在函數處理常式外所保留的變數和預先處理邏輯。

AWS IoT Greengrass 支援隨需 （預設） 或長期生命週期：
+ **隨需**函數，在沒有需要執行工作時，其被呼叫和停用會讓此隨需函數啟動。叫用函數會建立分離的容器 (或沙盒) 以處理呼叫，除非已有可重複使用的現有容器。傳送到函數的資料可能會透過任何容器拉出。

  隨需 函數的多個呼叫可以平行執行。

  每當建立新容器時，在函數處理常式外定義的變數或預先處理的邏輯將不將予以保留。
+ **長期 **（或*固定*) 函數會在 AWS IoT Greengrass 核心啟動並在單一容器中執行時自動啟動。傳送到函數的所有資料可能會透過一樣的容器拉出。

  會佇列多個呼叫，直到先前的呼叫已執行。

  在函數處理常式外定義的變數或預先處理的邏輯，每次呼叫時會保留於函數處理常式。

  當您需要在沒有任何初始輸入的情況下開始執行工作時，長期 Lambda 函數很有用。例如，當函數開始接收裝置資料時，長期函數可以載入和啟動就緒的機器學習模型。
**注意**  
請記住長期函數有與其相關的呼叫處理常式之逾時。如果您想要無限期地執行程式碼，則您必須在處理常式外啟動此程式碼。請確定在處理常式外沒有封鎖程式碼，可以預防完成其初始化的函數。  
 除非核心停止 （例如，在群組部署或裝置重新啟動期間） 或函數進入錯誤狀態 （例如處理常式逾時、未攔截的例外狀況，或超過其記憶體限制），否則這些函數會執行。

如需容器重複使用的詳細資訊，請參閱 AWS 運算部落格中的[了解 中的容器重複使用 AWS Lambda](https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/)。

## Lambda 可執行檔
<a name="lambda-executables"></a>

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

Lambda 可執行檔是一種 Greengrass Lambda 函數，可用於在核心環境中執行二進位程式碼。它可讓您原生執行裝置特定的功能，並受益於編譯程式碼的較小足跡。事件可以叫用 Lambda 可執行檔、叫用其他函數，以及存取本機資源。

Lambda 可執行檔僅支援二進位編碼類型 （不支援 JSON)，否則您可以在 Greengrass 群組中管理它們，並像其他 Greengrass Lambda 函數一樣進行部署。不過，建立 Lambda 可執行檔的程序與建立 Python、Java 和 Node.js Lambda 函數不同：
+ 您無法使用 AWS Lambda 主控台建立 （或管理） Lambda 可執行檔。您只能使用 AWS Lambda API 建立 Lambda 可執行檔。
+ 您可以將函數程式碼上傳到 AWS Lambda 做為編譯的可執行檔，其中包含[AWS IoT Greengrass 適用於 C 的 核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-c)。
+ 您可以指定可執行檔的名稱為函數處理常式。

Lambda 可執行檔必須在其函數程式碼中實作特定呼叫和程式設計模式。例如，`main` 方法必須：
+ 呼叫 `gg_global_init` 以初始化 Greengrass 內部全域變數。在建立任何執行緒之前，以及在呼叫任何其他 AWS IoT Greengrass Core SDK 函數之前，必須呼叫此函數。
+ 呼叫 `gg_runtime_start` 以向 Greengrass Lambda 執行時間註冊函數處理常式。此函數必須在初始化期間呼叫。呼叫此函數會讓執行時間使用目前的執行緒。此選擇性使用的 `GG_RT_OPT_ASYNC` 參數通知該函數不要進行封鎖，反而請它為執行時間建立新的執行緒。此函數使用 `SIGTERM` 處理常式。

下列程式碼片段是 GitHub 上 [simple\$1handler.c](https://github.com/aws/aws-greengrass-core-sdk-c/blob/master/aws-greengrass-core-sdk-c-example/simple_handler.c) 程式碼範例的 `main`方法。

```
int main() {
    gg_error err = GGE_SUCCESS;

    err = gg_global_init(0);
    if(err) {
        gg_log(GG_LOG_ERROR, "gg_global_init failed %d", err);
        goto cleanup;
    }

    gg_runtime_start(handler, 0);

cleanup:
    return -1;
}
```

如需需求、限制條件和其他實作詳細資訊的詳細資訊，請參閱[AWS IoT Greengrass 適用於 C 的核心 SDK](https://github.com/aws/aws-greengrass-core-sdk-c)。

### 建立 Lambda 可執行檔
<a name="create-lambda-executable"></a>

編譯程式碼與 SDK 之後，請使用 AWS Lambda API 來建立 Lambda 函數並上傳已編譯的可執行檔。

**注意**  
必須使用 C89 相容編譯器編譯您的函數。

下列範例使用 [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) CLI 命令來建立 Lambda 可執行檔。此命令指定：
+ 處理常式的可執行檔名稱。這必須為您編譯的可執行檔之確切名稱。
+ `.zip` 檔案路徑含有編譯的可執行檔。
+ 執行階段的 `arn:aws:greengrass:::runtime/function/executable`。這是所有 Lambda 可執行檔的執行時間。

**注意**  
對於 `role`，您可以指定任何 Lambda 執行角色的 ARN。 AWS IoT Greengrass 不使用此角色，但需要 參數才能建立函數。如需 Lambda 執行角色的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[AWS Lambda 許可模型](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)。

```
aws lambda create-function \
--region aws-region \
--function-name function-name \
--handler executable-name \
--role role-arn \
--zip-file fileb://file-name.zip \
--runtime arn:aws:greengrass:::runtime/function/executable
```

接著，使用 AWS Lambda API 發佈版本並建立別名。
+ 使用 [publish-version](https://docs.aws.amazon.com/cli/latest/reference/lambda/publish-version.html) 發佈函數版本。

  ```
  aws lambda publish-version \
  --function-name function-name \
  --region aws-region
  ```
+ 使用 [create-alias](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-alias.html) 來建立別名，以指向您剛發佈的版本。建議您在將 Lambda 函數新增至 Greengrass 群組時，依別名參考它們。

  ```
  aws lambda create-alias \
  --function-name function-name \
  --name alias-name \
  --function-version version-number \
  --region aws-region
  ```

**注意**  
 AWS Lambda 主控台不會顯示 Lambda 可執行檔。若要更新函數程式碼，您必須使用 AWS Lambda API。

然後，將 Lambda 可執行檔新增至 Greengrass 群組，將其設定為在其群組特定設定中接受二進位輸入資料，然後部署群組。您可以在 AWS IoT Greengrass 主控台或使用 AWS IoT Greengrass API 執行此操作。

# AWS IoT Greengrass 在 Docker 容器中執行
<a name="run-gg-in-docker-container"></a>

AWS IoT Greengrass 可以設定為在 [Docker](https://www.docker.com/) 容器中執行。

您可以透過已安裝 AWS IoT Greengrass Core 軟體和相依性的 [Amazon CloudFront](what-is-gg.md#gg-docker-download) 下載 Dockerfile。若要修改 Docker 映像檔以在不同平台架構上執行或減少 Docker 映像檔的大小，請參閱 Docker 套件下載中的 `README` 檔案。

為了協助您開始試驗 AWS IoT Greengrass， AWS 也提供已安裝 AWS IoT Greengrass Core 軟體和相依性的預先建置 Docker 映像。您可以從 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 或 [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) (Amazon ECR) 下載映像。這些預先建置映像使用 Amazon Linux 2 (x86\$164) 和 Alpine Linux (x86\$164、Armv7l 貨 AArch64) 的基本映像。

**重要**  
<a name="docker-images-end-of-maintenance"></a>2022 年 6 月 30 日，發佈至 Amazon Elastic Container Registry (Amazon ECR) 和 Docker Hub 的 AWS IoT Greengrass Core 軟體 v1.x Docker 映像的 AWS IoT Greengrass 結束維護。您可以繼續從 Amazon ECR 和 Docker Hub 下載這些 Docker 映像，直到 2023 年 6 月 30 日，也就是維護結束後 1 年。不過，在 2022 年 6 月 30 日結束維護之後， AWS IoT Greengrass Core 軟體 v1.x Docker 映像將不再收到安全修補程式或錯誤修正。如果您執行依賴這些 Docker 映像的生產工作負載，建議您使用 AWS IoT Greengrass 提供的 Dockerfile 建置自己的 Docker 映像。如需詳細資訊，請參閱[AWS IoT Greengrass Docker 軟體](what-is-gg.md#gg-docker-download)。

本主題說明如何從 Amazon ECR 下載 AWS IoT Greengrass Docker 映像，並在 Windows、macOS 或 Linux (x86\$164) 平台上執行。本主題包含以下步驟：

1. [從 Amazon ECR 取得 AWS IoT Greengrass 容器映像](#docker-pull-image)

1. [建立及設定 Greengrass 群組和核心](#docker-config-gg)

1. [在 AWS IoT Greengrass 本機執行](#docker-run-gg)

1. [為群組的容器化設定「No container」(無容器)](#docker-no-container)

1. [將 Lambda 函數部署至 Docker 容器](#docker-add-lambdas)

1. [（選用） 在 Docker 容器中部署與 Greengrass 互動的用戶端裝置](#docker-add-devices)

當您 AWS IoT Greengrass 在 Docker 容器中執行 時，不支援下列功能：<a name="docker-image-unsupported-features"></a>
+ 在 **Greengrass 容器**模式下執行[的連接器](connectors.md)。若要在 Docker 容器中執行連接器，連接器必須以 **No container (無容器)** 模式執行。若要尋找支援 **No container (無容器)** 模式的連接器，請參閱 [AWS提供的 Greengrass 連接器](connectors-list.md)。其中一些連接器具有隔離模式參數，您必須設定為 **No container (無容器)**。
+ [本機裝置和磁碟區資源](access-local-resources.md)。您在 Docker 容器中執行的使用者定義 Lambda 函數必須直接存取核心上的裝置和磁碟區。

當 Greengrass 群組的 Lambda 執行期環境設定為[無容器](lambda-group-config.md#no-container-mode)時，不支援這些功能，這是 AWS IoT Greengrass 在 Docker 容器中執行的必要項目。

## 先決條件
<a name="docker-image-prerequisites"></a>

開始本教學課程之前，您必須執行下列動作。<a name="docker-image-prereq-list"></a>
+ 您必須根據您選擇的 AWS Command Line Interface (AWS CLI) 版本，在主機電腦上安裝下列軟體和版本。

------
#### [ AWS CLI version 2 ]
  + [Docker](https://docs.docker.com/install/) 18.09 版或更新版本。舊版也可以運作，但我們建議使用 18.09 或更新版本。
  + AWS CLI 2.0.0 版或更新版本。
    + 若要安裝第 2 AWS CLI 版，請參閱[安裝第 2 AWS CLI 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。
    + 若要設定 AWS CLI，請參閱[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
**注意**  
若要在 Windows 電腦上升級至更新 AWS CLI 版本 2，您必須重複 [MSI 安裝](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html)程序。

------
#### [ AWS CLI version 1 ]
  + [Docker](https://docs.docker.com/install/) 18.09 版或更新版本。舊版也可以運作，但我們建議使用 18.09 或更新版本。
  + [Python](https://www.python.org/downloads/) 3.6 版或更新版本。
  + [pip](https://pip.pypa.io/en/stable/installing) 版本 18.1 或更新版本。
  + AWS CLI 1.17.10 版或更新版本
    + 若要安裝第 1 AWS CLI 版，請參閱[安裝第 1 AWS CLI 版](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html)。
    + 若要設定 AWS CLI，請參閱[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
    + 若要升級至最新版本的 第 1 AWS CLI 版，請執行下列命令。

      ```
      pip install awscli --upgrade --user
      ```
**注意**  
如果您在 Windows 上使用 AWS CLI 版本 1 的 [MSI 安裝](https://docs.aws.amazon.com/cli/latest/userguide/install-windows.html#msi-on-windows)，請注意下列事項：  
如果第 1 AWS CLI 版安裝無法安裝 botocore，請嘗試使用 [Python 和 pip 安裝](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html#awscli-install-windows-pip)。
若要升級至更新 AWS CLI 版本 1，您必須重複 MSI 安裝程序。

------
+ 若要存取 Amazon Elastic Container Registry (Amazon ECR) 資源，您必須授予下列許可。
  + Amazon ECR 要求使用者透過 AWS Identity and Access Management (IAM) 政策授予`ecr:GetAuthorizationToken`許可，才能向登錄檔進行身分驗證，並從 Amazon ECR 儲存庫推送或提取映像。如需詳細資訊，請參閱《[Amazon Elastic Container Registry 使用者指南》中的 Amazon ECR 儲存庫政策範例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html)*和*[存取一個 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-access-one-bucket)。

## 步驟 1：從 Amazon ECR 取得 AWS IoT Greengrass 容器映像
<a name="docker-pull-image"></a>

AWS 提供已安裝 AWS IoT Greengrass Core 軟體的 Docker 映像。

**警告**  <a name="docker-images-python-2.7-removal"></a>
從 AWS IoT Greengrass 核心軟體的 1.11.6 版開始，Greengrass Docker 映像不再包含 Python 2.7，因為 Python 2.7 在 2020 年達到end-of-life，且不再收到安全性更新。如果您選擇更新這些 Docker 映像，建議您先驗證應用程式是否使用新的 Docker 映像，再將更新部署到生產裝置。如果您為使用 Greengrass Docker 映像的應用程式需要 Python 2.7，您可以修改 Greengrass Dockerfile 以包含應用程式的 Python 2.7。

如需示範如何從 Amazon ECR 提取`latest`映像的步驟，請選擇您的作業系統：

### 提取容器映像 (Linux)
<a name="docker-pull-image-linux"></a>

在您的電腦終端機上執行下列命令。

1. <a name="docker-get-login"></a>登入 Amazon ECR 中的 AWS IoT Greengrass 登錄檔。

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   如果成功，輸出會顯示 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>擷取 AWS IoT Greengrass 容器映像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
`latest` 映像包含安裝在 Amazon Linux 2 基礎映像上最新穩定版本的 AWS IoT Greengrass Core 軟體。您也可以從儲存庫提取其他映像。若要尋找所有可用的映像，請檢查 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的**標籤**頁面或使用 **aws ecr list-images**命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

1. 啟用 symlink 和 hardlink 保護。如果您正在實驗 AWS IoT Greengrass 容器中執行 ，您只能啟用目前開機的設定。
**注意**  
您可能需要使用 **sudo** 來執行這些命令。
   + 僅針對目前的開機裝置啟用設定：

     ```
     echo 1 > /proc/sys/fs/protected_hardlinks
     echo 1 > /proc/sys/fs/protected_symlinks
     ```
   + 使設定在重新啟動時保留：

     ```
     echo '# AWS IoT Greengrass' >> /etc/sysctl.conf 
     echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf 
     echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf
     
     sysctl -p
     ```

1. <a name="docker-linux-enable-ipv4"></a>啟用 IPv4 網路轉送，這是 AWS IoT Greengrass 雲端部署和 MQTT 通訊在 Linux 上運作的必要條件。在 `/etc/sysctl.conf` 檔案中，將 `net.ipv4.ip_forward` 設為 1，然後重新載入 `sysctls`。

   ```
   sudo nano /etc/sysctl.conf
   # set this net.ipv4.ip_forward = 1
   sudo sysctl -p
   ```
**注意**  
您可以使用偏好的編輯器來取代 nano。

### 提取容器映像 (macOS)
<a name="docker-pull-image-mac"></a>

在您的電腦終端機上執行下列命令。

1. <a name="docker-get-login"></a>登入 Amazon ECR 中的 AWS IoT Greengrass 登錄檔。

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   如果成功，輸出會顯示 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>擷取 AWS IoT Greengrass 容器映像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
`latest` 映像包含安裝在 Amazon Linux 2 基礎映像上最新穩定版本的 AWS IoT Greengrass Core 軟體。您也可以從儲存庫提取其他映像。若要尋找所有可用的映像，請檢查 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的**標籤**頁面或使用 **aws ecr list-images**命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

### 提取容器映像 (Windows)
<a name="docker-pull-image-windows"></a>

在命令提示中執行下列命令：要在 Windows 上使用 Docker 命令，必須先執行 Docker 桌面。

1. <a name="docker-get-login"></a>登入 Amazon ECR 中的 AWS IoT Greengrass 登錄檔。

   ```
   aws ecr get-login-password --region  us-west-2 | docker login --username AWS --password-stdin https://216483018798.dkr.ecr.us-west-2.amazonaws.com
   ```

   如果成功，輸出會顯示 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>擷取 AWS IoT Greengrass 容器映像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
`latest` 映像包含安裝在 Amazon Linux 2 基礎映像上最新穩定版本的 AWS IoT Greengrass Core 軟體。您也可以從儲存庫提取其他映像。若要尋找所有可用的映像，請檢查 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的**標籤**頁面或使用 **aws ecr list-images**命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

## 步驟 2：建立及設定 Greengrass 群組和核心
<a name="docker-config-gg"></a>

Docker 映像已安裝 AWS IoT Greengrass Core 軟體，但您必須建立 Greengrass 群組和核心。這包括下載憑證和核心的組態檔案。
+ 請遵循 [單元 2：安裝 AWS IoT Greengrass 核心軟體](module2.md) 中的步驟。略過下載和執行 AWS IoT Greengrass 核心軟體的步驟。此軟體及其執行時間相依性已在 Docker 映像檔中設定。

## 步驟 3： AWS IoT Greengrass 在本機執行
<a name="docker-run-gg"></a>

設定完群組之後，您便能設定及啟動核心。如需示範執行方式的步驟，請選擇您的作業系統：

### 在本機執行 Greengrass (Linux)
<a name="docker-run-gg-linux"></a>

在您的電腦終端機上執行下列命令。

1. <a name="docker-create-certs-folder"></a>為裝置的安全資源建立資料夾，並將憑證和金鑰移至該資料夾。執行下列命令。以安全資源的路徑取代 *path-to-security-files*，並以檔案名稱中的憑證 ID 取代 *certificateId*。

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>為裝置的組態建立資料夾，並將 AWS IoT Greengrass 核心組態檔案移至該資料夾。執行下列命令。將 *path-to-config-file* 取代為組態檔案的路徑。

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>在 Docker 容器中啟動 AWS IoT Greengrass 並繫結掛載憑證和組態檔案。

   以解壓縮憑證和組態檔案的路徑取代 `/tmp`。

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   輸出應類似以下範例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 在本機執行 Greengrass (macOS)
<a name="docker-run-gg-mac"></a>

在您的電腦終端機上執行下列命令。

1. <a name="docker-create-certs-folder"></a>為裝置的安全資源建立資料夾，並將憑證和金鑰移至該資料夾。執行下列命令。以安全資源的路徑取代 *path-to-security-files*，並以檔案名稱中的憑證 ID 取代 *certificateId*。

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>為裝置的組態建立資料夾，並將 AWS IoT Greengrass 核心組態檔案移至該資料夾。執行下列命令。將 *path-to-config-file* 取代為組態檔案的路徑。

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>在 Docker 容器中啟動 AWS IoT Greengrass 並繫結掛載憑證和組態檔案。

   以解壓縮憑證和組態檔案的路徑取代 `/tmp`。

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   輸出應類似以下範例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 在本機執行 Greengrass (Windows)
<a name="docker-run-gg-windows"></a>

1. 為裝置的安全資源建立資料夾，並將憑證和金鑰移至該資料夾。在命令提示中執行下列命令：以安全資源的路徑取代 *path-to-security-files*，並以檔案名稱中的憑證 ID 取代 *certificateId*。

   ```
   mkdir C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-public.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-private.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs
   ```

1. 為裝置的組態建立資料夾，並將 AWS IoT Greengrass 核心組態檔案移至該資料夾。在命令提示中執行下列命令：將 *path-to-config-file* 取代為組態檔案的路徑。

   ```
   mkdir C:\Users\%USERNAME%\Downloads\config
   move path-to-config-file\config.json C:\Users\%USERNAME%\Downloads\config
   ```

1. 在 Docker 容器中啟動 AWS IoT Greengrass 並繫結掛載憑證和組態檔案。在命令提示中執行下列命令。

   ```
   docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   Docker 提示您與 Docker 協助程式共用 `C:\` 磁碟機時，允許其在 Docker 容器內綁定掛載 `C:\` 目錄。如需詳細資訊，請參閱 Docker 文件中的[共用磁碟機](https://docs.docker.com/docker-for-windows/#shared-drives)。

   輸出應類似以下範例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

**注意**  
如果容器不開啟 shell 和立即結束，您可以透過在您啟動映像時連結掛載 Greengrass 執行時間日誌來偵錯問題。如需詳細資訊，請參閱[將 Greengrass 執行時間日誌保留在 Docker 容器之外](#debugging-docker-persist-logs)。

## 步驟 4：為 Greengrass 群組的容器化設定「No container」(無容器)
<a name="docker-no-container"></a>

當您 AWS IoT Greengrass 在 Docker 容器中執行時，所有 Lambda 函數都必須在沒有容器化的情況下執行。在本步驟中，您會將群組的預設容器化設為 **No container (無容器)**。第一次部署群組之前，必須先執行此動作。

1. <a name="console-gg-groups"></a>在 AWS IoT 主控台導覽窗格的**管理**下，展開 **Greengrass 裝置**，然後選擇**群組 (V1)**。

1. <a name="group-choose-group"></a>選擇您希望變更設定的群組。

1. 選擇 **Lambda 函數**索引標籤。

1. 在**預設 Lambda 函數執行期環境中**，選擇**編輯**。

1. 在**編輯預設 Lambda 函數執行期環境中**，在**預設 Lambda 函數容器化**下，變更容器化設定。

1. 選擇**儲存**。

變更會在群組部署後生效。

如需詳細資訊，請參閱[為群組中的 Lambda 函數設定預設容器化](lambda-group-config.md#lambda-containerization-groupsettings)。

**注意**  
根據預設，Lambda 函數會使用群組容器化設定。如果您在 Docker **容器中執行 時，覆寫任何 Lambda 函數的無**容器設定，則部署會失敗。 AWS IoT Greengrass 

## 步驟 5：將 Lambda 函數部署至 AWS IoT Greengrass Docker 容器
<a name="docker-add-lambdas"></a>

您可以將長期 Lambda 函數部署到 Greengrass Docker 容器。
+ 請依照中的步驟[單元 3 （第 1 部分）： 上的 Lambda 函數 AWS IoT Greengrass](module3-I.md)，將長期 Hello World Lambda 函數部署至容器。

## 步驟 6：（選用） 部署與 Docker 容器中執行之 Greengrass 互動的用戶端裝置
<a name="docker-add-devices"></a>

您也可以部署在 Docker 容器中執行 AWS IoT Greengrass 時與 互動的用戶端裝置。
+ 依照 中的步驟[單元 4：與 AWS IoT Greengrass 群組中的用戶端裝置互動](module4.md)部署連接到核心的用戶端裝置，並傳送 MQTT 訊息。

## 停止 AWS IoT Greengrass Docker 容器
<a name="docker-stop"></a>

若要停止 AWS IoT Greengrass Docker 容器，請在終端機或命令提示中按 Ctrl\$1C。此動作會`SIGTERM`傳送至 Greengrass 協助程式程序，以銷毀 Greengrass 協助程式程序，以及由協助程式程序啟動的所有 Lambda 程序。Docker 容器是以 `/dev/init` 程序初始化為 PID 1，這有助於移除任何剩餘的 zombie 程序。如需詳細資訊，請參閱 [Docker 執行參考](https://docs.docker.com/engine/reference/commandline/run/#options)。

## 在 Docker AWS IoT Greengrass 容器中進行故障診斷
<a name="troubleshooting-docker-gg"></a>

使用以下資訊來協助疑難排解在 Docker 容器中執行 AWS IoT Greengrass 的問題。

### 錯誤：無法從非 TTY 裝置執行互動式登入。
<a name="docker-troubleshootin-ecr-get-login-password"></a>

**解決方案：**執行 `aws ecr get-login-password` 命令時，可能會發生此錯誤。請確定您已安裝最新版本 AWS CLI 2 或版本 1。我們建議您使用 第 2 AWS CLI 版。如需詳細資訊，請參閱「AWS Command Line Interface 使用者指南」**中的[安裝 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。

### 錯誤：不明選項：-no-include-email。
<a name="docker-troubleshooting-cli-version"></a>

**解決方案：**執行 `aws ecr get-login` 命令時，可能會發生此錯誤。請確定您已安裝 AWS CLI 最新版本 （例如，執行：`pip install awscli --upgrade --user`)。如果您使用 Windows 並已使用 MSI 安裝程式安裝 CLI，您必須重新啟動安裝程序。如需詳細資訊，請參閱*AWS Command Line Interface 《 使用者指南*》中的在 [Microsoft Windows AWS Command Line Interface 上安裝](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html) 。

### 警告：IPv4 已停用。網路將無法運作。
<a name="docker-troubleshooting-ipv4-disabled"></a>

**解決方案：**在 Linux AWS IoT Greengrass 電腦上執行 時，您可能會收到此警告或類似訊息。如[此步驟](#docker-linux-enable-ipv4)所述啟用 IPv4 網路轉送。未啟用 IPv4 轉送時 AWS IoT Greengrass ，雲端部署和 MQTT 通訊無法運作。如需詳細資訊，請參閱 Docker 文件中的[在執行時間設定命名空間核心參數 (sysctls)](https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime)。

### 錯誤：防火牆封鎖了 Windows 和容器之間的檔案共用。
<a name="docker-troubleshooting-firewall"></a>

**解決方案：**在 Windows 電腦上執行 Docker 時，您可能收到此錯誤或 `Firewall Detected` 訊息。如果您登入虛擬私有網路 (VPN)，而您的網路設定防止掛載共用磁碟機，也可能會發生這個錯誤。在這種情況下，請關閉 VPN 並重新執行 Docker 容器。

### 錯誤：呼叫 GetAuthorizationToken 操作時發生錯誤 (AccessDeniedException)：User： arn：aws：iam：：<account-id>：user/<user-name> 未獲授權在資源上執行：ecr：GetAuthorizationToken： \$1
<a name="docker-troubleshooting-ecr-perms"></a>

如果您沒有足夠的許可來存取 Amazon ECR 儲存庫，則執行 `aws ecr get-login-password`命令時可能會收到此錯誤。如需詳細資訊，請參閱《[Amazon ECR 使用者指南》中的 Amazon ECR 儲存庫政策範例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html)**[和存取一個 Amazon ECR 儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)。

如需一般 AWS IoT Greengrass 故障診斷說明，請參閱 [故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

### 在 Docker AWS IoT Greengrass 容器中偵錯
<a name="debugging-docker-gg"></a>

為了對 Docker 容器的問題進行偵錯，您可以保留 Greengrass 執行時間日誌或將互動式 shell 連接到 Docker 容器。

#### 將 Greengrass 執行時間日誌保留在 Docker 容器之外
<a name="debugging-docker-persist-logs"></a>

您可以在繫結掛載`/greengrass/ggc/var/log`目錄之後執行 AWS IoT Greengrass Docker 容器。容器結束或移除之後，日誌仍會保留。

**在 Linux 或 macOS 上**  
[停止任何 Greengrass Docker 容器](#docker-stop)在主機上執行，接著在終端機中執行以下命令。此會連結掛載 Greengrass `log` 目錄並啟動 Docker 映像檔。  
以解壓縮憑證和組態檔案的路徑取代 `/tmp`。  

```
docker run --rm --init -it --name aws-iot-greengrass \
      --entrypoint /greengrass-entrypoint.sh \
      -v /tmp/certs:/greengrass/certs \
      -v /tmp/config:/greengrass/config \
      -v /tmp/log:/greengrass/ggc/var/log \
      -p 8883:8883 \
      216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
接著您可以在主機上的 `/tmp/log` 檢查日誌，以查看 Greengrass 在 Docker 容器內部執行的同時發生了什麼。

**在 Windows 上**  
[停止任何 Greengrass Docker 容器](#docker-stop)在主機上執行，接著在命令提示中執行以下命令。此會連結掛載 Greengrass `log` 目錄並啟動 Docker 映像檔。  

```
cd C:\Users\%USERNAME%\Downloads
mkdir log
docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
接著您可以在主機上的 `C:/Users/%USERNAME%/Downloads/log` 檢查日誌，以查看 Greengrass 在 Docker 容器內部執行的同時發生了什麼。

#### 將互動式 Shell 連接到 Docker 容器
<a name="debugging-docker-attach-shell"></a>

您可以將互動式 shell 連接到執行中的 AWS IoT Greengrass Docker 容器。這可協助您調查 Greengrass Docker 容器的狀態。

**在 Linux 或 macOS 上**  
Greengrass Docker 容器執行時，在獨立的終端機中執行以下命令。  

```
docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
```

**在 Windows 上**  
Greengrass Docker 容器執行時，在獨立的命令提示中執行以下命令。  

```
docker ps -a -q -f "name=aws-iot-greengrass"
```
從先前的命令中將 *gg-container-id* 取代為 `container_id` 結果。  

```
docker exec -it gg-container-id /bin/bash
```