

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

# 开发 Amazon IoT Greengrass 组件
<a name="develop-greengrass-components"></a>

您可以在 Greengrass 核心设备上开发和测试组件。因此，您无需与 Amazon Web Services 云 交互即可创建和迭代 Amazon IoT Greengrass 软件。完成组件版本后，可以将其上传到 Amazon IoT Greengrass 云端，这样您和您的团队就可以将该组件部署到实例集中的其他设备上。有关如何部署组件的更多信息，请参阅 [将 Amazon IoT Greengrass 组件部署到设备](manage-deployments.md)。

每个组件都包含*配方*和*构件*。
+ <a name="component-recipe-definition"></a>**配方**

  每个组件都包含一个用于定义其元数据的配方文件。此配方还指定了组件的配置参数、组件依赖关系、生命周期和平台兼容性。组件生命周期指定了安装、运行和关闭组件时要运行的命令。有关更多信息，请参阅 [Amazon IoT Greengrass 组件配方参考](component-recipe-reference.md)。

  您可以用 [JSON](https://en.wikipedia.org/wiki/JSON) 或 [YAML](https://en.wikipedia.org/wiki/YAML) 格式定义配方。
+ <a name="component-artifacts-definition"></a>**构件**

  组件可以有任意数量的构件，即组件二进制文件。构件可以包括脚本、编译的代码、静态资源以及组件使用的任何其他文件。组件还可以使用组件依赖关系中的构件。

Amazon IoT Greengrass 提供了预构建组件，您可以在应用程序中使用这些组件并部署到您的设备上。例如，您可以使用流管理器组件将数据上传到各种 Amazon 服务，也可以使用 CloudWatch 指标组件将自定义指标发布到 Amazon CloudWatch。有关更多信息，请参阅 [Amazon 提供的组件](public-components.md)。

Amazon IoT Greengrass 整理了一份名为 Greengrass 软件目录的 Greengrass 组件索引。该目录跟踪 Greengrass 社区开发的 Greengrass 组件。您可以从该目录中下载、修改和部署组件来创建 Greengrass 应用程序。有关更多信息，请参阅 [社区组件](greengrass-software-catalog.md)。

Amazon IoT Greengrass Core 软件以系统用户和组的身份运行您在核心设备上配置的组件，例如 `ggc_user` 和 `ggc_group`。这意味着组件拥有该系统用户的权限。如果使用没有主目录的系统用户，那么组件将无法运行依赖主目录的命令或代码。例如，这意味着您不能使用 `pip install some-library --user` 命令来安装 Python 软件包。如果您按照[入门教程](getting-started.md)设置核心设备，那么您的系统用户则没有主目录。有关如何配置运行组件的用户和组的更多信息，请参阅 [配置运行组件的用户](configure-greengrass-core-v2.md#configure-component-user)。

**注意**  <a name="semver-note"></a>
<a name="semver-para"></a>Amazon IoT Greengrass 使用组件的语义版本。语义版本遵循 *major*.*minor*.*patch* 编号系统。例如，版本 `1.0.0` 表示组件的第一个主要版本。有关更多信息，请参阅[语义版本规范](https://semver.org/)。

**Topics**
+ [组件生命周期](#component-lifecycle)
+ [组件类型](#component-types)
+ [创建 Amazon IoT Greengrass 组件](create-components.md)
+ [使用本地部署测试 Amazon IoT Greengrass 组件](test-components.md)
+ [发布组件以部署到您的核心设备](publish-components.md)
+ [与 Amazon 服务交互](interact-with-aws-services.md)
+ [运行 Docker 容器](run-docker-container.md)
+ [Amazon IoT Greengrass 组件配方参考](component-recipe-reference.md)
+ [组件环境变量参考](component-environment-variables.md)

## 组件生命周期
<a name="component-lifecycle"></a>

*组件生命周期*定义了 Amazon IoT Greengrass Core 软件用于安装和运行组件的阶段。每个阶段都定义一个脚本和其他信息，用于指定组件的行为。例如，在安装组件时，Amazon IoT Greengrass Core 软件会运行该组件的 `install` 生命周期脚本。核心设备上的组件具有以下生命周期状态：
+ `NEW` – 组件的配方和构件已加载至核心设备，但未安装该组件。组件进入此状态后，它会运行其[安装脚本](component-recipe-reference.md#install-lifecycle-definition)。
+ `INSTALLED` – 该组件已安装于核心设备。组件在运行其[安装脚本](component-recipe-reference.md#install-lifecycle-definition)后进入此状态。
+ `STARTING` – 该组件在核心设备上启动。组件在运行其[安装脚本](component-recipe-reference.md#startup-lifecycle-definition)时进入此状态。如果启动成功，则组件进入 `RUNNING` 状态。
+ `RUNNING` – 该组件在核心设备上运行。当组件运行其[运行脚本](component-recipe-reference.md#run-lifecycle-definition)或启动脚本中有活跃的后台进程时，它就会进入此状态。
+ `FINISHED` – 组件成功运行并完成运行。
+ `STOPPING` – 组件停止运行。组件在运行其[关闭脚本](component-recipe-reference.md#shutdown-lifecycle-definition)时进入此状态。
+ `ERRORED` – 组件遇到错误。当组件进入此状态时，就会运行其[恢复脚本](component-recipe-reference.md#recover-lifecycle-definition)。然后，组件重启，尝试恢复正常运行。如果组件三次进入 `ERRORED` 状态而没有成功运行，则组件变为 `BROKEN`。
+ `BROKEN` – 组件多次遇到错误且无法恢复。您必须重新部署组件才能修复它。

## 组件类型
<a name="component-types"></a>

*组件类型*指定 Amazon IoT Greengrass Core 软件如何运行组件。组件包括以下类型：
+ **Nucleus** (`aws.greengrass.nucleus`)

  Greengrass Nucleus 是提供 Amazon IoT Greengrass Core 软件最低功能的组件。有关更多信息，请参阅 [Greengrass Nucleus](greengrass-nucleus-component.md)。
+ **插件** (`aws.greengrass.plugin`)

  Greengrass Nucleus 在与其相同的 Java 虚拟机（JVM）中运行该组件。当您在核心设备上更改此组件的版本时，核心会重新启动。要安装和运行插件组件，必须配置 Greengrass Nucleus，使其作为系统服务运行。有关更多信息，请参阅 [将 Greengrass Nucleus 配置为系统服务](configure-greengrass-core-v2.md#configure-system-service)。

  Amazon 提供的几个组件为插件组件，允许它们直接与 Greengrass Nucleus 交互。插件组件使用与 Greengrass Nucleus 相同的日志文件。有关更多信息，请参阅 [监控 Amazon IoT Greengrass 日志](monitor-logs.md)。
+ **通用** (`aws.greengrass.generic`)

  如果通用组件定义了生命周期，Greengrass Nucleus 会运行该组件的生命周期脚本。

  此类型是自定义组件的默认类型。
+ **Lambda** (`aws.greengrass.lambda`)

  Greengrass Nucleus 使用 [Lambda 启动程序组件](lambda-launcher-component.md)运行 Lambda 函数。

  当您从 Lambda 函数创建组件时，该组件包括此类型。有关更多信息，请参阅 [运行 Amazon Lambda 函数](run-lambda-functions.md)。

**注意**  <a name="recipe-component-type-recommendation"></a>
我们建议您不要在配方中指定组件类型。Amazon IoT Greengrass 会在您创建组件时为您设置类型。