

支援終止通知：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)。

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

# 使用秘密資源
<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)。