

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

# 发布组件以部署到您的核心设备
<a name="publish-components"></a>

构建或完成组件版本后，可以将其发布到 AWS IoT Greengrass 服务。然后，可以将其部署到 Greengrass 核心设备。

如果您使用 [Greengrass 工具包 CLI（GDK CLI）](greengrass-development-kit-cli.md)[开发和构建](create-components.md)组件，则可以[使用 GDK CLI](#publish-component-gdk-cli) 将该组件发布到 AWS 云。否则，请[使用内置 Shell 命令和 AWS CLI](#publish-component-shell-commands) 发布组件。

您还可以使用 AWS CloudFormation 从模板创建组件和其他 AWS 资源。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[什么是AWS CloudFormation？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)和 [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-greengrassv2-componentversion.html)。

**Topics**
+ [发布组件（GDK CLI）](#publish-component-gdk-cli)
+ [发布组件（Shell 命令）](#publish-component-shell-commands)

## 发布组件（GDK CLI）
<a name="publish-component-gdk-cli"></a>

按照本节中的说明，使用 GDK CLI 发布组件。GDK CLI 将构建构件上传到 S3 存储桶，更新配方中的构件 URI，并根据配方创建组件。您可以在 [GDK CLI 配置文件](gdk-cli-configuration-file.md)中指定要使用的 S3 存储桶和区域。

<a name="gdk-cli-s3-bucket-name-formation"></a>如果您使用的是 GDK CLI v1.1.0 或更高版本，则可以指定 `--bucket` 参数来指定供 GDK CLI 上传组件构件的 S3 存储桶。<a name="gdk-cli-s3-bucket-name-formation-format"></a>如果未指定此参数，GDK CLI 会上传到名为 `bucket-region-accountId` 的 S3 存储桶，其中 *bucket* 和 *region* 是您在 `gdk-config.json` 中指定的值，*accountId* 是您的 AWS 账户 ID。如果存储桶不存在，GDK CLI 将创建该存储桶。

**重要**  <a name="publish-component-s3-bucket-token-exchange-role-permissions"></a>
默认情况下，核心设备角色不允许访问 S3 存储桶。如果这是您首次使用此 S3 存储桶，则必须向角色添加权限，才能允许核心设备从 S3 存储桶中检索组件构件。有关更多信息，请参阅 [允许访问 S3 存储桶中的组件构件](device-service-role.md#device-service-role-access-s3-bucket)。

**发布 Greengrass 组件（GDK CLI）**

1. 在命令提示符或终端中打开组件文件夹。

1. 如果没有 Greengrass 组件，请先构建。[component build](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-build) 命令在组件文件夹的 `greengrass-build` 文件夹中生成配方和构件。运行以下命令。

   ```
   gdk component build
   ```

1. 将该组件发布到 AWS 云。[组件发布](greengrass-development-kit-cli-component.md#greengrass-development-kit-cli-component-publish)命令将组件的构件上传到 Amazon S3，并使用每个构件的 URI 更新组件的配方。然后，它会在 AWS IoT Greengrass 服务中创建组件。
**注意**  <a name="publish-component-s3-bucket-artifact-digest-warning"></a>
AWS IoT Greengrass 在创建组件时计算每个构件的摘要。这意味着在创建组件后，无法修改 S3 存储桶中的构件文件。如果这样做，则包含此组件的部署会由于文件摘要不匹配而失败。如果修改构件文件，则必须创建新版本组件。

   如果您在 GDK CLI 配置文件中指定组件版本的 `NEXT_PATCH`，GDK CLI 会使用 AWS IoT Greengrass 服务中尚不存在的下一个补丁版本。

   运行以下命令。

   ```
   gdk component publish
   ```

   输出会显示 GDK CLI 创建的组件版本。

   发布组件后，可以将组件部署到核心设备。有关更多信息，请参阅 [将 AWS IoT Greengrass 组件部署到设备](manage-deployments.md)。

## 发布组件（Shell 命令）
<a name="publish-component-shell-commands"></a>

按照以下步骤使用 Shell 命令和 AWS Command Line Interface（AWS CLI）发布组件。发布组件时，您将执行以下操作：

1. 将组件构件发布到 S3 存储桶。

1. 将每个构件的 Amazon S3 URI 添加到组件配方。

1. 根据组件配方在 AWS IoT Greengrass 中创建组件版本。

**注意**  <a name="component-version-uniqueness-note"></a>
<a name="component-version-uniqueness-para"></a>您上传的每个组件版本都必须是唯一的。请务必上传正确的组件版本，因为上传后将无法对其进行编辑。

您可以按照以下步骤从开发计算机或 Greengrass 核心设备发布组件。

**发布组件（Shell 命令）**

1. 如果组件使用 AWS IoT Greengrass 服务中存在的版本，则必须更改该组件的版本。在文本编辑器中打开配方，增加版本并保存文件。选择反映您对组件所做更改的新版本。
**注意**  <a name="semver-note"></a>
<a name="semver-para"></a>AWS IoT Greengrass 使用组件的语义版本。语义版本遵循 *major*.*minor*.*patch* 编号系统。例如，版本 `1.0.0` 表示组件的第一个主要版本。有关更多信息，请参阅[语义版本规范](https://semver.org/)。

1. 如果组件有构件，请执行以下操作：

   1. 将组件构件发布到 AWS 账户 中的 S3 存储桶。
**提示**  <a name="artifact-path-tip"></a>
我们建议您在 S3 存储桶中构件的路径中包含组件名称和版本。此命名方案可以帮助您维护先前版本的组件所使用的构件，因此可以继续支持先前的组件版本。

      运行以下命令，将构件文件发布到 S3 存储桶。将 amzn-s3-demo-bucket 替换为存储的名称，然后将 *artifacts/com.example.HelloWorld/1.0.0/artifact.py* 替换为构件文件的路径。

      ```
      aws s3 cp artifacts/com.example.HelloWorld/1.0.0/artifact.py s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/artifact.py
      ```
**重要**  <a name="publish-component-s3-bucket-token-exchange-role-permissions"></a>
默认情况下，核心设备角色不允许访问 S3 存储桶。如果这是您首次使用此 S3 存储桶，则必须向角色添加权限，才能允许核心设备从 S3 存储桶中检索组件构件。有关更多信息，请参阅 [允许访问 S3 存储桶中的组件构件](device-service-role.md#device-service-role-access-s3-bucket)。

   1. 如果组件配方中不存在名为 `Artifacts` 的列表，请添加。每个清单中都会显示 `Artifacts` 列表，其中定义了组件在其支持的每个平台上的要求（或该组件对所有平台的默认要求）。

   1. 将每个构件添加到构件列表中，或更新现有构件的 URI。Amazon S3 URI 由存储桶名称和存储桶中构件对象的路径组成。构件的 Amazon S3 URI，应类似于以下示例。

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

   完成这些步骤后，您的配方应具有一个如下所示的 `Artifacts` 列表。

------
#### [ JSON ]

   ```
   {
     ...
     "Manifests": [
       {
         "Lifecycle": {
           ...
         },
         "Artifacts": [
           {
             "URI": "s3://amzn-s3-demo-bucket/artifacts/MyGreengrassComponent/1.0.0/artifact.py",
             "Unarchive": "NONE"
           }
         ]
       }
     ]
   }
   ```

**注意**  
您可以为 ZIP 构件添加 `"Unarchive": "ZIP"` 选项，以将 AWS IoT Greengrass Core 软件配置为在组件部署时解压缩构件。

------
#### [ YAML ]

   ```
   ...
   Manifests:
     - Lifecycle:
         ...
       Artifacts:
         - URI: s3://amzn-s3-demo-bucket/artifacts/MyGreengrassComponent/1.0.0/artifact.py
           Unarchive: NONE
   ```

**注意**  
您可以使用 `Unarchive: ZIP` 选项将 AWS IoT Greengrass Core 软件配置为在组件部署时解压缩 ZIP 构件。有关如何在组件中使用 ZIP 构件的更多信息，请参阅 [artifacts:decompressedPath 配方变量](component-recipe-reference.md#component-recipe-artifacts-decompressed-path)。

------

   有关配方的更多信息，请参阅[AWS IoT Greengrass 组件配方参考](component-recipe-reference.md)。

1. 使用 AWS IoT Greengrass 控制台从配方文件创建组件。

   运行以下命令，从配方文件创建组件。此命令创建组件，并将其作为私有 AWS IoT Greengrass 组件发布到您的 AWS 账户 中。将 *path/to/recipeFile* 替换为配方文件的路径。

   ```
   aws greengrassv2 create-component-version --inline-recipe fileb://path/to/recipeFile
   ```

   复制响应中的 `arn`，以便在下一步中检查组件的状态。
**注意**  <a name="publish-component-s3-bucket-artifact-digest-warning"></a>
AWS IoT Greengrass 在创建组件时计算每个构件的摘要。这意味着在创建组件后，无法修改 S3 存储桶中的构件文件。如果这样做，则包含此组件的部署会由于文件摘要不匹配而失败。如果修改构件文件，则必须创建新版本组件。

1. AWS IoT Greengrass 服务中的每个组件都有一个状态。运行以下命令，确认您在此过程中发布的组件版本的状态。将 *com.example.HelloWorld* 和 *1.0.0* 替换为要查询的组件版本。将 `arn` 替换为上一步中的 ARN。

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

   此操作将返回一个包含组件元数据的响应。元数据中含有一个包含组件状态和任何错误（如果适用）的 `status` 对象。

   组件状态为 `DEPLOYABLE` 时，可以将组件部署到设备。有关更多信息，请参阅 [将 AWS IoT Greengrass 组件部署到设备](manage-deployments.md)。