步骤 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。将 123456789012 替换为您在本Amazon教程中Amazon Web Services 区域使用的账户 ID 和地区

    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 应与以下示例类似。将 DOC-EXAMPLE-BUCKET 替换为 S3 存储桶的名称。

      s3://DOC-EXAMPLE-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 选项卡中,将占位符内容替换为以下策略。将 DOC-EXAMPLE-B UCKET 替换为包含要下载的组件工件的 S3 存储桶的名称。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" } ] }
    3. 请选择 Next(下一步)

    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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] } ] }
    3. 将每个Artifacts部分中的占位符 URI 替换为hello_world.py对象的 S3 URI。

    4. 选择创建组件

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

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

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

    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 存储桶中的所有文件。将 DOC-EXAMPLE-BUCKET 替换为 S3 存储桶的名称。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::DOC-EXAMPLE-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. 运行以下命令将策略附加到核心设备角色。将 GreenGrassV2 TokenExchangeRole 替换为核心设备的角色名称。您在安装 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核心上存在脚本的存储桶中的相同路径。将 DOC-EXAMPLE-BUCKET 替换为 S3 存储桶的名称。

    Linux or Unix
    aws s3 cp \ artifacts/com.example.HelloWorld/1.0.0/hello_world.py \ s3://DOC-EXAMPLE-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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

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

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

    Amazon S3 URI 由存储桶名称和存储桶中项目对象的路径组成。您的脚本构件的 Amazon S3 URI 就是您在上一步中将构件上传到的 URI。此 URI 应与以下示例类似。将 DOC-EXAMPLE-BUCKET 替换为 S3 存储桶的名称。

    s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py

    要将构件添加到配方中,请添加一个Artifacts包含带有 Amazon S3 URI 的结构的列表。

    JSON
    "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" } ] } ] }
    YAML
    Artifacts: - URI: s3://DOC-EXAMPLE-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://DOC-EXAMPLE-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://DOC-EXAMPLE-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 核心设备或其他核心设备。