本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
第 5 步:在 AWS IoT Greengrass 服务中创建组件
在核心设备上开发完组件后,您可以将其上传至 AWS Cloud中的 AWS IoT Greengrass 服务。您也可以直接在 AWS IoT Greengrass 控制台
-
将组件构件上传至 S3 存储桶。
-
将每个构件的 Amazon Simple Storage Service(Amazon S3)URI 添加到组件配方中。
-
根据组件配方在 AWS IoT Greengrass 中创建组件。
在本节中,您将在 Greengrass 核心设备上完成这些步骤,将 Hello World 组件上传至 AWS IoT Greengrass 服务。
-
在您的 AWS 账户中使用 S3 存储桶来托管 AWS IoT Greengrass 组件构件。当您将组件部署到核心设备时,设备会从存储桶中下载该组件的构件。
您可以使用现有的 S3 存储桶,也可以创建新存储桶。
-
在 Amazon S3 控制台
的存储桶下,选择创建存储桶。 -
对于配置,请输入唯一的存储桶名称。例如,您可以使用
greengrass-component-artifacts-。将region-123456789012123456789012替换为您的 AWS 账户 ID,将区域替换为您在本教程中使用的 AWS 区域。 -
对于 AWS 区域,请选择您在本教程中使用的 AWS 区域。
-
选择 创建存储桶 。
-
在存储桶下,选择您创建的存储桶,然后将
hello_world.py脚本上传至存储桶中的artifacts/com.example.HelloWorld/1.0.0文件夹。有关将对象上传至 S3 存储桶的更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的上传对象。 -
复制 S3 存储桶中
hello_world.py对象的 S3 URI。此 URI 应该类似于以下示例。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
-
-
允许核心设备访问 S3 存储桶中的组件构件。
每台核心设备都有一个核心设备 IAM 角色,允许其与 AWS IoT 进行交互并将日志发送到 AWS 云。默认情况下,此设备角色不允许访问 S3 存储桶,因此您必须创建并附加一个允许核心设备从 S3 存储桶检索组件构件的策略。
如果设备的角色已允许访问 S3 存储桶,则可跳过此步骤。否则,请创建允许访问的 IAM 策略并将其附加到该角色,如下所示:
-
在 IAM 控制台
的导航菜单中,选择策略,然后选择创建策略。 -
在 JSON 选项卡中,将占位符内容替换为以下策略。将 amzn-s3-demo-bucket 替换为包含供核心设备下载的组件构件的 S3 存储桶名称。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] } -
选择下一步。
-
在策略详细信息部分,对于名称,请输入
MyGreengrassV2ComponentArtifactPolicy。 -
选择创建策略。
-
在 IAM 控制台
导航菜单中,选择角色,然后选择核心设备的角色名称。您在安装 AWS IoT Greengrass Core 软件时指定了此角色名称。如果您未指定名称,则默认使用 GreengrassV2TokenExchangeRole。 -
在权限下,选择添加权限,然后选择附加策略。
-
在添加权限页面,选中与您创建的策略
MyGreengrassV2ComponentArtifactPolicy对应的复选框,然后选择添加权限。
-
-
使用组件配方在 AWS IoT Greengrass 控制台
中创建组件。 -
在 AWS IoT Greengrass 控制台
导航菜单中,选择组件,然后选择创建组件。 -
在组件信息下,选择以 JSON 格式输入配方。该占位符配方应该类似于以下示例。
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.HelloWorld", "ComponentVersion": "1.0.0", "ComponentDescription": "My first AWS 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" } ] } ] } -
将每个
Artifacts部分中的占位符 URI 替换为hello_world.py对象的 S3 URI。 -
选择创建组件。
-
在 com.example.HelloWorld 组件页面中,验证该组件的状态是否为可部署。
-
上传 Hello World 组件
-
在您的 AWS 账户中使用 S3 存储桶来托管 AWS IoT Greengrass 组件构件。当您将组件部署到核心设备时,设备会从存储桶中下载该组件的构件。
您可以使用现有 S3 存储桶,也可以运行以下命令以创建存储桶。此命令会使用您的 AWS 账户 ID 和 AWS 区域创建一个存储桶,形成一个唯一的存储桶名称。将
123456789012替换为您的 AWS 账户 ID,将区域替换为您在本教程中使用的 AWS 区域。aws s3 mb s3://greengrass-component-artifacts-123456789012-region如果请求成功,命令将输出以下信息。
make_bucket: greengrass-component-artifacts-123456789012-region -
允许核心设备访问 S3 存储桶中的组件构件。
每台核心设备都有一个核心设备 IAM 角色,允许其与 AWS IoT 进行交互并将日志发送至 AWS Cloud。默认情况下,此设备角色不允许访问 S3 存储桶,因此您必须创建并附加一个允许核心设备从 S3 存储桶检索组件构件的策略。
如果核心设备的角色已允许访问 S3 存储桶,则可跳过此步骤。否则,请创建允许访问的 IAM 策略并将其附加到该角色,如下所示:
-
创建一个名为
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/*" } ] } -
运行以下命令,从
component-artifact-policy.json中的策略文档创建策略。从输出中的策略元数据复制策略 Amazon 资源名称(ARN)。您将在下一步中使用此 ARN 来将此策略附加到核心设备角色。
-
运行以下命令以将策略附加到核心设备角色。将
GreengrassV2TokenExchangeRole替换为核心设备的角色名称。您在安装 AWS IoT Greengrass Core 软件时指定了此角色名称。将策略 ARN 替换为上一步中的 ARN。如果命令没有输出,则表示成功。核心设备现在可以访问您上传至 S3 存储桶的构件。
-
-
将 Hello World Python 脚本构件上传至 S3 存储桶。
运行以下命令,将脚本上传至与 AWS IoT Greengrass 核心中存在脚本的存储桶相同的路径。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。
如果请求成功,该命令将输出以
upload:开头的行。 -
将构件的 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 URI 结构的
Artifacts列表。 -
根据配方在 AWS IoT Greengrass 中创建组件。运行以下命令以根据以二进制文件形式提供的配方创建组件。
如果请求成功,响应类似如下示例。
{ "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,以便在下一步中检查组件的状态。注意
您还可以在 AWS IoT Greengrass 控制台
的组件页面上看到 Hello World 组件。 -
验证组件是否已创建且已准备好部署。创建组件后,其状态为
REQUESTED。然后,AWS 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 组件现已可在 AWS IoT Greengrass 中使用。您可以将其部署回此 Greengrass 核心设备或其它核心设备。