Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
第 4 步:在设备上开发和测试组件
组件是在 Amazon IoT Greengrass 核心设备上运行的软件模块。组件使您能够将复杂应用程序作为离散的构建块来创建和管理这些应用程序,您可以将这些应用程序从一个 Greengrass 核心设备重复使用到另一个 Greengrass 核心设备。每个组件都由配方和工件组成。
借助 Amazon IoT Greengrass,您可以使用 Greengrass CLI 在 Greengrass 核心设备上本地开发和测试组件,而无需与云端交互。 Amazon 完成本地组件后,您可以使用组件配方和工件在 Amazon 云端的 Amazon IoT Greengrass 服务中创建该组件,然后将其部署到所有 Greengrass 核心设备上。有关组件的更多信息,请参阅开发Amazon IoT Greengrass组件。
在本节中,您将学习如何在核心设备上本地创建和运行基本的 Hello World 组件。
在您的设备上开发 Hello World 组件
-
为您的组件创建一个文件夹,其中包含用于存放配方和工件的子文件夹。在 Greengrass 核心设备上运行以下命令来创建这些文件夹并切换到组件文件夹。将 ~/greengrassv2 或 %USERPROFILE%\ greengrassv2
替换为用于本地开发的文件夹的路
径。
- Linux or Unix
-
mkdir -p ~/greengrassv2
/{recipes,artifacts}
cd ~/greengrassv2
- Windows Command Prompt (CMD)
-
mkdir %USERPROFILE%\greengrassv2
\\recipes, %USERPROFILE%\greengrassv2
\\artifacts
cd %USERPROFILE%\greengrassv2
- PowerShell
-
mkdir ~/greengrassv2
/recipes, ~/greengrassv2
/artifacts
cd ~/greengrassv2
-
使用文本编辑器创建用于定义组件元数据、参数、依赖关系、生命周期和平台功能的配方文件。在配方文件名中包含组件版本,这样您就可以确定哪个配方反映了哪个组件版本。你可以为你的食谱选择 YAML 或 JSON 格式。
例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。
- JSON
-
nano recipes/com.example.HelloWorld
-1.0.0
.json
- YAML
-
nano recipes/com.example.HelloWorld
-1.0.0
.yaml
Amazon IoT Greengrass 使用组件的语义版本。语义版本遵循 major.minor.patch 编号系统。例如,版本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}"
}
},
{
"Platform": {
"os": "windows"
},
"Lifecycle": {
"run": "py -3 -u {artifacts:path}/hello_world.py {configuration:/Message}"
}
}
]
}
- 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}"
- Platform:
os: windows
Lifecycle:
run: |
py -3 -u {artifacts:path}/hello_world.py "{configuration:/Message}"
此食谱的ComponentConfiguration
部分定义了一个默认为的参数world
。Message
该Manifests
部分定义了一个清单,它是一组适用于平台的生命周期指令和工件。例如,您可以定义多个清单,为不同的平台指定不同的安装说明。在清单中,该Lifecycle
部分指示 Greengrass 核心设备以参数值作为参数运行 Hello World 脚本。Message
-
运行以下命令为组件工件创建文件夹。
- Linux or Unix
-
mkdir -p artifacts/com.example.HelloWorld/1.0.0
- Windows Command Prompt (CMD)
-
mkdir artifacts\com.example.HelloWorld\1.0.0
- PowerShell
-
mkdir artifacts\com.example.HelloWorld\1.0.0
必须使用以下格式作为对象文件夹路径。包括您在配方中指定的组件名称和版本。
artifacts/componentName
/componentVersion
/
-
使用文本编辑器为你的 Hello World 组件创建 Python 脚本构件文件。
例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。
nano artifacts/com.example.HelloWorld/1.0.0/hello_world.py
将以下 Python 脚本复制并粘贴到文件中。
import sys
message = "Hello, %s!" % sys.argv[1]
# Print the message to stdout, which Greengrass saves in a log file.
print(message)
-
使用本地 Amazon IoT Greengrass CLI 来管理 Greengrass 核心设备上的组件。
运行以下命令将组件部署到内 Amazon IoT Greengrass 核。将/greengrass/v2
或 C:\greengrass\v2
替换为你的 Amazon IoT Greengrass V2 根文件夹,将 ~/greengrassv2 或 %USER
PROFILE%\ greengrassv2
替换为你的组件开发文件夹。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli deployment create \
--recipeDir ~/greengrassv2
/recipes \
--artifactDir ~/greengrassv2
/artifacts \
--merge "com.example.HelloWorld=1.0.0"
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli deployment create ^
--recipeDir %USERPROFILE%\greengrassv2
\recipes ^
--artifactDir %USERPROFILE%\greengrassv2
\artifacts ^
--merge "com.example.HelloWorld=1.0.0"
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli deployment create `
--recipeDir ~/greengrassv2
/recipes `
--artifactDir ~/greengrassv2
/artifacts `
--merge "com.example.HelloWorld=1.0.0"
此命令添加了在中使用配方recipes
和中的 Python 脚本的组件artifacts
。该--merge
选项添加或更新您指定的组件和版本。
-
Amazon IoT Greengrass Core 软件将组件进程中的 stdout 保存到文件夹中的日志文件中。logs
运行以下命令以验证 Hello World 组件是否运行并打印消息。
- Linux or Unix
-
sudo tail -f /greengrass/v2
/logs/com.example.HelloWorld.log
- Windows Command Prompt (CMD)
-
type C:\greengrass\v2
\logs\com.example.HelloWorld.log
该type
命令将文件内容写入终端。多次运行此命令以观察文件中的更改。
- PowerShell
-
gc C:\greengrass\v2
\logs\com.example.HelloWorld.log -Tail 10 -Wait
您应该会看到类似于以下示例的消息。
Hello, world!
如果文件不存在,则本地部署可能尚未完成。如果文件在 15 秒内不存在,则部署可能失败。例如,如果您的食谱无效,则可能会发生这种情况。运行以下命令查看 Amazon IoT Greengrass 核心日志文件。此文件包含来自 Greengrass 核心设备部署服务的日志。
- Linux or Unix
-
sudo tail -f /greengrass/v2
/logs/greengrass.log
- Windows Command Prompt (CMD)
-
type C:\greengrass\v2
\logs\greengrass.log
该type
命令将文件内容写入终端。多次运行此命令以观察文件中的更改。
- PowerShell
-
gc C:\greengrass\v2
\logs\greengrass.log -Tail 10 -Wait
-
修改本地组件以迭代和测试您的代码。hello_world.py
在文本编辑器中打开,然后在第 4 行添加以下代码以编辑 Amazon IoT Greengrass 核心记录的消息。
message += " Greetings from your first Greengrass component."
现在,该hello_world.py
脚本应该包含以下内容。
import sys
message = "Hello, %s!" % sys.argv[1]
message += " Greetings from your first Greengrass component."
# Print the message to stdout, which Greengrass saves in a log file.
print(message)
-
运行以下命令,使用所做的更改更新组件。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli deployment create \
--recipeDir ~/greengrassv2
/recipes \
--artifactDir ~/greengrassv2
/artifacts \
--merge "com.example.HelloWorld=1.0.0"
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli deployment create ^
--recipeDir %USERPROFILE%\greengrassv2
\recipes ^
--artifactDir %USERPROFILE%\greengrassv2
\artifacts ^
--merge "com.example.HelloWorld=1.0.0"
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli deployment create `
--recipeDir ~/greengrassv2
/recipes `
--artifactDir ~/greengrassv2
/artifacts `
--merge "com.example.HelloWorld=1.0.0"
此命令使用最新的 Hello World 工件更新com.example.HelloWorld
组件。
-
运行以下命令以重新启动组件。重新启动组件时,核心设备将使用最新的更改。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli component restart \
--names "com.example.HelloWorld"
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli component restart ^
--names "com.example.HelloWorld"
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli component restart `
--names "com.example.HelloWorld"
-
再次检查日志,验证 Hello World 组件是否打印了新消息。
- Linux or Unix
-
sudo tail -f /greengrass/v2
/logs/com.example.HelloWorld.log
- Windows Command Prompt (CMD)
-
type C:\greengrass\v2
\logs\com.example.HelloWorld.log
该type
命令将文件内容写入终端。多次运行此命令以观察文件中的更改。
- PowerShell
-
gc C:\greengrass\v2
\logs\com.example.HelloWorld.log -Tail 10 -Wait
您应该会看到类似于以下示例的消息。
Hello, world! Greetings from your first Greengrass component.
-
您可以更新组件的配置参数以测试不同的配置。部署组件时,可以指定配置更新,该更新定义了如何在核心设备上修改组件的配置。您可以指定要重置为默认值的配置值以及要合并到核心设备上的新配置值。有关更多信息,请参阅更新组件配置。
执行以下操作:
-
使用文本编辑器创建名hello-world-config-update.json
为的文件以包含配置更新
例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。
nano hello-world-config-update.json
-
将以下 JSON 对象复制并粘贴到文件中。此 JSON 对象定义了配置更新,该更新friend
将值合并到Message
参数以更新其值。此配置更新未指定任何要重置的值。您无需重置Message
参数,因为合并更新会替换现有值。
{
"com.example.HelloWorld": {
"MERGE": {
"Message": "friend"
}
}
}
-
运行以下命令将配置更新部署到 Hello World 组件。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli deployment create \
--merge "com.example.HelloWorld=1.0.0" \
--update-config hello-world-config-update.json
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli deployment create ^
--merge "com.example.HelloWorld=1.0.0" ^
--update-config hello-world-config-update.json
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli deployment create `
--merge "com.example.HelloWorld=1.0.0" `
--update-config hello-world-config-update.json
-
再次检查日志,验证 Hello World 组件是否输出了新消息。
- Linux or Unix
-
sudo tail -f /greengrass/v2
/logs/com.example.HelloWorld.log
- Windows Command Prompt (CMD)
-
type C:\greengrass\v2
\logs\com.example.HelloWorld.log
该type
命令将文件内容写入终端。多次运行此命令以观察文件中的更改。
- PowerShell
-
gc C:\greengrass\v2
\logs\com.example.HelloWorld.log -Tail 10 -Wait
您应该会看到类似于以下示例的消息。
Hello, friend! Greetings from your first Greengrass component.
-
测试完组件后,将其从核心设备中移除。运行以下命令。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli deployment create --remove="com.example.HelloWorld"
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli deployment create --remove="com.example.HelloWorld"
将组件上传到核心设备后,需要执行此步骤才能将其部署回核心设备 Amazon IoT Greengrass。否则,部署会因版本兼容性错误而失败,因为本地部署指定了不同的组件版本。
运行以下命令并确认该com.example.HelloWorld
组件未出现在设备上的组件列表中。
- Linux or Unix
-
sudo /greengrass/v2
/bin/greengrass-cli component list
- Windows Command Prompt (CMD)
-
C:\greengrass\v2
\bin\greengrass-cli component list
- PowerShell
-
C:\greengrass\v2
\bin\greengrass-cli component list
你的 Hello World 组件已完成,你现在可以将其上传到 Amazon IoT Greengrass 云服务了。然后,您可以将该组件部署到 Greengrass 核心设备上。