

支援終止通知：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 核心
<a name="secrets"></a>

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

AWS IoT Greengrass 可讓您使用 Greengrass 裝置的服務和應用程式進行身分驗證，無需硬式編碼密碼、字符或其他秘密。

AWS Secrets Manager 是一項服務，可用來在雲端中安全地存放和管理秘密。 會將 Secrets Manager AWS IoT Greengrass 延伸到 Greengrass 核心裝置，因此您的[連接器](connectors.md)和 Lambda 函數可以使用本機秘密與服務和應用程式互動。例如，Twilio 通知連接器會使用本機儲存的身分驗證字符。

若要將私密整合到 Greengrass 群組，您可以建立一個參考 Secrets Manager 私密的群組資源。此*私密資源*透過 ARN 參考雲端私密。若要了解如何建立、管理及使用秘密資源，請參閱[使用秘密資源](secrets-using.md)。

AWS IoT Greengrass 會在傳輸中和靜態時加密您的秘密。在群組部署期間， 從 Secrets Manager AWS IoT Greengrass 擷取秘密，並在 Greengrass 核心上建立本機的加密複本。在 Secrets Manager 中輪換雲端秘密之後，請重新部署 群組，將更新的值傳播到核心。

下圖顯示將私密部署至核心的高階程序。私密是在傳輸和靜態時加密。

![\[AWS IoT Greengrass 從 擷取秘密， AWS Secrets Manager 並將其部署為核心裝置的秘密資源，供連接器和 Lambda 函數使用。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/deploy-local-secret.png)


使用 AWS IoT Greengrass 在本機存放秘密可提供下列優點：
+ **從程式碼分離 (而非寫入程式碼內)。**此舉支援集中管理的登入資料，並可協助保護敏感資料免於洩露的風險。
+ **適用於離線案例。**連接器和函數可以在與網際網路中斷連線時安全地存取本機服務和軟體。
+ **控制私密的存取** 只有群組中授權的連接器和函數才能存取您的私密。 AWS IoT Greengrass 會使用私有金鑰加密來保護您的私密。私密是在傳輸和靜態時加密。如需詳細資訊，請參閱[秘密金鑰加密](#secrets-encryption)。
+ **控制輪換。**在 Secrets Manager 中輪換秘密之後，請重新部署 Greengrass 群組以更新秘密的本機複本。如需詳細資訊，請參閱[建立和管理秘密](secrets-using.md#secrets-create-manage)。
**重要**  
AWS IoT Greengrass 在輪換雲端版本之後， 不會自動更新本機秘密的值。若要更新本機的值，您必須重新部署群組。

## 秘密金鑰加密
<a name="secrets-encryption"></a>

AWS IoT Greengrass 會加密傳輸中和靜態的秘密。

**重要**  
請確定您的使用者定義的 Lambda 函數安全地處理秘密，而且不會記錄存放在秘密中的任何敏感資料。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[減輕記錄和偵錯 Lambda 函數的風險](https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html#best-practice_lamda-debug-statements)。雖然本文件特別參考輪換函數，但建議也適用於 Greengrass Lambda 函數。

**傳輸中加密**  
AWS IoT Greengrass 使用 Transport Layer Security (TLS) 來加密透過網際網路和本機網路的所有通訊。這可保護傳輸中的秘密，這發生在從 Secrets Manager 擷取秘密並部署到核心時。如需支援的 TLS 密碼套件，請參閱[TLS 密碼套件支援](gg-sec.md#gg-cipher-suites)。

**靜態加密**  
AWS IoT Greengrass 使用 中指定的私有金鑰[`config.json`](gg-core.md#config-json)來加密存放在核心上的秘密。基於這個原因，安全儲存私有金鑰對於保護本機秘密來說非常重要。在 AWS [共同責任模型](https://aws.amazon.com/compliance/shared-responsibility-model/)中，客戶有責任保證在核心裝置上安全儲存私有金鑰。  
AWS IoT Greengrass 支援兩種私有金鑰儲存模式：  
+ 使用硬體安全模組。如需詳細資訊，請參閱[硬體安全整合](hardware-security.md)。
**注意**  
目前， 在使用硬體型私有金鑰時，僅 AWS IoT Greengrass 支援用於加密和解密本機秘密的 [PKCS\$11 v1.5 ](https://tools.ietf.org/html/rfc2313)填補機制。如果您遵循廠商提供的指示手動產生硬體型私有金鑰，請務必選擇 PKCS\$11 v1.5. AWS IoT Greengrass doesn 不支援最佳非對稱加密填補 (OAEP)。
+ 使用檔案系統許可 (預設)。
私有金鑰是用來保護資料金鑰，這是用來加密本機私密。每次部署群組，就會輪換資料金鑰。  
 AWS IoT Greengrass 核心是唯一可存取私有金鑰的實體。與秘密資源關聯的 Greengrass 連接器或 Lambda 函數會從核心取得秘密的值。

## 要求
<a name="secrets-reqs"></a>

這些是本機私密支援的需求：
+ 您必須使用 AWS IoT Greengrass Core v1.7 或更新版本。
+ 若要取得本機秘密的值，使用者定義的 Lambda 函數必須使用 AWS IoT Greengrass Core SDK v1.3.0 或更新版本。
+ 您必須在 Greengrass 組態檔案中指定用於本機私密加密的私有金鑰。根據預設， AWS IoT Greengrass 會使用存放在檔案系統中的核心私有金鑰。若要提供自己的私有金鑰，請參閱[指定用於秘密加密的私有金鑰](#secrets-config-private-key)。僅支援 RSA 金鑰類型。
**注意**  
目前， 在使用硬體型私有金鑰時，僅 AWS IoT Greengrass 支援用於加密和解密本機秘密的 [PKCS\$11 v1.5 ](https://tools.ietf.org/html/rfc2313)填補機制。如果您遵循廠商提供的指示手動產生硬體型私有金鑰，請務必選擇 PKCS\$11 v1.5. AWS IoT Greengrass doesn 不支援最佳非對稱加密填補 (OAEP)。
+ AWS IoT Greengrass 必須獲得許可才能取得您的秘密值。這可讓 AWS IoT Greengrass 在群組部署期間擷取值。如果您使用的是預設 Greengrass 服務角色，則 AWS IoT Greengrass 已經可以存取名稱開頭為 *greengrass-* 的秘密。若要自訂存取，請參閱[允許 AWS IoT Greengrass 取得秘密值](#secrets-config-service-role)。
**注意**  
即使您自訂許可，仍建議您使用此命名慣例來識別 AWS IoT Greengrass 允許存取的秘密。主控台會使用不同的許可來讀取您的秘密，因此您可以在主控台中選取 AWS IoT Greengrass 沒有擷取許可的秘密。使用命名慣例可協助避免許可衝突，而此衝突會造成部署錯誤。

## 指定用於秘密加密的私有金鑰
<a name="secrets-config-private-key"></a>

在此程序中，您會提供用於本機密碼加密的私有金鑰路徑。這必須是具有的最小長度為 2048 位元的 RSA 金鑰。如需 AWS IoT Greengrass 核心上使用之私有金鑰的詳細資訊，請參閱 [AWS IoT Greengrass 核心安全主體](gg-sec.md#gg-principals)。

AWS IoT Greengrass 支援兩種私有金鑰儲存模式：硬體型或檔案系統型 （預設）。如需詳細資訊，請參閱[秘密金鑰加密](#secrets-encryption)。

**只在您想要變更預設組態時，才遵循此程序**，此舉會使用檔案系統中的核心私密金鑰。撰寫這些步驟時假設您已建立群組和核心，如入門教學課程的[單元 2](module2.md) 中所述。

1. 開啟位於 `/greengrass-root/config` 目錄的 [`config.json`](gg-core.md#config-json) 檔案。
**注意**  
*greengrass-root* 代表 Core AWS IoT Greengrass 軟體安裝在您裝置上的路徑。通常，這是 `/greengrass` 目錄。

1. 在 `crypto.principals.SecretsManager` 物件中，對於 `privateKeyPath` 屬性，輸入私有金鑰的路徑：
   + 如果您的私密金鑰儲存在檔案系統，請指定 金鑰的絕對路徑。例如：

     ```
     "SecretsManager" : {
       "privateKeyPath" : "file:///somepath/hash.private.key"
     }
     ```
   + 如果您的私有金鑰存放在硬體安全模組 (HSM) 中，請指定使用 [RFC 7512 PKCS\$111](https://tools.ietf.org/html/rfc7512) URI 配置的路徑。例如：

     ```
     "SecretsManager" : {
       "privateKeyPath" : "pkcs11:object=private-key-label;type=private"
     }
     ```

     如需詳細資訊，請參閱[AWS IoT Greengrass 核心的硬體安全組態](hardware-security.md#configure-hardware-security)。
**注意**  
目前， 在使用硬體型私有金鑰時，僅 AWS IoT Greengrass 支援用於加密和解密本機秘密的 [PKCS\$11 v1.5 ](https://tools.ietf.org/html/rfc2313)填補機制。如果您遵循廠商提供的指示手動產生硬體型私有金鑰，請務必選擇 PKCS\$11 v1.5. AWS IoT Greengrass doesn 不支援最佳非對稱加密填補 (OAEP)。

## 允許 AWS IoT Greengrass 取得秘密值
<a name="secrets-config-service-role"></a>

在此程序中，您會將內嵌政策新增至允許 AWS IoT Greengrass 取得秘密值的 Greengrass 服務角色。

**只有在您想要將自訂許可授予秘密，或您的 Greengrass 服務角色不包含 受管政策時，才遵循此程序**。 `AWSGreengrassResourceAccessRolePolicy`會授予名稱開頭為 *greengrass-* 的秘密存取權。 AWS IoT Greengrass `AWSGreengrassResourceAccessRolePolicy`

1. 請執行下列 CLI 命令來取得 Greengrass 服務角色的 ARN：

   ```
   aws greengrass get-service-role-for-account --region region
   ```

   傳回的 ARN 包含角色名稱。

   ```
   {
     "AssociatedAt": "time-stamp",
     "RoleArn": "arn:aws:iam::account-id:role/service-role/role-name"
   }
   ```

   您會在下列步驟中使用 ARN 或名稱。

1. 新增允許 `secretsmanager:GetSecretValue` 動作的內嵌政策。如需說明，請參閱《[IAM 使用者指南》中的新增和移除 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。 **

   您可以明確地列出私密或使用萬用字元 `*` 命名機制，來授予精細的存取，或者您可以授予有條件存取版本控制或已標記私密的權限。例如，下列政策允許 只 AWS IoT Greengrass 讀取指定的秘密。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": [
               "arn:aws:secretsmanager:us-east-1:123456789012:secret:greengrass-SecretA-abc",
       "arn:aws:secretsmanager:us-east-1:123456789012:secret:greengrass-SecretB-xyz"
               ]
           }
       ]
   }
   ```

------
**注意**  
如果您使用客戶受管 AWS KMS 金鑰來加密秘密，您的 Greengrass 服務角色也必須允許 `kms:Decrypt`動作。

如需有關 Secrets Manager 的 IAM 政策的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》[中的您可以在 IAM 政策或 的秘密政策中使用的 和動作、資源和內容金鑰 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html)的[身分驗證和存取控制 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html)。

## 另請參閱
<a name="secrets-seealso"></a>
+ *AWS Secrets Manager 《 使用者指南*》中的[什麼是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 
+ [PKCS \$11: RSA Encryption Version 1.5](https://tools.ietf.org/html/rfc2313)

# 使用秘密資源
<a name="secrets-using"></a>

AWS IoT Greengrass 使用*秘密資源*將來自 的秘密整合 AWS Secrets Manager 到 Greengrass 群組。秘密資源是 Secrets Manager 秘密的參考。如需詳細資訊，請參閱[將秘密部署到 AWS IoT Greengrass 核心](secrets.md)。

在 AWS IoT Greengrass 核心裝置上，連接器和 Lambda 函數可以使用秘密資源來驗證 服務和應用程式，而無需硬式編碼密碼、字符或其他登入資料。

## 建立和管理秘密
<a name="secrets-create-manage"></a>

在 Greengrass 群組中，秘密資源會參考 Secrets Manager 秘密的 ARN。當秘密資源部署到核心時，秘密的值會加密，並提供給附屬連接器和 Lambda 函數。如需詳細資訊，請參閱[秘密金鑰加密](secrets.md#secrets-encryption)。

您可以使用 Secrets Manager 來建立和管理秘密的雲端版本。您可以使用 AWS IoT Greengrass 來建立、管理和部署秘密資源。

**重要**  
建議您遵循在 Secrets Manager 中輪換秘密的最佳實務。然後，部署 Greengrass 群組以更新您私密的本機副本。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[輪換您的 AWS Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

**讓秘密可在 Greengrass 核心上使用**

1. 在 Secrets Manager 中建立秘密。這是您秘密的雲端版本，會在 Secrets Manager 中集中儲存和管理。管理任務包括輪換私密值和套用資源政策。

1. 在 中建立秘密資源 AWS IoT Greengrass。這是依 ARN 參考雲端私密之群組資源的類型。每個群組您只能參考私密一次。

1. 設定您的連接器或 Lambda 函數。您必須指定對應參數或屬性，將資源與連接器或函數建立隸屬關係。這可讓它們取得本機部署之私密資源的值。如需詳細資訊，請參閱[在連接器和 Lambda 函數中使用本機秘密](#secrets-access)。

1. 部署 Greengrass 群組。在部署期間， AWS IoT Greengrass 會擷取雲端私密的值，並在核心上建立 (或更新) 本機私密。

每次擷取秘密值時， AWS IoT Greengrass Secrets Manager AWS CloudTrail 都會記錄事件。 AWS IoT Greengrass 不會記錄與部署或使用本機秘密相關的任何事件。如需 Secrets Manager 記錄的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[監控 AWS Secrets Manager 秘密的使用](https://docs.aws.amazon.com/secretsmanager/latest/userguide/monitoring.html)。

### 包括私密資源中的預備標籤
<a name="secret-resources-labels"></a>

Secrets Manager 使用預備標籤來識別秘密值的特定版本。預備標籤可以是系統定義或使用者定義。Secrets Manager 會將`AWSCURRENT`標籤指派給秘密值的最新版本。預備標籤通常用來管理私密輪換。如需 Secrets Manager 版本控制的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的 [ 的主要術語和概念 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html)。

秘密資源一律包含`AWSCURRENT`預備標籤，如果 Lambda 函數或連接器需要預備標籤，則可以選擇性地包含其他預備標籤。在群組部署期間， 會 AWS IoT Greengrass 擷取群組中參考的預備標籤值，然後在核心上建立或更新對應的值。

### 建立和管理私密資源 (主控台)
<a name="create-manage-secret-resource-console"></a>

#### 建立私密資源 (主控台)
<a name="create-manage-secret-resource-console-create"></a>

在 AWS IoT Greengrass 主控台中，您可以從群組資源頁面上的秘密索引標籤建立和管理**秘密****資源**。如需建立私密資源，並將其新增到群組的詳細資訊，請參閱[如何建立秘密資源 (主控台)](secrets-console.md)和[Greengrass 連接器入門 (主控台)](connectors-console.md)。

![\[Resources (資源) 頁面上 Secret (私密) 索引標籤上的私密資源。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/connectors/secret-resource-twilio-auth-token.png)


**注意**  
或者，主控台可讓您在設定連接器或 Lambda 函數時建立秘密和秘密資源。您可以從連接器**的設定參數**頁面或 Lambda 函數**的資源**頁面執行此操作。

#### 管理私密資源 (主控台)
<a name="create-manage-secret-resource-console-manage"></a>

Greengrass 群組中秘密資源的管理任務包括將秘密資源新增至群組、從群組中移除秘密資源，以及變更秘密資源中包含的[預備標籤](#secret-resources-labels)集。

如果您指向與 Secrets Manager 不同的秘密，您還必須編輯任何使用秘密的連接器：

1. 在群組組態頁面上，選擇 **Connectors (連接器)**。

1. 從連接器的內容功能表中，選擇 **Edit (編輯)**。

1. **Edit parameters (編輯參數)** 頁面會顯示一則訊息，通知您私密 ARN 已變更。若要確認變更，請選擇 **Save (儲存)**。

如果您在 Secrets Manager 中刪除秘密，請從群組以及參考秘密的連接器和 Lambda 函數中移除對應的秘密資源。否則，在群組部署期間， 會 AWS IoT Greengrass 傳回找不到秘密的錯誤。視需要更新您的 Lambda 函數程式碼。

### 建立和管理私密資源 (CLI)
<a name="create-manage-secret-resource-cli"></a>

#### 建立私密資源 (CLI)
<a name="create-manage-secret-resource-cli-create"></a>

在 AWS IoT Greengrass API 中，秘密是一種群組資源。下列範例會建立一個資源定義，其初始版本包含名為 `MySecretResource` 的私密資源。如需建立私密資源，並將其新增到群組版本的教學課程，請參閱[Greengrass 連接器入門 (CLI)](connectors-cli.md)。

秘密資源參考對應 Secrets Manager 秘密的 ARN，除了 之外，還包含兩個臨時標籤`AWSCURRENT`，一律包含此標籤。

```
aws greengrass create-resource-definition --name MyGreengrassResources --initial-version '{
    "Resources": [
        {
            "Id": "my-resource-id",
            "Name": "MySecretResource",
            "ResourceDataContainer": {
                "SecretsManagerSecretResourceData": {
                    "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-SomeSecret-KUj89s",
                    "AdditionalStagingLabelsToDownload": [
                        "Label1",
                        "Label2"
                    ]
                }
            }
        }
    ]
}'
```

#### 管理私密資源 (CLI)
<a name="create-manage-secret-resource-cli-manage"></a>

Greengrass 群組中秘密資源的管理任務包括將秘密資源新增至群組、從群組中移除秘密資源，以及變更秘密資源中包含的[預備標籤](#secret-resources-labels)集。

在 AWS IoT Greengrass API 中，這些變更是使用 版本來實作。

 AWS IoT Greengrass API 使用版本來管理群組。版本不可變，因此若要新增或變更群組元件，例如群組的用戶端裝置、函數和資源，您必須建立新的或更新的元件版本。然後，您可以建立和部署包含每個元件目標版本的群組版本。若要進一步了解 群組，請參閱 [AWS IoT Greengrass 群組](what-is-gg.md#gg-group)。

例如，若要變更私密資源的一組預備標籤，請：

1. 建立一個資源定義版本，其中包含更新的私密資源。下列範例會將第三個預備標籤新增到來自前一節的私密資源。
**注意**  
若要將更多資源新增到版本，請在 `Resources` 陣列中包括它們。

   ```
   aws greengrass create-resource-definition --name MyGreengrassResources --initial-version '{
       "Resources": [
           {
               "Id": "my-resource-id",
               "Name": "MySecretResource",
               "ResourceDataContainer": {
                   "SecretsManagerSecretResourceData": {
                       "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-SomeSecret-KUj89s",
                       "AdditionalStagingLabelsToDownload": [
                           "Label1",
                           "Label2",
                           "Label3"
                       ]
                   }
               }
           }
       ]
   }'
   ```

1. 如果私密資源的 ID 已變更，請更新使用私密資源的連接器和函數。在新的版本中，更新對應到資源 ID 的參數或屬性。如果私密的 ARN 已變更，您也須針對任何使用私密的連接器更新對應參數。
**注意**  
資源 ID 是客戶提供的任意識別符。

1. 建立一個群組版本，其中包含您要傳送到核心之每個元件的目標版本。

1. 部署群組版本。

如需顯示如何建立和部署私密資源、連接器以及函數的教學課程，請參閱 [Greengrass 連接器入門 (CLI)](connectors-cli.md)。

如果您在 Secrets Manager 中刪除秘密，請從群組以及參考秘密的連接器和 Lambda 函數中移除對應的秘密資源。否則，在群組部署期間， 會 AWS IoT Greengrass 傳回找不到秘密的錯誤。視需要更新您的 Lambda 函數程式碼。您可以部署不包含對應秘密資源的資源定義版本，以移除本機秘密。

## 在連接器和 Lambda 函數中使用本機秘密
<a name="secrets-access"></a>

Greengrass 連接器和 Lambda 函數使用本機秘密與服務和應用程式互動。根據預設，會使用 `AWSCURRENT` 值，但也可以使用秘密資源中所含其他[預備標籤](#secret-resources-labels)的值。

您必須先設定連接器和函數，然後它們才能存取本機私密。這會將私密資源與連接器或函數建立隸屬關係。

**連接器**  
如果連接器需要存取本機私密，則它會提供您使用其存取私密所需之資訊設定的參數。  
+ 若要了解如何在 AWS IoT Greengrass 主控台中執行此操作，請參閱 [Greengrass 連接器入門 (主控台)](connectors-console.md)。
+ 若要了解如何使用 CLI AWS IoT Greengrass 執行此操作，請參閱 [Greengrass 連接器入門 (CLI)](connectors-cli.md)。
如需個別連接器要求的相關資訊，請參閱 [AWS提供的 Greengrass 連接器](connectors-list.md)。  
連接器內建存取和使用私密的邏輯。

**Lambda 函數**  
若要允許 Greengrass Lambda 函數存取本機秘密，您可以設定函數的屬性。  
+ 若要了解如何在 AWS IoT Greengrass 主控台中執行此操作，請參閱 [如何建立秘密資源 (主控台)](secrets-console.md)。
+ 若要在 AWS IoT Greengrass API 中執行此操作，請在 `ResourceAccessPolicies` 屬性中提供下列資訊。
  + `ResourceId`：Greengrass 群組中私密資源的 ID。這是參考對應 Secrets Manager 秘密 ARN 的資源。
  + `Permission`：函數對資源擁有的存取類型。私密資源僅支援 `ro` (唯讀) 許可。

  下列範例會建立可存取`MyApiKey`秘密資源的 Lambda 函數。

  ```
  aws greengrass create-function-definition --name MyGreengrassFunctions --initial-version '{
      "Functions": [
          {
              "Id": "MyLambdaFunction",
              "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1",
              "FunctionConfiguration": {
                  "Pinned": false,
                  "MemorySize": 16384,
                  "Timeout": 10,
                  "Environment": {
                      "ResourceAccessPolicies": [
                          {
                              "ResourceId": "MyApiKey",
                              "Permission": "ro"
                          }                          
                      ],
                      "AccessSysfs": true
                  }
              }
          }
      ]
  }'
  ```

   

  若要在執行時間存取本機秘密，Greengrass Lambda 函數會從 AWS IoT Greengrass 核心 SDK (1.3.0 版或更新版本） 中的`secretsmanager`用戶端呼叫 `get_secret_value`函數。

  下列範例示範如何使用適用於 Python 的 AWS IoT Greengrass 核心 SDK 來取得秘密。它會將秘密的名稱傳遞給 `get_secret_value`函數。 `SecretId` 可以是 Secrets Manager 秘密的名稱或 ARN （而非秘密資源）。

  ```
  import greengrasssdk
  
  secrets_client = greengrasssdk.client("secretsmanager")
  secret_name = "greengrass-MySecret-abc"
  
  
  def function_handler(event, context):
      response = secrets_client.get_secret_value(SecretId=secret_name)
      secret = response.get("SecretString")
  ```

  對於文字類型秘密，`get_secret_value` 函數會傳回一個字串。對於二進位類型秘密，它會傳回一個 base64 編碼字串。
**重要**  
請確定您的使用者定義的 Lambda 函數安全地處理秘密，而且不會記錄存放在秘密中的任何敏感資料。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[降低記錄和偵錯 Lambda 函數的風險](https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html#best-practice_lamda-debug-statements)。雖然本文件特別參考輪換函數，但建議也適用於 Greengrass Lambda 函數。

  根據預設，會傳回秘密的目前值。這是連接了 `AWSCURRENT` 預備標籤的版本。若要存取不同的版本，請針對選用的 `VersionStage` 引數傳遞對應預備標籤的名稱。例如：

  ```
  import greengrasssdk
  
  secrets_client = greengrasssdk.client("secretsmanager")
  secret_name = "greengrass-TestSecret"
  secret_version = "MyTargetLabel"
  
  
  # Get the value of a specific secret version
  def function_handler(event, context):
      response = secrets_client.get_secret_value(
          SecretId=secret_name, VersionStage=secret_version
      )
      secret = response.get("SecretString")
  ```

  如需另一個呼叫 `get_secret_value` 的函數範例，請參閱[建立 Lambda 函數部署套件](secrets-console.md#secrets-console-create-deployment-package)。

# 如何建立秘密資源 (主控台)
<a name="secrets-console"></a>

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

本教學課程說明如何使用 AWS 管理主控台 將*秘密資源*新增至 Greengrass 群組。秘密資源是來自 秘密的參考 AWS Secrets Manager。如需詳細資訊，請參閱[將秘密部署到 AWS IoT Greengrass 核心](secrets.md)。

在 AWS IoT Greengrass 核心裝置上，連接器和 Lambda 函數可以使用秘密資源來驗證 服務和應用程式，而無需硬式編碼密碼、字符或其他登入資料。

在本教學課程中，您會從在 AWS Secrets Manager 主控台中建立秘密開始。然後，在 AWS IoT Greengrass 主控台中，您可以從群組的資源頁面將秘密**資源**新增至 Greengrass 群組。此秘密資源參考 Secrets Manager 秘密。稍後，您將秘密資源連接到 Lambda 函數，這可讓函數取得本機秘密的值。

**注意**  
或者，主控台可讓您在設定連接器或 Lambda 函數時建立秘密和秘密資源。您可以從連接器**的設定參數**頁面或 Lambda 函數**的資源**頁面執行此操作。  
只有包含私密參數的連接器才能存取私密。如需示範 Twilio Notifications 連接器如何使用本機儲存的身分驗證字符的教學課程，請參閱 [Greengrass 連接器入門 (主控台)](connectors-console.md)。

本教學課程所述以下高階執行步驟：

1. [建立 Secrets Manager 秘密](#secrets-console-create-secret)

1. [將私密資源新增至群組](#secrets-console-create-resource)

1. [建立 Lambda 函數部署套件](#secrets-console-create-deployment-package)

1. [建立 Lambda 函式](#secrets-console-create-function)

1. [新增 函數至群組](#secrets-console-create-gg-function)

1. [將秘密資源連接到函數](#secrets-console-affiliate-gg-function)

1. [新增訂閱到群組](#secrets-console-create-subscription)

1. [部署群組](#secrets-console-create-deployment)

1. [測試 Lambda 函數](#secrets-console-test-solution)

此教學課程需約 20 分鐘完成。

## 先決條件
<a name="secrets-console-prerequisites"></a>

為完成此教學課程您需要：
+ Greengrass 群組和 Greengrass 核心 (1.7 版或更新版本）。若要了解如何建立 Greengrass 群組或核心，請參閱 [入門 AWS IoT Greengrass](gg-gs.md)。入門教學課程也包含安裝 AWS IoT Greengrass 核心軟體的步驟。
+ AWS IoT Greengrass 必須設定為支援本機秘密。如需詳細資訊，請參閱[秘密要求](secrets.md#secrets-reqs)。
**注意**  
此要求包括允許存取您的 Secrets Manager 秘密。如果您使用預設 Greengrass 服務角色，Greengrass 有權取得名稱開頭為 *greengrass-* 的秘密值。
+ 若要取得本機秘密的值，使用者定義的 Lambda 函數必須使用 AWS IoT Greengrass Core SDK v1.3.0 或更新版本。

## 步驟 1：建立 Secrets Manager 秘密
<a name="secrets-console-create-secret"></a>

在此步驟中，您會使用 AWS Secrets Manager 主控台來建立秘密。

1. <a name="create-secret-step-signin"></a>登入 [AWS Secrets Manager 主控台](https://console.aws.amazon.com/secretsmanager/)。
**注意**  
如需此程序的詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[步驟 1：建立和存放您的秘密 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/tutorials_basic.html)。

1. <a name="create-secret-step-create"></a>選擇**儲存新機密**。

1. <a name="create-secret-step-othertype"></a>在**選擇秘密類型**下，選擇**其他類型的秘密**。

1. 在 **Specify the key/value pairs to be stored for this secret (指定此秘密要儲存的金鑰/數值組)** 下：
   + 在 **Key** (索引鍵) 欄位，輸入 **test**。
   + 針對**數值**，輸入 **abcdefghi**。

1. <a name="create-secret-step-encryption"></a>保持選取加密金鑰的 **aws/secretsmanager**，然後選擇**下一步**。
**注意**  
 AWS KMS 如果您使用 Secrets Manager 在帳戶中建立的預設 AWS 受管金鑰，則 不會向您收費。

1. 針對 **Secret name (私密名稱)**，輸入 **greengrass-TestSecret**，然後選擇 **Next (下一步)**。
**注意**  
根據預設，Greengrass 服務角色允許 AWS IoT Greengrass 取得名稱開頭為 *greengrass-* 的秘密值。如需詳細資訊，請參閱[私密需求](secrets.md#secrets-reqs)。

1. <a name="create-secret-step-rotation"></a>本教學課程不需要輪換，因此請選擇停用自動輪換，然後選擇**下一步**。

1. <a name="create-secret-step-review"></a>在 **Review (檢閱)** 頁面上，檢閱設定，然後選擇 **Store (儲存)**。

   接著，您可以在 Greengrass 群組中建立一個參考私密的私密資源。

## 步驟 2：將私密資源新增至 Greengrass 群組
<a name="secrets-console-create-resource"></a>

在此步驟中，您會設定參考 Secrets Manager 秘密的群組資源。

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

1. <a name="create-secret-resource-step-choosegroup"></a>選擇您要將私密資源新增至其中的群組。

1. <a name="create-secret-resource-step-secretstab"></a>在群組組態頁面上，選擇**資源**索引標籤，然後向下捲動至**秘密**區段。**秘密**區段會顯示屬於 群組的秘密資源。您可以從本節新增、編輯和移除秘密資源。
**注意**  
或者，主控台可讓您在設定連接器或 Lambda 函數時建立秘密和秘密資源。您可以從連接器**的設定參數**頁面或 Lambda 函數**的資源**頁面執行此操作。

1. <a name="create-secret-resource-step-addsecretresource"></a>在**秘密**區段下選擇**新增**。

1. 在**新增秘密資源**頁面上，**MyTestSecret**輸入**資源名稱**。

1. 在**秘密**下，選擇 **greengrass-TestSecret**。

1. <a name="create-secret-resource-step-selectlabels"></a>在**選取標籤 （選用）** 區段中，AWSCURRENT 預備標籤代表秘密的最新版本。此標籤一律包含在私密資源中。
**注意**  
本教學課程僅需要 AWSCURRENT 標籤。您可以選擇性地包含 Lambda 函數或連接器所需的標籤。

1. 選擇 **Add resource (新增資源)**。

## 步驟 3：建立 Lambda 函數部署套件
<a name="secrets-console-create-deployment-package"></a>

若要建立 Lambda 函數，您必須先建立包含函數程式碼和相依性的 Lambda 函數*部署套件*。Greengrass Lambda 函數需要 [AWS IoT Greengrass 核心 SDK](lambda-functions.md#lambda-sdks-core) 來處理任務，例如與核心環境中的 MQTT 訊息通訊，以及存取本機秘密。本教學課程會建立 Python 函數，因此您可以在部署套件中使用 SDK 的 Python 版本。

**注意**  
若要取得本機秘密的值，使用者定義的 Lambda 函數必須使用 AWS IoT Greengrass Core SDK v1.3.0 或更新版本。

1. <a name="download-ggc-sdk"></a> 從[AWS IoT Greengrass 核心開發套件](what-is-gg.md#gg-core-sdk-download)下載頁面，將適用於 Python AWS IoT Greengrass 的核心開發套件下載至您的電腦。

1. <a name="unzip-ggc-sdk"></a>解壓縮下載的封裝，以取得軟體開發套件。SDK 為 `greengrasssdk` 資料夾。

1. 將以下 Python 程式碼函數儲存在名為 `secret_test.py` 的本機檔案中。

   ```
   import greengrasssdk
   
   secrets_client = greengrasssdk.client("secretsmanager")
   iot_client = greengrasssdk.client("iot-data")
   secret_name = "greengrass-TestSecret"
   send_topic = "secrets/output"
   
   
   def function_handler(event, context):
       """
       Gets a secret and publishes a message to indicate whether the secret was
       successfully retrieved.
       """
       response = secrets_client.get_secret_value(SecretId=secret_name)
       secret_value = response.get("SecretString")
       message = (
           f"Failed to retrieve secret {secret_name}."
           if secret_value is None
           else f"Successfully retrieved secret {secret_name}."
       )
       iot_client.publish(topic=send_topic, payload=message)
       print("Published: " + message)
   ```

   `get_secret_value` 函數支援 `SecretId`值的 Secrets Manager 秘密名稱或 ARN。此範例使用私密名稱。在此範例秘密中， AWS IoT Greengrass 會傳回鍵/值對：`{"test":"abcdefghi"}`。
**重要**  
請確定您的使用者定義的 Lambda 函數安全地處理秘密，而且不會記錄存放在秘密中的任何敏感資料。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的[降低記錄和偵錯 Lambda 函數的風險](https://docs.aws.amazon.com/secretsmanager/latest/userguide/best-practices.html#best-practice_lamda-debug-statements)。雖然本文件特別參考輪換函數，但建議也適用於 Greengrass Lambda 函數。

1. 將下列項目壓縮成名為 `secret_test_python.zip` 的檔案。當您建立 ZIP 檔案時，只包含程式碼及其依存項目，而不包含資料夾。
   + **secret\$1test.py**。應用程式邏輯。
   + **greengrasssdk**。所有 Python Greengrass Lambda 函數所需的程式庫。

   這是您的 Lambda 函數部署套件。

## 步驟 4：建立 Lambda 函數
<a name="secrets-console-create-function"></a>

在此步驟中，您會使用 AWS Lambda 主控台來建立 Lambda 函數，並將其設定為使用您的部署套件。然後，您會發佈函數版本和建立別名。

1. 首先，建立 Lambda 函數。

   1. <a name="lambda-console-open"></a>在 中 AWS 管理主控台，選擇**服務**，然後開啟 AWS Lambda 主控台。

   1. <a name="lambda-console-create-function"></a>選擇**建立函數**，然後選擇**從頭開始撰寫**。

   1. 在 **Basic information (基本資訊)** 區段中，使用下列值：
      + 針對**函數名稱**，請輸入 **SecretTest**。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於**許可**，請保留預設設定。這會建立授予基本 Lambda 許可的執行角色。不會使用此角色 AWS IoT Greengrass。

   1. <a name="lambda-console-save-function"></a>請在頁面底部，選擇**建立函式**。

1. 接著，註冊處理常式並上傳您的 Lambda 函數部署套件。

   1. <a name="lambda-console-upload"></a>在**程式碼**索引標籤的**程式碼來源**下，選擇**上傳來源**。從下拉式清單中，選擇 **.zip 檔案**。  
![\[從下拉式清單上傳，並反白顯示 .zip 檔案。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 選擇**上傳**，然後選擇您的`secret_test_python.zip`部署套件。然後選擇 **Save (儲存)**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函數的**程式碼**索引標籤的**執行時間設定**下，選擇**編輯**，然後輸入下列值。
      + 針對**執行期**，選擇 **Python 3.7**。
      + 對於 **Handler (處理常式)**，輸入 **secret\$1test.function\$1handler**。

   1. <a name="lambda-console-save-config"></a>選擇**儲存**。
**注意**  
 AWS Lambda 主控台上的**測試**按鈕不適用於此函數。 AWS IoT Greengrass 核心 SDK 不包含在 AWS Lambda 主控台中獨立執行 Greengrass Lambda 函數所需的模組。這些模組 （例如 `greengrass_common`) 會在部署到您的 Greengrass 核心之後提供給函數。

1. 現在，發佈 Lambda 函數的第一個版本，並為[該版本建立別名](https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html)。
**注意**  
Greengrass 群組可以依別名 （建議） 或版本參考 Lambda 函數。使用別名可讓您更輕鬆地管理程式碼更新，因為您不必在更新函數程式碼時變更訂閱資料表或群組定義。反之，您只需將別名指向新的函數版本。

   1. <a name="shared-publish-function-version"></a>請從**操作**功能表中選擇**發行新版本**。

   1. <a name="shared-publish-function-version-description"></a>針對 **Version description (版本描述)**，輸入 **First version**，然後選擇 **Publish (發佈)**。

   1. 在 **SecretTest: 1** 組態頁面上，從 **Actions (動作)** 功能表中選擇 **Create alias (建立別名)**。

   1. 在**建立警示**頁面上使用下列值：
      + 對於**名稱**，輸入 **GG\$1SecretTest**。
      + 對於**版本**，選擇 **1**。
**注意**  
AWS IoT Greengrass 不支援 **\$1LATEST** 版本的 Lambda 別名。

   1. 選擇**建立**。

現在您已準備好將 Lambda 函數新增至 Greengrass 群組，並連接秘密資源。

## 步驟 5：將 Lambda 函數新增至 Greengrass 群組
<a name="secrets-console-create-gg-function"></a>

在此步驟中，您將 Lambda 函數新增至 AWS IoT 主控台中的 Greengrass 群組。

1. <a name="choose-add-lambda"></a>在群組組態頁面上，選擇 **Lambda 函數**索引標籤。

1. 在**我的 Lambda 函數**區段下，選擇**新增**。

1. 針對 **Lambda 函數**，選擇 **SecretTest**。

1. 針對 **Lambda 函數版本**，選擇您發佈的版本別名。

接著，設定 Lambda 函數的生命週期。

1. 在 **Lambda 函數組態**區段中，進行下列更新。
**注意**  
 建議您在沒有容器化的情況下執行 Lambda 函數，除非您的業務案例需要。這有助於啟用裝置 GPU 和攝影機的存取，而無需設定裝置資源。如果您在沒有容器化的情況下執行 ，您還必須授予 AWS IoT Greengrass Lambda 函數的根存取權。

   1. **若要在沒有容器化的情況下執行 ：**
      + 針對**系統使用者和群組**，選擇 **Another user ID/group ID**。針對**系統使用者 ID**，輸入 **0**。針對**系統群組 ID**，輸入 **0**。

        這可讓您的 Lambda 函數以根執行。如需以根身分執行的詳細資訊，請參閱 [為群組中的 Lambda 函數設定預設存取身分](lambda-group-config.md#lambda-access-identity-groupsettings)。
**提示**  
您也必須更新 `config.json` 檔案，以授予 Lambda 函數的根存取權。如需此程序，請參閱 [執行 Lambda 函數做為根](lambda-group-config.md#lambda-running-as-root)。
      + 針對 **Lambda 函數容器化**，選擇**無容器**。

        如需在沒有容器化的情況下執行 的詳細資訊，請參閱 [選擇 Lambda 函數容器化時的考量事項](lambda-group-config.md#lambda-containerization-considerations)。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

   1.  **改為在容器化模式下執行：**
**注意**  
除非您的商業案例需要，否則我們不建議在容器化模式下執行。
      + 針對**系統使用者和群組**，選擇**使用群組預設值**。
      + 針對 **Lambda 函數容器化**，選擇**使用群組預設值**。
      + 針對 **Memory limit (記憶體限制)**，輸入 **1024 MB**。
      + 針對 **Timeout (逾時)**，輸入 **10 seconds**。
      + 針對**固定**，選擇 **True**。

        如需詳細資訊，請參閱[Greengrass Lambda 函數的生命週期組態](lambda-functions.md#lambda-lifecycle)。
      + 在**其他參數**下，針對 **/sys 目錄的讀取存取權**，選擇**已啟用**。

1.  選擇**新增 Lambda 函數**。

接著，將秘密資源與 函數建立關聯。

## 步驟 6：將秘密資源連接至 Lambda 函數
<a name="secrets-console-affiliate-gg-function"></a>

在此步驟中，您將秘密資源與 Greengrass 群組中的 Lambda 函數建立關聯。這會將資源與 函數建立關聯，讓函數取得本機秘密的值。

1. 在群組組態頁面上，選擇 **Lambda 函數**索引標籤。

1. 選擇 **SecretTest** 函數。

1. 在函數的詳細資訊頁面上，選擇**資源**。

1. 捲動至**秘密**區段，然後選擇**關聯**。

1. 選擇 **MyTestSecret**，然後選擇**關聯**。

## 步驟 7：將訂閱新增到 Greengrass 群組
<a name="secrets-console-create-subscription"></a>

在此步驟中，您可以新增允許 AWS IoT 和 Lambda 函數交換訊息的訂閱。一個訂閱允許 AWS IoT 叫用函數，一個則允許函數將輸出資料傳送到其中 AWS IoT。

1. <a name="shared-subscriptions-addsubscription"></a>在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增訂閱**。

1. 建立允許 AWS IoT 將訊息發佈至 函數的訂閱。

   在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增訂閱**。

1. 在**建立訂閱**頁面上，設定來源和目標，如下所示：

   1. 在**來源類型**中，選擇 **Lambda 函數**，然後選擇 **IoT Cloud**。

   1. 在**目標類型**中，選擇**服務**，然後選擇 **SecretTest**。

   1. 在**主題篩選條件**中，輸入 **secrets/input**，然後選擇**建立訂閱**。

1. 新增第二個訂閱。選擇**訂閱**索引標籤，選擇**新增訂閱**，並設定來源和目標，如下所示：

   1. 在**來源類型**中，選擇**服務**，然後選擇 **SecretTest**。

   1. 在**目標類型**中，選擇 **Lambda 函數**，然後選擇 **IoT Cloud**。

   1. 在**主題篩選條件**中，輸入 **secrets/output**，然後選擇**建立訂閱**。

## 步驟 8：部署 Greengrass 群組
<a name="secrets-console-create-deployment"></a>

將群組部署到核心裝置。在部署期間， 會從 Secrets Manager AWS IoT Greengrass 擷取秘密的值，並在核心上建立本機的加密複本。

1. <a name="shared-deploy-group-checkggc"></a>確定 AWS IoT Greengrass 核心正在執行。如果需要，請在您的 Raspberry Pi 終端機執行以下命令。

   1. 檢查精靈是否有在運作：

      ```
      ps aux | grep -E 'greengrass.*daemon'
      ```

      若輸出的 `root` 含有 `/greengrass/ggc/packages/ggc-version/bin/daemon` 項目，則精靈有在運作。
**注意**  
路徑中的版本取決於核心裝置上安裝的核心 AWS IoT Greengrass 軟體版本。

   1. 若要啟動協助程式：

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

1. <a name="shared-deploy-group-deploy"></a>在群組組態頁面上，選擇**部署**。

1. <a name="shared-deploy-group-ipconfig"></a>

   1. 在 **Lambda 函數**索引標籤**的系統 Lambda 函數**區段下，選取 **IP 偵測器**，然後選擇**編輯**。

   1. 在**編輯 IP 偵測器設定**對話方塊中，選取**自動偵測和覆寫 MQTT 代理程式端點**。

   1. 選擇**儲存**。

      這可讓裝置自動取得核心的連接資訊，例如 IP 位址、DNS、連接埠編號。建議自動偵測，但 AWS IoT Greengrass 也支援手動指定的端點。只會在第一次部署群組時收到復原方法的提示。
**注意**  
如果出現提示，請授予許可來建立 [Greengrass 服務角色](service-role.md)，並將其與目前 AWS 帳戶 中的 建立關聯 AWS 區域。此角色允許 AWS IoT Greengrass 存取 AWS 服務中的資源。

      此**部署**頁面會顯示部署時間戳記、版本 ID 和狀態。完成後，部署顯示的狀態應為**已完成**。

      如需故障診斷協助，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

## 測試 Lambda 函數
<a name="secrets-console-test-solution"></a>

1. <a name="choose-test-page"></a>在 AWS IoT 主控台首頁上，選擇**測試**。

1. 對於**訂閱主題**，請使用下列值，然後選擇**訂閱**。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/secrets-console.html)

1. 針對**發佈至主題**，請使用下列值，然後選擇**發佈**以叫用函數。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/secrets-console.html)

   如果成功，函數會發佈「Success (成功)」訊息。

## 另請參閱
<a name="secrets-console-see-also"></a>
+ [將秘密部署到 AWS IoT Greengrass 核心](secrets.md)