步骤 5:在 Amazon IoT Greengrass 服务中创建您的组件 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

步骤 5:在 Amazon IoT Greengrass 服务中创建您的组件

在核心设备上开发完组件后,可以将其上传到中的 Amazon IoT Greengrass 服务 Amazon Web Services 云。您也可以直接在Amazon IoT Greengrass 控制台中创建组件。 Amazon IoT Greengrass 提供托管组件的组件管理服务,以便您可以将它们部署到单个设备或设备群中。要将组件上传到 Amazon IoT Greengrass 服务,请完成以下步骤:

  • 将组件项目上传到 S3 存储桶。

  • 将每个工件的亚马逊简单存储服务 (Amazon S3) 添加到URI组件配方中。

  • Amazon IoT Greengrass 从组件配方中创建组件。

在本节中,您将在 Greengrass 核心设备上完成这些步骤,将 Hello World 组件上传到该服务。 Amazon IoT Greengrass

  1. 在您的 Amazon 账户中使用一个 S3 存储桶来托管 Amazon IoT Greengrass 组件项目。当您将组件部署到核心设备时,设备会从存储桶中下载该组件的构件。

    您可以使用现有的 S3 存储桶,也可以创建新的存储桶。

    1. Amazon S3 控制台存储桶下,选择创建存储桶

    2. 存储桶名称中,输入唯一的存储桶名称。例如,您可以使用 greengrass-component-artifacts-region-123456789012。Replace(替换) 123456789012 使用您的 Amazon 账户 ID 和 region 使用你在本教程中使用的。 Amazon Web Services 区域

    3. 对于Amazon 区域,请选择您用于本教程的 Amazon 区域。

    4. 选择创建存储桶

    5. Buc kets 下,选择您创建的存储桶,然后将hello_world.py脚本上传到存储桶中的artifacts/com.example.HelloWorld/1.0.0文件夹。有关将对象上传到 S3 存储桶的信息,请参阅 Amazon 简单存储服务用户指南中的上传对象

    6. hello_world.py对象的 S3 URI 复制到 S3 存储桶中。这URI应该与以下示例类似。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。

      s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
  2. 允许核心设备访问 S3 存储桶中的组件工件。

    每台核心设备都有一个核心设备IAM角色,允许它与云进行交互 Amazon IoT 并将日志发送到 Amazon 云端。默认情况下,此设备角色不允许访问 S3 存储桶,因此您必须创建并附加允许核心设备从 S3 存储桶检索组件工件的策略。

    如果您的设备角色已允许访问 S3 存储桶,则可以跳过此步骤。否则,请创建允许访问的IAM策略并将其附加到该角色,如下所示:

    1. IAM控制台导航菜单中,选择策略,然后选择创建策略

    2. JSON选项卡上,将占位符内容替换为以下策略。将 amzn-s3-demo-bucket 替换为包含要下载的组件工件的 S3 存储桶的名称。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }
    3. 选择下一步

    4. 在 “策略详细信息” 部分中,在 “名称” 中输入MyGreengrassV2ComponentArtifactPolicy

    5. 选择创建策略

    6. IAM控制台导航菜单中,选择角色,然后选择核心设备的角色名称。您在安装 C Amazon IoT Greengrass ore 软件时指定了此角色名称。如果您未指定名称,则默认为GreengrassV2TokenExchangeRole

    7. 权限下,选择添加权限,然后选择附加策略

    8. 添加权限页面上,选中您创建的MyGreengrassV2ComponentArtifactPolicy策略旁边的复选框,然后选择添加权限

  3. 使用组件配方在Amazon IoT Greengrass 控制台中创建组件。

    1. Amazon IoT Greengrass 控制台导航菜单中,选择组件,然后选择创建组件

    2. 在 “组件信息” 下,选择 “将配方输入为” JSON。占位符配方应与以下示例类似。

      { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.HelloWorld", "ComponentVersion": "1.0.0", "ComponentDescription": "My first Amazon IoT Greengrass component.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "Message": "world" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "run": "python3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\"" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] }, { "Platform": { "os": "windows" }, "Lifecycle": { "run": "py -3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\"" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] } ] }
    3. 将每个Artifacts部分URI中的占位符替换为hello_world.py对象URI的 S3。

    4. 选择创建组件

    5. com.example 上。 HelloWorld组件页面上,验证组件的状态是否为可部署

上传你的 Hello World 组件
  1. 使用您的中的 S3 存储桶 Amazon Web Services 账户 来托管 Amazon IoT Greengrass 组件项目。当您将组件部署到核心设备时,设备会从存储桶中下载该组件的构件。

    您可以使用现有的 S3 存储桶,也可以运行以下命令来创建存储桶。此命令使用您的 Amazon Web Services 账户 ID 创建一个存储桶 Amazon Web Services 区域 ,并形成一个唯一的存储桶名称。Replace(替换) 123456789012 带上你的 Amazon Web Services 账户 身份证和 region 使用你在本教程中使用的。 Amazon Web Services 区域

    aws s3 mb s3://greengrass-component-artifacts-123456789012-region

    如果请求成功,该命令将输出以下信息。

    make_bucket: greengrass-component-artifacts-123456789012-region
  2. 允许核心设备访问 S3 存储桶中的组件工件。

    每台核心设备都有一个核心设备IAM角色,允许它与之交互 Amazon IoT 并向其发送日志 Amazon Web Services 云。默认情况下,此设备角色不允许访问 S3 存储桶,因此您必须创建并附加允许核心设备从 S3 存储桶检索组件工件的策略。

    如果核心设备的角色已经允许访问 S3 存储桶,则可以跳过此步骤。否则,请创建允许访问的IAM策略并将其附加到该角色,如下所示:

    1. 创建一个名为的文件component-artifact-policy.json,JSON并将以下内容复制到该文件中。此策略允许访问 S3 存储桶中的所有文件。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }
    2. 运行以下命令以根据中的策略文档创建策略component-artifact-policy.json

      Linux or Unix
      aws iam create-policy \\ --policy-name MyGreengrassV2ComponentArtifactPolicy \\ --policy-document file://component-artifact-policy.json
      Windows Command Prompt (CMD)
      aws iam create-policy ^ --policy-name MyGreengrassV2ComponentArtifactPolicy ^ --policy-document file://component-artifact-policy.json
      PowerShell
      aws iam create-policy ` --policy-name MyGreengrassV2ComponentArtifactPolicy ` --policy-document file://component-artifact-policy.json

      从输出中的策略元数据中复制策略 Amazon 资源名称 (ARN)。在下一步中ARN,您可以使用此策略将此策略附加到核心设备角色。

    3. 运行以下命令将策略附加到核心设备角色。Replace(替换) GreengrassV2TokenExchangeRole 使用核心设备的角色名称。您在安装 C Amazon IoT Greengrass ore 软件时指定了此角色名称。将策略ARN替换为上一步ARN中的策略。

      Linux or Unix
      aws iam attach-role-policy \\ --role-name GreengrassV2TokenExchangeRole \\ --policy-arn arn:aws:iam::123456789012:policy/MyGreengrassV2ComponentArtifactPolicy
      Windows Command Prompt (CMD)
      aws iam attach-role-policy ^ --role-name GreengrassV2TokenExchangeRole ^ --policy-arn arn:aws:iam::123456789012:policy/MyGreengrassV2ComponentArtifactPolicy
      PowerShell
      aws iam attach-role-policy ` --role-name GreengrassV2TokenExchangeRole ` --policy-arn arn:aws:iam::123456789012:policy/MyGreengrassV2ComponentArtifactPolicy

      如果命令没有输出,则表示成功了。核心设备现在可以访问您上传到此 S3 存储桶的项目。

  3. 将 Hello World Python 脚本构件上传到 S3 存储桶。

    运行以下命令将脚本上传到 Amazon IoT Greengrass 核心上存在脚本的存储桶中的相同路径。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。

    Linux or Unix
    aws s3 cp \ artifacts/com.example.HelloWorld/1.0.0/hello_world.py \ s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
    Windows Command Prompt (CMD)
    aws s3 cp ^ artifacts/com.example.HelloWorld/1.0.0/hello_world.py ^ s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
    PowerShell
    aws s3 cp ` artifacts/com.example.HelloWorld/1.0.0/hello_world.py ` s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

    upload:如果请求成功,该命令将输出以开头的行。

  4. 将工件的 Amazon S3 URI 添加到组件配方中。

    Amazon S3 URI 由存储桶名称和存储桶中项目对象的路径组成。您的脚本构件的 Amazon S3 URI URI 就是您在上一步中将该构件上传到的那个。这URI应该与以下示例类似。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。

    s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

    要将构件添加到配方中,请使用 Amazon S3 添加Artifacts包含结构的列表URI。

    JSON
    "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ]

    在文本编辑器中打开配方文件。

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano recipes/com.example.HelloWorld-1.0.0.json

    将神器添加到配方中。您的配方文件应与以下示例类似。

    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.HelloWorld", "ComponentVersion": "1.0.0", "ComponentDescription": "My first Amazon IoT Greengrass component.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "Message": "world" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "run": "python3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\"" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] }, { "Platform": { "os": "windows" }, "Lifecycle": { "run": "py -3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\"" }, "Artifacts": [ { "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] } ] }
    YAML
    Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

    在文本编辑器中打开配方文件。

    例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

    nano recipes/com.example.HelloWorld-1.0.0.yaml

    将神器添加到配方中。您的配方文件应与以下示例类似。

    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.HelloWorld ComponentVersion: '1.0.0' ComponentDescription: My first Amazon IoT Greengrass component. ComponentPublisher: Amazon ComponentConfiguration: DefaultConfiguration: Message: world Manifests: - Platform: os: linux Lifecycle: run: | python3 -u {artifacts:path}/hello_world.py "{configuration:/Message}" Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py - Platform: os: windows Lifecycle: run: | py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}" Artifacts: - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
  5. Amazon IoT Greengrass 从配方中创建组件资源。运行以下命令根据配方创建组件,该配方以二进制文件形式提供。

    JSON
    aws greengrassv2 create-component-version --inline-recipe fileb://recipes/com.example.HelloWorld-1.0.0.json
    YAML
    aws greengrassv2 create-component-version --inline-recipe fileb://recipes/com.example.HelloWorld-1.0.0.yaml

    如果请求成功,则响应类似于以下示例。

    { "arn": "arn:aws:greengrass:region:123456789012:components:com.example.HelloWorld:versions:1.0.0", "componentName": "com.example.HelloWorld", "componentVersion": "1.0.0", "creationTimestamp": "Mon Nov 30 09:04:05 UTC 2020", "status": { "componentState": "REQUESTED", "message": "NONE", "errors": {} } }

    arn从输出中复制,以便在下一步中检查组件的状态。

    注意

    你还可以在Amazon IoT Greengrass 控制台的 “组件” 页面上看到你的 Hello World 组件

  6. 验证组件是否已创建并已准备好部署。创建组件时,其状态为REQUESTED。然后, Amazon IoT Greengrass 验证该组件是否可部署。您可以运行以下命令来查询组件状态并验证您的组件是否可部署。arn用上一步ARN中的替换。

    aws greengrassv2 describe-component --arn "arn:aws:greengrass:region:123456789012:components:com.example.HelloWorld:versions:1.0.0"

    如果组件通过验证,则响应表明组件状态为DEPLOYABLE

    { "arn": "arn:aws:greengrass:region:123456789012:components:com.example.HelloWorld:versions:1.0.0", "componentName": "com.example.HelloWorld", "componentVersion": "1.0.0", "creationTimestamp": "2020-11-30T18:04:05.823Z", "publisher": "Amazon", "description": "My first Greengrass component.", "status": { "componentState": "DEPLOYABLE", "message": "NONE", "errors": {} }, "platforms": [ { "os": "linux", "architecture": "all" } ] }

你的 Hello World 组件现已在中可用 Amazon IoT Greengrass。您可以将其部署回此 Greengrass 核心设备或其他核心设备。