将客户端设备连接到核心设备 - AWS IoT Greengrass

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将客户端设备连接到核心设备

您可以将云发现配置为将客户端设备连接到核心设备。配置云发现时,客户端设备可以连接到 AWS IoT Greengrass 云服务,以检索有关其可以连接的核心设备的信息。然后,客户端设备可以尝试连接到每台核心设备,直至其成功连接。

要使用云发现,您必须执行以下操作:

  • 将客户端设备与其可以连接的核心设备关联。

  • 指定客户端设备可以连接到每个核心设备的 MQTT 代理端点。

  • 将组件部署到能启用客户端设备支持的核心设备。

    您也可以部署可选组件来执行以下操作:

    • 在客户端设备、Greengrass 组件和 AWS IoT Core 云服务之间中继消息。

    • 自动为您管理核心设备 MQTT 代理端点。

    • 管理本地客户端设备影子并将影子与 AWS IoT Core 云服务同步。

您还必须查看并更新核心设备的 AWS IoT 策略,以验证其是否具有连接客户端设备所需的权限。有关更多信息,请参阅要求

配置云发现后,您可以测试客户端设备与核心设备间的通信。有关更多信息,请参阅测试客户端设备通信

要求

要将客户端设备连接到核心设备,您必须满足以下要求或具备以下内容:

  • 核心设备必须运行 Greengrass Nucleus v2.2.0 或更高版本。

  • 在核心设备运行的 AWS 区域,您 AWS 账户的与 AWS IoT Greengrass 关联的 Greengrass 服务角色。有关更多信息,请参阅配置 Greengrass 服务角色

  • 核心设备的 AWS IoT 策略必须允许以下权限:

    • greengrass:PutCertificateAuthorities

    • greengrass:VerifyClientDeviceIdentity

    • greengrass:VerifyClientDeviceIoTCertificateAssociation

    • greengrass:GetConnectivityInfo

    • greengrass:UpdateConnectivityInfo –(可选)使用 IP 检测器组件时需要此权限,该组件会将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。

    • iot:GetThingShadowiot:UpdateThingShadowiot:DeleteThingShadow –(可选)使用影子管理器组件将客户端设备影子与 AWS IoT Core 同步时需要这些权限。此功能需要 Greengrass Nucleus v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 MQTT 网桥 v2.2.0 或更高版本。

    有关更多信息,请参阅配置 AWS IoT 事物策略

    注意

    如果您在安装 AWS IoT Greengrass Core 软件时使用默认 AWS IoT 策略,则核心设备具有允许访问所有 AWS IoT Greengrass 操作的 AWS IoT 策略(greengrass:*)。

  • 可以作为客户端设备连接的 AWS IoT 事物。有关更多信息,请参阅《AWS IoT Core 开发人员指南》中的创建 AWS IoT 资源

  • 客户端设备必须使用客户端 ID 进行连接。客户端 ID 是一个事物名称。不接受其他客户端 ID。

  • 每台客户端设备的 AWS IoT 策略都必须允许 greengrass:Discover 权限。有关更多信息,请参阅客户端设备的最低 AWS IoT 策略

配置 Greengrass 服务角色

Greengrass 服务角色是一种 AWS Identity and Access Management (IAM) 服务角色,用于向 AWS IoT Greengrass 授权代表您访问 AWS 服务中的资源。此角色使 AWS IoT Greengrass 能够验证客户端设备的身份和管理核心设备连接信息。

如果您之前未在该区域设置过 Greengrass 服务角色,则必须在该区域将 Greengrass 服务角色与您 AWS 账户的 AWS IoT Greengrass 关联。

AWS IoT Greengrass 控制台中使用配置核心设备发现页面时,AWS IoT Greengrass 将为您设置 Greengrass 服务角色。否则,您可以使用 AWS IoT 控制台或 AWS IoT Greengrass API 进行手动设置。

在本节中,您将检查是否已设置好 Greengrass 服务角色。如果未设置,则可以创建一个新的 Greengrass 服务角色,与您在该区域的 AWS 账户的 AWS IoT Greengrass 关联。

  1. 检查 Greengrass 服务角色是否与您在此区域中的 AWS 账户的 AWS IoT Greengrass 相关联。执行以下操作:

    1. 导航到 AWS IoT 控制台

    2. 在导航窗格中,选择 Settings(设置)

    3. Greengrass 服务角色部分,找到当前服务角色以查看是否关联了 Greengrass 服务角色。

      如果您关联了 Greengrass 服务角色,则符合使用 IP 检测器组件的要求。跳至配置 AWS IoT 事物策略

  2. 如果 Greengrass 服务角色没有与您在该区域的 AWS 账户的 AWS IoT Greengrass 关联,请创建一个 Greengrass 服务角色并进行关联。执行以下操作:

    1. 导航到 IAM 控制台

    2. 选择角色

    3. 选择 Create role(创建角色)。

    4. 创建角色页面上,执行以下操作:

      1. 可信实体类型下,选择 AWS 服务

      2. 使用案例其他 AWS 服务使用案例下,选择 Greengrass,然后选择 Greengrass。此选项指定将 AWS IoT Greengrass 作为可信实体(可代入此角色)添加。

      3. 选择下一步

      4. 权限策略下,选择要附加到角色的 AWSGreengrassResourceAccessRolePolicy

      5. 选择下一步

      6. 角色名称中,输入角色的名称,例如 Greengrass_ServiceRole

      7. 选择 Create role(创建角色)。

    5. 导航到 AWS IoT 控制台

    6. 在导航窗格中,选择 Settings(设置)

    7. Greengrass 服务角色部分,选择附加角色

    8. 更新 Greengrass 服务角色模式中,选择您创建的 IAM 角色,然后选择附加角色

  1. 检查 Greengrass 服务角色是否与您在此区域中的 AWS 账户的 AWS IoT Greengrass 相关联。

    aws greengrassv2 get-service-role-for-account

    如果关联了 Greengrass 服务角色,则该操作会返回包含有关该角色的信息的响应。

    如果您关联了 Greengrass 服务角色,则符合使用 IP 检测器组件的要求。跳至配置 AWS IoT 事物策略

  2. 如果 Greengrass 服务角色没有与您在该区域的 AWS 账户的 AWS IoT Greengrass 关联,请创建一个 Greengrass 服务角色并进行关联。执行以下操作:

    1. 使用允许 AWS IoT Greengrass 代入该角色的信任策略创建角色。此示例将创建一个名为 Greengrass_ServiceRole 的角色,但您也可以使用其他名称。我们建议您在信任策略中加入 aws:SourceArnaws:SourceAccount 全局条件上下文键,以帮助防止出现混淆代理人安全问题。条件上下文键可限制访问权限,仅允许来自指定账户和 Greengrass 工作空间的请求。有关混淆代理人问题的更多信息,请参阅 防止跨服务混淆代理

      Linux or Unix
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "greengrass.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:greengrass:region:account-id:*" }, "StringEquals": { "aws:SourceAccount": "account-id" } } } ] }'
      Windows Command Prompt (CMD)
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document "{\\"Version\\":\\"2012-10-17\\",\\"Statement\\":[{\\"Effect\\":\\"Allow\\",\\"Principal\\":{\\"Service\\":\\"greengrass.amazonaws.com\\"},\\"Action\\":\\"sts:AssumeRole\\",\\"Condition\\":{\\"ArnLike\\":{\\"aws:SourceArn\\":\\"arn:aws:greengrass:region:account-id:*\\"},\\"StringEquals\\":{\\"aws:SourceAccount\\":\\"account-id\\"}}}]}"
      PowerShell
      aws iam create-role --role-name Greengrass_ServiceRole --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "greengrass.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "ArnLike": { "aws:SourceArn": "arn:aws:greengrass:region:account-id:*" }, "StringEquals": { "aws:SourceAccount": "account-id" } } } ] }'
    2. 从输出中的角色元数据复制角色 ARN。使用该 ARN 将角色与您的账户关联。

    3. AWSGreengrassResourceAccessRolePolicy 策略附加到该角色。

      aws iam attach-role-policy --role-name Greengrass_ServiceRole --policy-arn arn:aws:iam::aws:policy/service-role/AWSGreengrassResourceAccessRolePolicy
    4. 将 Greengrass 服务角色与您 AWS 账户的 AWS IoT Greengrass 关联 将 role-arn 替换为服务角色的 ARN。

      aws greengrassv2 associate-service-role-to-account --role-arn role-arn

      如果操作成功,将返回以下响应。

      { "associatedAt": "timestamp" }

配置 AWS IoT 事物策略

核心设备使用 X.509 设备证书来授权与 AWS 的连接。您可以将 AWS IoT 策略附加到设备证书以定义核心设备的权限。有关更多信息,请参阅数据面板操作的 AWS IoT 策略支持客户端设备的最低 AWS IoT 政策

要将客户端设备连接到核心设备,核心设备的 AWS IoT 策略必须允许以下权限:

  • greengrass:PutCertificateAuthorities

  • greengrass:VerifyClientDeviceIdentity

  • greengrass:VerifyClientDeviceIoTCertificateAssociation

  • greengrass:GetConnectivityInfo

  • greengrass:UpdateConnectivityInfo –(可选)使用 IP 检测器组件时需要此权限,该组件会将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。

  • iot:GetThingShadowiot:UpdateThingShadowiot:DeleteThingShadow –(可选)使用影子管理器组件将客户端设备影子与 AWS IoT Core 同步时需要这些权限。此功能需要 Greengrass Nucleus v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 MQTT 网桥 v2.2.0 或更高版本。

在本节中,您将查看核心设备的 AWS IoT 策略并添加任何缺失的必要权限。如果您使用 AWS IoT Greengrass Core 软件安装程序来预置资源,则您的核心设备具有允许访问所有 AWS IoT Greengrass 操作的 AWS IoT 策略(greengrass:*)。在这种情况下,只有当您计划部署影子管理器组件来将设备影子与 AWS IoT Core 同步时,才必须更新 AWS IoT 策略。否则,您可以跳过此部分。

  1. AWS IoT Greengrass 控制台导航菜单中,选择核心设备

  2. 核心设备页面上,选择要更新的核心设备。

  3. 在核心设备详细信息页面上,选择指向核心设备的事物的链接。此链接可打开 AWS IoT 控制台中的事物详细信息页面。

  4. 在“事物详细信息”页面上,选择证书

  5. 证书选项卡中,选择事物的有效证书。

  6. 在证书详细信息页面上,选择策略

  7. 策略选项卡中,选择要查看和更新的 AWS IoT 策略。您可以为附加到核心设备有效证书的任何策略添加所需权限。

    注意

    如果使用 AWS IoT Greengrass Core 软件安装程序来预置资源,则您有两个 AWS IoT 策略。我们建议您选择名为 GreengrassV2IoTThingPolicy 的策略(如果存在)。默认情况下,使用快速安装程序创建的核心设备将使用此策略名称。如果您为此策略添加权限,则也会将这些权限授予使用此策略的其他核心设备。

  8. 在策略概述中,选择编辑活动版本

  9. 查看策略以了解所需权限,然后添加缺失的所有必要权限。

    • greengrass:PutCertificateAuthorities

    • greengrass:VerifyClientDeviceIdentity

    • greengrass:VerifyClientDeviceIoTCertificateAssociation

    • greengrass:GetConnectivityInfo

    • greengrass:UpdateConnectivityInfo –(可选)使用 IP 检测器组件时需要此权限,该组件会将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。

    • iot:GetThingShadowiot:UpdateThingShadowiot:DeleteThingShadow –(可选)使用影子管理器组件将客户端设备影子与 AWS IoT Core 同步时需要这些权限。此功能需要 Greengrass Nucleus v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 MQTT 网桥 v2.2.0 或更高版本。

  10. (可选)要允许核心设备与 AWS IoT Core 同步影子,请在策略中添加以下语句。如果您计划与客户端设备影子交互,但不打算与 AWS IoT Core 同步影子,请跳过此步骤。将 regionaccount-id 分别替换为您使用的区域和您的 AWS 账户号码。

    • 此示例语句允许访问所有事物的设备影子。要遵循最佳安全实践,您可以将访问权限限制为仅访问核心设备和您连接到核心设备的客户端设备。有关更多信息,请参阅支持客户端设备的最低 AWS IoT 政策

    { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": [ "arn:aws:iot:region:account-id:thing/*" ] }

    添加此语句后,策略文档可能看上去与以下示例相似。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect", "iot:Publish", "iot:Subscribe", "iot:Receive", "greengrass:*" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iot:GetThingShadow", "iot:UpdateThingShadow", "iot:DeleteThingShadow" ], "Resource": [ "arn:aws:iot:region:account-id:thing/*" ] } ] }
  11. 要将新的策略版本设置为活动版本,请在策略版本状态下,选择将编辑后的版本设置为该策略的活动版本

  12. 选择另存为新版本

  1. 列出核心设备的 AWS IoT 事物的主体。事物主体可以是 X.509 设备证书或其他标识。运行以下命令,然后将 MyGreengrassCore 替换为核心设备的名称。

    aws iot list-thing-principals --thing-name MyGreengrassCore

    该操作将返回一个响应,列出核心设备的事物主体。

    { "principals": [ "arn:aws:iot:us-west-2:123456789012:cert/certificateId" ] }
  2. 识别核心设备的有效证书。运行以下命令,将 certificateId 替换为上一步中每个证书的 ID,直至找到有效证书。证书 ID 是证书 ARN 末尾的十六进制字符串。--query 参数用于指定仅输出证书的状态。

    aws iot describe-certificate --certificate-id certificateId --query 'certificateDescription.status'

    该操作以字符串形式返回证书状态。例如,如果证书有效,则此操作会输出 "ACTIVE"

  3. 列出附加到证书的 AWS IoT 策略。运行以下命令,并将证书 ARN 替换为实际的证书 ARN。

    aws iot list-principal-policies --principal arn:aws:iot:us-west-2:123456789012:cert/certificateId

    此操作会返回一个响应,响应中会列出附加到证书的 AWS IoT 策略。

    { "policies": [ { "policyName": "GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias", "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassTESCertificatePolicyMyGreengrassCoreTokenExchangeRoleAlias" }, { "policyName": "GreengrassV2IoTThingPolicy", "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy" } ] }
  4. 选择要查看和更新的策略。

    注意

    如果使用 AWS IoT Greengrass Core 软件安装程序来预置资源,则您有两个 AWS IoT 策略。我们建议您选择名为 GreengrassV2IoTThingPolicy 的策略(如果存在)。默认情况下,使用快速安装程序创建的核心设备将使用此策略名称。如果您为此策略添加权限,则也会将这些权限授予使用此策略的其他核心设备。

  5. 获取策略的文档。运行以下命令,然后将 GreengrassV2IoTThingPolicy 替换为策略名称。

    aws iot get-policy --policy-name GreengrassV2IoTThingPolicy

    该操作会返回一个响应,其中包含策略的文档和有关该策略的其他信息。策略文档是一个序列化为字符串的 JSON 对象。

    { "policyName": "GreengrassV2IoTThingPolicy", "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy", "policyDocument": "{\ \\"Version\\": \\"2012-10-17\\",\ \\"Statement\\": [\ {\ \\"Effect\\": \\"Allow\\",\ \\"Action\\": [\ \\"iot:Connect\\",\ \\"iot:Publish\\",\ \\"iot:Subscribe\\",\ \\"iot:Receive\\",\ \\"greengrass:*\\"\ ],\ \\"Resource\\": \\"*\\"\ }\ ]\ }", "defaultVersionId": "1", "creationDate": "2021-02-05T16:03:14.098000-08:00", "lastModifiedDate": "2021-02-05T16:03:14.098000-08:00", "generationId": "f19144b798534f52c619d44f771a354f1b957dfa2b850625d9f1d0fde530e75f" }
  6. 使用在线转换器或其他工具将策略文档字符串转换为 JSON 对象,然后将其保存到名为 iot-policy.json 的文件中。

    例如,如果您安装了 jq 工具,则可以运行以下命令来获取策略文档,将其转换为 JSON 对象,然后将策略文档另存为 JSON 对象。

    aws iot get-policy --policy-name GreengrassV2IoTThingPolicy --query 'policyDocument' | jq fromjson >> iot-policy.json
  7. 查看策略以了解所需权限,然后添加缺失的所有必要权限。

    例如,在 Linux 系统上,您可以运行以下命令来使用 GNU nano 打开文件。

    nano iot-policy.json
    • greengrass:PutCertificateAuthorities

    • greengrass:VerifyClientDeviceIdentity

    • greengrass:VerifyClientDeviceIoTCertificateAssociation

    • greengrass:GetConnectivityInfo

    • greengrass:UpdateConnectivityInfo –(可选)使用 IP 检测器组件时需要此权限,该组件会将核心设备的网络连接信息报告给 AWS IoT Greengrass 云服务。

    • iot:GetThingShadowiot:UpdateThingShadowiot:DeleteThingShadow –(可选)使用影子管理器组件将客户端设备影子与 AWS IoT Core 同步时需要这些权限。此功能需要 Greengrass Nucleus v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 MQTT 网桥 v2.2.0 或更高版本。

  8. 将更改保存为策略的新版本。运行以下命令,然后将 GreengrassV2IoTThingPolicy 替换为策略名称。

    aws iot create-policy-version --policy-name GreengrassV2IoTThingPolicy --policy-document file://iot-policy.json --set-as-default

    如果操作成功,它会返回与以下示例类似的响应。

    { "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy", "policyDocument": "{\ \\"Version\\": \\"2012-10-17\\",\ \\"Statement\\": [\ {\ \\"Effect\\": \\"Allow\\",\ \\"Action\\": [\ \\t\\t\\"iot:Connect\\",\ \\t\\t\\"iot:Publish\\",\ \\t\\t\\"iot:Subscribe\\",\ \\t\\t\\"iot:Receive\\",\ \\t\\t\\"greengrass:*\\"\ ],\ \\"Resource\\": \\"*\\"\ }\ ]\ }", "policyVersionId": "2", "isDefaultVersion": true }

用于支持客户端设备的 Greengrass 组件

重要

核心设备必须运行 Greengrass Nucleus v2.2.0 或更高版本才能支持客户端设备。

要使客户端设备能够连接到核心设备并与之通信,请将以下 Greengrass 组件部署到核心设备:

  • 客户端设备身份验证 (aws.greengrass.clientdevices.Auth)

    部署客户端设备身份验证组件,以对客户端设备进行身份验证并授权客户端设备操作。此组件允许 AWS IoT 事物连接到核心设备。

    此组件需要进行一些配置才能使用。您必须指定客户端设备组以及每个组有权执行的操作,例如通过 MQTT 进行连接和通信。有关更多信息,请参阅客户端设备身份验证组件配置

  • MQTT 3.1.1 代理(Moquette) (aws.greengrass.clientdevices.mqtt.Moquette)

    部署 Moquette MQTT 代理组件来运行轻量级 MQTT 代理。Moquette MQTT 代理符合 MQTT 3.1.1,包括对 QoS 0、QoS 1、QoS 2、保留消息、最后遗嘱消息和永久订阅的本地支持。

    您无需配置此组件即可使用此组件。但是,您可以配置此组件操作 MQTT 代理的端口。默认情况下,使用端口 8883。

  • MQTT5 经纪人 (EMQX) (aws.greengrass.clientdevices.mqtt.EMQX)

    注意

    要使用 EMQX MQTT 5 代理,必须使用 Greengrass Nucleus v2.6.0 或更高版本以及客户端设备身份验证 v2.2.0 或更高版本。

    部署 EMQX MQTT 代理组件,以便在客户端设备和核心设备间的通信中使用 MQTT 5.0 功能。EMQX MQTT 代理符合 MQTT 5.0 的要求,并且支持会话和消息过期间隔、用户属性、共享订阅、主题别名等功能。

    您无需配置此组件即可使用此组件。但是,您可以配置此组件操作 MQTT 代理的端口。默认情况下,使用端口 8883。

  • MQTT 网桥 (aws.greengrass.clientdevices.mqtt.Bridge)

    (可选)部署 MQTT 网桥组件,以便在客户端设备(本地 MQTT)、本地发布/订阅和 AWS IoT Core MQTT 之间中继消息。配置此组件以将客户端设备与 AWS IoT Core 同步,并与 Greengrass 组件中的客户端设备进行交互。

    此组件需要配置才能使用。您必须指定此组件用于中继消息的主题映射。有关更多信息,请参阅 MQTT 网桥组件配置

  • IP 检测器 (aws.greengrass.clientdevices.IPDetector)

    (可选)部署 IP 检测器组件,自动向 AWS IoT Greengrass 云服务报告核心设备的 MQTT 代理端点。如果您的网络设置很复杂(例如路由器将 MQTT 代理端口转发到核心设备),则无法使用此组件。

    您无需配置此组件即可使用此组件。

  • 影子管理器 (aws.greengrass.ShadowManager)

    注意

    要管理客户端设备影子,必须使用 Greengrass Nucleus v2.6.0 或更高版本、影子管理器 v2.2.0 或更高版本以及 MQTT 网桥 v2.2.0 或更高版本。

    (可选)部署影子管理器组件以管理核心设备上的客户端设备影子。Greengrass 组件可以获取、更新和删除客户端设备影子,以与客户端设备进行交互。您也可以将影子管理器组件配置为将客户端设备影子与 AWS IoT Core 云服务同步。

    要将此组件用于客户端设备影子,必须配置 MQTT 网桥组件,以通过本地发布/订阅在客户端设备和影子管理器间中继消息。否则,此组件无需配置即可使用,但配置后才能同步设备影子。

注意

我们建议您仅部署一个 MQTT 代理组件。MQTT 网桥IP 检测器组件每次只能使用一个 MQTT 代理组件。如果您部署多个 MQTT 代理组件,您必须将这些组件配置为使用不同的端口。

配置云发现(控制台)

您可以使用 AWS IoT Greengrass 控制台关联客户端设备、管理核心设备端点,以及部署组件以启用客户端设备支持。有关更多信息,请参阅第 2 步:启用客户端设备支持

配置云发现(AWS CLI)

您可以使用 AWS Command Line Interface(AWS CLI)控制台关联客户端设备、管理核心设备端点,以及部署组件以启用客户端设备支持。有关更多信息,请参阅下列内容: