

终止支持通知：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 酷睿 v1.7 及更高版本。

AWS IoT Greengrass 允许您使用 Greengrass 设备上的服务和应用程序进行身份验证，而无需对密码、令牌或其他机密进行硬编码。

AWS Secrets Manager 是一项可用于在云端安全存储和管理密钥的服务。 AWS IoT Greengrass 将 Secrets Manager 扩展到 Greengrass 核心设备，因此您的[连接器](connectors.md)和 Lambda 函数可以使用本地密钥与服务和应用程序进行交互。例如，Twilio Notifications 使用本地存储的身份验证令牌。

要将密钥集成到 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_cn/greengrass/v1/developerguide/images/deploy-local-secret.png)


使用 AWS IoT Greengrass 在本地存储您的密钥具有以下优点：
+ **通过代码解耦（而非硬编码）。**这支持集中管理的凭证，并帮助保护敏感数据免受入侵的风险。
+ **适用于离线场景。**连接器和函数可以在 Internet 连接断开的情况下安全访问本地服务和软件。
+ **受控密钥访问。**只有组中经过授权的连接器和函数才可以访问您的密钥。 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 使用传输层安全 (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 不支持最佳非对称加密填充 (OAEP)。
+ 使用文件系统权限（默认）。
私有密钥用于保护数据密钥，数据密钥用于加密本地密钥。数据密钥随每次组部署进行轮换。  
 AWS IoT Greengrass 核心是唯一有权访问私钥的实体。与密钥资源关联的 Greengrass 连接器或 Lambda 函数从核心获取密钥值。

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

以下是本地密钥支持的要求：
+ 你必须使用 AWS IoT Greengrass 酷睿 v1.7 或更高版本。
+ 要获取本地密钥的值，用户定义的 Lambda 函数必须使用 C AWS IoT Greengrass ore SDK 1.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 不支持最佳非对称加密填充 (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. 打开 [`config.json`](gg-core.md#config-json) 文件（位于 `/greengrass-root/config` 目录中）。
**注意**  
*greengrass-root*表示 C AWS IoT Greengrass ore 软件在您的设备上的安装路径。通常，这是 `/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 不支持最佳非对称加密填充 (OAEP)。

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

在此过程中，您将向 Greengrass 服务角色添加 AWS IoT Greengrass 允许获取密钥值的内联策略。

**仅当您想要授予密码的 AWS IoT Greengrass 自定义权限或您的 Greengrass 服务角色不包含托管策略时，才按照此步骤**操作。`AWSGreengrassResourceAccessRolePolicy` `AWSGreengrassResourceAccessRolePolicy`允许访问名称以 *greengr* ass-开头的机密。

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 policy](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`

有关密钥管理器的 IAM policy 的详细信息，请参阅《AWS Secrets Manager 用户指南》**中的 [AWS Secrets Manager的身份验证和访问控制](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access.html)以及[可以在 IAM policy 或密钥策略中针对 AWS Secrets Manager使用的操作、资源和上下文密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html)。

## 另请参阅
<a name="secrets-seealso"></a>
+ [什么是 AWS Secrets Manager？](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 在《*AWS Secrets Manager 用户指南》*中
+ [PKCS \$11：RSA 加密版本 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 CloudTrail 每次 AWS IoT Greengrass 检索密钥值时，Secrets Manager 都会记录一个事件。 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_cn/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)。
+ 要了解如何使用 AWS IoT Greengrass CLI 执行此操作，请参阅[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 函数在核心软件开发工具包（v1.3.0 或更高`get_secret_value`版本）中 AWS IoT Greengrass 从客户端调用`secretsmanager`该函数。

  以下示例展示了如何使用适用于 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 酷睿 v1.7 及更高版本。

本教程介绍如何使用向 Gre AWS 管理控制台 engrass 群组添加*秘密资源*。密钥资源是对来自的密钥的引用 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 通知连接器如何使用本地存储的身份验证令牌的教程，请参阅[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 Core（v1.7 或更高版本）。要了解如何创建 Greengrass 组和核心，请参阅 [入门 AWS IoT Greengrass](gg-gs.md)。入门教程还包括安装 AWS IoT Greengrass 核心软件的步骤。
+ AWS IoT Greengrass 必须配置为支持本地密钥。有关更多信息，请参阅[密钥要求](secrets.md#secrets-reqs)。
**注意**  
此要求包括允许访问您的 Secrets Manager 密钥。如果使用的是默认 Greengrass 服务角色，则 Greengrass 有权获得名称以 *greengrass-* 开头的密钥的值。
+ 要获取本地密钥的值，用户定义的 Lambda 函数必须使用 C AWS IoT Greengrass ore SDK 1.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. 在**指定要为此密钥存储的键值对**下：
   + 对于**键**，输入 **test**。
   + 对于**值**，输入 **abcdefghi**。

1. <a name="create-secret-step-encryption"></a>为加密密钥保留选中 **aws/secretsmanager**，然后选择**下一步**。
**注意**  
 AWS KMS 如果您使用 Secrets Manager 在账户中创建的默认 AWS 托管密钥，则不会向您收费。

1. 对于**密钥名称**，输入 **greengrass-TestSecret**，然后选择**下一步**。
**注意**  
*默认情况下，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>在**审核**页上，审核您的设置，然后选择**存储**。

   接下来，在 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. 选择**添加资源**。

## 步骤 3：创建 Lambda 函数部署程序包
<a name="secrets-console-create-deployment-package"></a>

要创建 Lambda 函数，您必须先创建一个包含函数代码和依赖项的 Lambda 函数*部署包*。Greengrass Lambda 函数需要 [AWS IoT Greengrass Core 软件开发工具包](lambda-functions.md#lambda-sdks-core)来执行各项任务，例如在核心环境中与 MQTT 消息通信和访问本地机密等。本教程将创建一个 Python 函数，因此您需要在部署包中使用 Python 版本的软件开发工具包。

**注意**  
要获取本地密钥的值，用户定义的 Lambda 函数必须使用 C AWS IoT Greengrass ore SDK 1.3.0 或更高版本。

1. <a name="download-ggc-sdk"></a> 从[AWS IoT Greengrass 核心软件开发工具包](what-is-gg.md#gg-core-sdk-download)下载页面，将适用于 Python 的 AWS IoT Greengrass 酷睿 SDK 下载到你的电脑上。

1. <a name="unzip-ggc-sdk"></a>解压缩下载的程序包以获取软件开发工具包。软件开发工具包是 `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. 在**基本信息**部分中，使用以下值：
      + 对于**函数名称**，请输入 **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_cn/greengrass/v1/developerguide/images/lra-console/upload-deployment-package.png)

   1. 选择**上传**，然后选择您的 `secret_test_python.zip` 部署包。然后，选择**保存**。

   1. <a name="lambda-console-runtime-settings-para"></a>在函数的**代码**选项卡中，在**运行时设置**下选择**编辑**，然后输入以下值。
      + 对于**运行时系统**，选择 **Python 3.7**。
      + 对于**处理程序**，输入 **secret\$1test.function\$1handler**。

   1. <a name="lambda-console-save-config"></a>选择**保存**。
**注意**  
 AWS Lambda 主机上的 “**测试**” 按钮不适用于此功能。 AWS IoT Greengrass 核心软件开发工具包不包含在控制台中独立运行 Greengrass Lambda 函数所需的模块。 AWS 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>对于**版本描述**，输入 **First version**，然后选择**发布**。

   1. 在**SecretTest:1** 配置页面上，从 “**操作**” 菜单中选择 “**创建别名**”。

   1. 在**创建新别名**页面上，使用以下值：
      + 对于**名称**，输入 **GG\$1SecretTest**。
      + 对于**版本**，选择 **1**。
**注意**  
AWS IoT Greengrass **不支持 \$1LATEST 版本的 Lambda 别名。**

   1. 选择**创建**。

现在，您可以将 Lambda 函数添加到 Greengrass 组并附加密钥资源。

## 步骤 5：将 Lambda 函数添加到 Greengrass 组
<a name="secrets-console-create-gg-function"></a>

在此步骤中，您要在 AWS IoT 控制台中将 Lambda 函数添加到 Greengrass 组。

1. <a name="choose-add-lambda"></a>在组配置页面上，选择**Lambda 函数**选项卡。

1. 在**我的 Lambda 函数**部分下，选择**添加**。

1. 对于 **Lambda 函数**，请选择。**SecretTest**

1. 对于 **Lambda 函数版本**，请选择您所发布的版本的别名。

接下来，配置 Lambda 函数的生命周期。

1. 在 **Lambda 函数配置**部分中，进行以下更新。
**注意**  
 我们建议您在不进行容器化的情况下运行 Lambda 函数，除非您的业务案例需要这样做。这有助于您在无需配置设备资源的前提下访问您的设备 GPU 和摄像头。如果您在没有容器化的情况下运行，则还必须授予对 Lambda 函数 AWS IoT Greengrass 的根访问权限。

   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)。
      + 对于**超时**，输入 **10 seconds**。
      + 对于**已固定**，选择 **True**。

        有关更多信息，请参阅 [Greengrass Lambda 函数的生命周期配置](lambda-functions.md#lambda-lifecycle)。
      + 在**其他参数**下，在**对 sys 目录的只读权限**中选择**启用**。

   1.  **改为在容器化模式下运行：**
**注意**  
我们不建议以容器化模式运行，除非您的业务案例需要这样做。
      + 对于**系统用户和组**，选择**使用组默认值**。
      + 对于 **Lambda 函数容器化**，选择**使用组默认值**。
      + 对于**内存限制**，输入 **1024 MB**。
      + 对于**超时**，输入 **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 云**。

   1. 在**目标类型**中，选择**服务**，然后选择**SecretTest**。

   1. 在**主题筛选条件**字段中，输入 **secrets/input**，然后选择**订阅**。

1. 添加另一个订阅。选择**订阅**选项卡，选择**添加订阅**，然后按如下所示配置源和目标：

   1. 在 “**源类型**” 中，选择 “**服务**”，然后选择**SecretTest**。

   1. 在**目标类型**中，选择 **Lambda 函数**，然后选择 **IoT 云**。

   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 核心设备上安装的 Core 软件版本。

   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_cn/greengrass/v1/developerguide/secrets-console.html)

1. 对于**发布到主题**，请使用以下值，然后选择**发布** 来调用函数。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/secrets-console.html)

   如果成功，则该函数会发布“成功”消息。

## 另请参阅
<a name="secrets-console-see-also"></a>
+ [将机密部署到核 AWS IoT Greengrass 心](secrets.md)