AWS IoT Greengrass
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如何创建密钥资源(控制台)

此功能适用于 AWS IoT Greengrass Core v1.7 及更高版本。

本教程介绍如何使用 AWS 管理控制台将密钥资源添加到 Greengrass 组。密钥资源是对 AWS Secrets Manager 中密钥的引用。有关更多信息,请参阅将密钥部署到 AWS IoT Greengrass 核心

在 AWS IoT Greengrass Core 设备上,连接器和 Lambda 函数可使用密钥资源对服务和应用程序进行身份验证,而无需对密码、令牌或其他凭证进行硬编码。

在本教程中,您需要先在 AWS Secrets Manager 控制台中创建一个密钥。然后,在 AWS IoT Greengrass 控制台中,从 Greengrass 组的资源页面向该组添加一个密钥资源。此密钥资源引用 Secrets Manager 密钥。稍后,将此密钥资源附加到一个 Lambda 函数,这将允许该函数获取本地密钥的值。

注意

或者,控制台允许您在配置连接器或 Lambda 函数时创建密钥和密钥资源。您可以从连接器的 Configure parameters (配置参数) 页面或 Lambda 函数的 Resources (资源) 页面执行此操作。

只有包含密钥参数的连接器才可以访问密钥。有关介绍 Twilio 通知 连接器如何使用本地存储的身份验证令牌的教程,请参阅Greengrass 连接器入门(控制台)

本教程包含以下概括步骤:

完成本教程大约需要 20 分钟。

先决条件

要完成此教程,需要:

  • Greengrass 组和 Greengrass 核心 (v1.7 or later)。要了解如何创建 Greengrass 组和核心,请参阅 AWS IoT Greengrass 入门。“入门”教程还包含用于安装 AWS IoT Greengrass 核心软件的步骤。

  • AWS IoT Greengrass 必须配置为支持本地密钥。有关更多信息,请参阅密钥要求

    注意

    其中包括允许访问您的 Secrets Manager 密钥。如果使用的是默认 Greengrass 服务角色,则Greengrass有权获得名称以 greengrass- 开头的密钥的值。

  • 要获得本地密钥的值,您的用户定义的 Lambda 函数必须使用 AWS IoT Greengrass Core 开发工具包 v1.3.0 or later。

步骤 1:创建 Secrets Manager 密钥

在本步骤中,使用 AWS Secrets Manager 控制台创建密钥。

  1. 登录 AWS Secrets Manager 控制台

    注意

    有关该过程的更多信息,请参阅 AWS Secrets Manager 用户指南中的步骤 1:在 AWS Secrets Manager 中创建并存储密钥

  2. 选择存储新密钥

  3. Select secret type (选择密钥类型) 下,选择 Other type of secrets (其他密钥类型)

  4. Specify the key-value pairs to be stored for this secret (指定要为此密钥存储的键值对) 下:

    • 对于 Key (键),输入 test

    • 对于 Value (值),输入 abcdefghi

    
                在 Secrets Manager 控制台中指定密钥的键和值。
  5. 请确保为加密密钥保持选中 DefaultEncryptionKey,然后选择 Next (下一步)

    注意

    如果使用 Secrets Manager 在您的账户中创建的默认 AWS 托管密钥,AWS KMS 不会对您收费。

  6. 对于密钥名称,输入 greengrass-TestSecret,然后选择下一步

    注意

    默认情况下,Greengrass 服务角色允许 AWS IoT Greengrass 获得名称以 greengrass- 开头的密钥的值。有关更多信息,请参阅密钥要求。

  7. 本教程不需要轮换,因此,请选择 Disable automatic rotation (禁用自动轮换),然后选择 Next (下一步)

  8. Review (审核) 页上,审核您的设置,然后选择 Store (存储)

    接下来,在 Greengrass 组中创建一个引用该密钥的密钥资源。

步骤 2:将密钥资源添加到 Greengrass 组

在本步骤中,配置一个引用 Secrets Manager 密钥的组资源。

  1. 在 AWS IoT Core 控制台中,选择 Greengrass,然后选择 Groups (组)

  2. 选择要将密钥资源添加到的组。

  3. 在组配置页面上,选择 Resources (资源),然后选择 Secret (密钥)。此选项卡显示属于该组的密钥资源。您可以从此选项卡添加、编辑和删除密钥资源。

    
                组的“Resources (资源)”页面上的“Secret (密钥)”选项卡。

    注意

    或者,控制台允许您在配置连接器或 Lambda 函数时创建密钥和密钥资源。您可以从连接器的 Configure parameters (配置参数) 页面或 Lambda 函数的 Resources (资源) 页面执行此操作。

  4. 选择 Add a secret resource (添加密钥资源)

  5. Add a secret resource to your group (向组中添加密钥资源) 页面上,选择 Select (选择),然后选择 greengrass-TestSecret

    
                “Add a secret resource to your group (向组中添加密钥资源)”页面,突出显示了“Select (选择)”。
  6. Select labels (Optional) (选择标签 (可选)) 页面上,选择 Next (下一步)。AWSCURRENT 暂存标签表示最新版密钥。该标签始终包含在密钥资源中。

    注意

    本教程只需要 AWSCURRENT 标签。您可以视情况包括 Lambda 函数或连接器所需的标签。

  7. Name your secret resource (为密钥资源命名) 页面上,输入 MyTestSecret,然后选择 Save (保存)

步骤 3:创建 Lambda 函数部署程序包

要创建 Lambda 函数,您必须先创建一个包含函数代码和依赖项的 Lambda 函数部署程序包。Greengrass Lambda 函数需要 AWS IoT Greengrass Core 开发工具包来用于与核心环境中的 MQTT 消息进行通信和访问本地密钥等任务。本教程将创建一个 Python 函数,因此您可以在部署程序包中使用 Python 版本的开发工具包。

注意

要获得本地密钥的值,您的用户定义的 Lambda 函数必须使用 AWS IoT Greengrass Core 开发工具包 v1.3.0 or later。

  1. AWS IoT Greengrass Core 开发工具包 下载 页面下载 适用于 Python 的 AWS IoT Greengrass Core 开发工具包。在 Python 部分,选择 v1.4.0 - Current version (on GitHub) (1.4.0 版本 – 最新版本(在 GitHub 上)),然后下载软件开发工具包。

  2. 解压缩下载的程序包以获取软件开发工具包。软件开发工具包是 greengrasssdk 文件夹。

  3. 将以下 Python 代码函数保存在名为 secret_test.py 的本地文件中。

    import greengrasssdk # Create SDK clients. secrets_client = greengrasssdk.client('secretsmanager') message_client = greengrasssdk.client('iot-data') message = '' # This handler is called when the function is invoked. # It uses the 'secretsmanager' client to get the value of the test secret using the secret name. # The test secret is a text type, so the SDK returns a string. # For binary secret values, the SDK returns a base64-encoded string. def function_handler(event, context): response = secrets_client.get_secret_value(SecretId='greengrass-TestSecret') secret_value = response.get('SecretString') if secret_value is None: message = 'Failed to retrieve secret.' else: message = 'Success! Retrieved secret.' message_client.publish(topic='secrets/output', payload=message) print('published: ' + message)

    get_secret_value 函数支持对 SecretId 值使用 Secrets Manager 的名称或 ARN。此示例使用密钥名称。对于此示例密钥,AWS IoT Greengrass 返回键值对:{"test":"abcdefghi"}

    重要

    确保您的用户定义的 Lambda 函数安全地处理密钥并且不记录存储在密钥中的任何敏感数据。有关更多信息,请参阅 AWS Secrets Manager 用户指南 中的降低记录和调试 Lambda 函数的风险。尽管本文档专门提到了轮换函数,但该建议也适用于 Greengrass Lambda 函数。

  4. 将以下项目压缩到名为 secret_test_python.zip 的文件中。在创建 ZIP 文件时,应仅包含代码和依赖项,而不包含文件夹。

    • secret_test.py。应用程序逻辑。

    • greengrasssdk。所有 Python Greengrass Lambda 函数必需的库。

    此即 Lambda 函数部署程序包。

步骤 4:创建 Lambda 函数

在该步骤中,您使用 AWS Lambda 控制台创建 Lambda 函数,然后将其配置为使用您的部署程序包。接着,发布函数版本并创建别名。

  1. 首先,创建 Lambda 函数。

    1. 在 AWS 管理控制台中,选择 Services (服务),然后打开 AWS Lambda 控制台。

    2. 选择 Create function,然后选择 Author from scratch

    3. Basic information (基本信息) 部分中,使用以下值:

      • 对于 Function name (函数名称),输入 SecretTest

      • 对于 Runtime (运行时),选择 Python 2.7

      • AWS IoT Greengrass 不会使用此角色,因此您可以创建或选择任何 Lambda 执行角色。

    4. 在页面底部,选择 Create function

  2. 接下来,注册处理程序并上传您的 Lambda 函数部署程序包。

    1. 在 SecretTest 函数的 Configuration (配置) 选项卡的 Function code (函数代码) 中,使用以下值:

      • 对于 代码输入种类,选择上传 .zip 文件

      • 对于 Runtime,选择 Python 2.7

      • 对于 Handler (处理程序),输入 secret_test.function_handler

    2. 选择 Upload

    3. 选择您的 secret_test_python.zip 部署程序包。

    4. 选择 Save

      注意

      AWS Lambda 控制台上的测试键不可与该函数一同使用。AWS IoT Greengrass 核心 SDK 不包含在 AWS Lambda 控制台中独立运行 Greengrass Lambda 函数所需的模块。这些模块(例如 greengrass_common)会在被部署到您的 Greengrass 核心之后提供给这些函数。

      提示

      代码输入种类菜单中选择编辑内联代码,即可在函数代码部分中查看您的代码。

  3. 现在,发布 Lambda 函数的第一个版本并创建此版本的别名

    注意

    Greengrass 组可以按别名 (推荐) 或版本引用 Lambda 函数。通过使用别名,可以更轻松地管理代码更新,因为您在更新函数代码时无需更改订阅表或组定义。相反,您只是将别名指向新的函数版本。

    1. Actions 菜单上,选择 Publish new version

    2. 对于 Version description (版本描述),输入 First version,然后选择 Publish (发布)

    3. SecretTest: 1 配置页面上,从操作菜单中选择创建别名

    4. 创建新别名页面上,使用以下值:

      • 对于名称,输入 GG_SecretTest

      • 对于 Version (版本),选择 1

      注意

      AWS IoT Greengrass 不支持 $LATEST 版本的 Lambda 别名。

    5. 选择 Create

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

步骤 5:将 Lambda 函数添加到 Greengrass 组

在这一步中,将 Lambda 函数添加到 AWS IoT Core 控制台中的 Greengrass 组中。

  1. 在组配置页面上,选择 Lambda,然后选择 Add Lambda

    
                突出显示“Lambda”和“Add Lambda (添加 Lambda)”的组页面。
  2. Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组) 页面上,选择 Use existing Lambda

    
                突出显示“Use existing Lambda (使用现有 Lambda)”的“Add a Lambda to your Greengrass Group (将 Lambda 添加到 Greengrass 组)”页面。
  3. 使用现有的 Lambda 页面上,选择 SecretTest,然后选择下一步

  4. 选择 Lambda 版本页面上,选择 Alias:GG_SecretTest,然后选择完成

接下来,将密钥资源与函数关联。

步骤 6:将密钥资源附加到 Lambda 函数

在这一步中,将密钥资源附加到 Greengrass 组中的 Lambda 函数。这会将资源与函数关联,从而允许函数获取本地密钥的值。

  1. 在组的 Lambda 页面上,选择 SecretTest 函数。

  2. 在函数的详细信息页面上,依次选择资源密钥Attach a secret resource (附加密钥资源)

    
                        “Resources (资源)”页面,突出显示了“Attach a secret resource (附加密钥资源)”。
  3. Attach a secret resource to your Lambda function (将密钥资源附加到 Lambda 函数) 页面上,选择 Choose secret resource (选择密钥资源)

  4. Select a secret resource from your group (从您的组中选择密钥资源) 页面上,选择 MyTestSecret,然后选择 Save (保存)

步骤 7:将订阅添加到 Greengrass 组

在该步骤中,您将添加允许 AWS IoT 和 Lambda 函数交换消息的订阅。一个允许 AWS IoT 调用该函数的订阅,以及一个允许该函数向 AWS IoT 发送输出数据的订阅。

  1. 在组配置页面上,选择 Subscriptions (订阅),然后选择 Add Subscription

    
                突出显示“Subscriptions (订阅)”和“Add Subscription (添加订阅)”的组页面。
  2. 创建一个允许 AWS IoT 向该函数发布消息的订阅:

    选择您的源和目标页面上,配置源和目标:

    1. 对于选择源,选择服务,然后选择 IoT Cloud

    2. 对于选择目标,选择 Lambda,然后选择 SecretTest

    3. 选择 Next

  3. 利用主题筛选您的数据页面上,对于主题筛选条件,输入 secrets/input,然后选择下一步

  4. 选择 Finish

  5. 重复执行步骤 1 至 4,以创建允许该函数向 AWS IoT 发布状态的订阅。

    1. 对于选择源,选择 Lambda,然后选择 SecretTest

    2. 对于选择目标,选择服务,然后选择 IoT Cloud

    3. 对于 Topic filter (主题筛选条件),输入 secrets/output

步骤 8:部署 Greengrass 组

将组部署到核心设备。在部署期间,AWS IoT Greengrass 从 Secrets Manager 中提取密钥的值并在核心上创建本地加密副本。

  1. 确保 AWS IoT Greengrass Core正在运行。根据需要在您的 Raspberry Pi 终端中运行以下命令。

    1. 要检查守护程序是否正在运行,请执行以下操作:

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

      如果输出包含 root/greengrass/ggc/packages/ggc-version/bin/daemon 条目,则表示守护程序正在运行。

      注意

      路径中的版本取决于您的核心设备上安装的 AWS IoT Greengrass 核心软件版本。

    2. 要启动守护程序,请执行以下操作:

      cd /greengrass/ggc/core/ sudo ./greengrassd start
  2. 在组配置页面上,选择部署,然后从操作菜单中,选择部署

    
                突出显示“Deployments (部署)”和“Deploy (部署)”的组页面。
  3. Configure how devices discover your core (配置设备搜索您的核心的方式) 页面上,选择 Automatic detection

    这使得设备可以自动获取核心的连接信息,例如 IP 地址、DNS 和端口号。建议使用自动检测,不过 AWS IoT Greengrass 也支持手动指定的终端节点。只有在首次部署组时,系统才会提示您选择搜索方法。

    
                突出显示“Automatic detection (自动检测)”的“Configure how devices discover your core (配置设备搜索您的核心的方式)”页面。

    注意

    在系统提示时,授予权限以创建Greengrass 服务角色,并将该角色与您在当前 AWS 区域中的 AWS 账户关联。该角色允许 AWS IoT Greengrass 访问您 AWS 服务中的资源。每个 AWS 账户只需要一个 Greengrass 服务角色,但相应角色必须与您在其中使用 AWS IoT Greengrass 的每个 AWS 区域中的 AWS 账户关联。

    Deployments (部署) 页面显示了部署时间戳、版本 ID 和状态。完成后,部署的状态应显示为 Successfully completed (成功完成)

    有关问题排查帮助,请参阅AWS IoT Greengrass 问题排查

测试函数。

  1. 在 AWS IoT Core 控制台主页上,选择 Test (测试)

    
                AWS IoT Core 控制台的左侧窗格,突出显示了“Test (测试)”。
  2. 对于订阅,请使用以下值,然后选择订阅主题

    属性

    订阅主题

    密钥/输出

    MQTT 负载显示

    将负载显示为字符串

  3. 对于 Publish (发布),请使用以下值,然后选择 Publish to topic (发布到主题) 来调用函数。

    属性

    主题

    密钥/输入

    消息

    保留默认消息。发布消息可调用 Lambda 函数,但本教程中的该函数不处理消息正文。

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

另请参阅