

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

# 步骤 5：在 AWS IoT Greengrass 服务中创建您的组件
<a name="upload-first-component"></a>

在核心设备上开发完组件后，您可以将其上传至 AWS 云中的 AWS IoT Greengrass 服务。您也可以直接在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)中创建组件。 AWS IoT Greengrass 提供托管组件的组件管理服务，以便您可以将它们部署到单个设备或设备实例集中。要将组件上传到 AWS IoT Greengrass 服务，请完成以下步骤：
+ 将组件构件上传至 S3 存储桶。
+ 将每个构件的 Amazon Simple Storage Service（Amazon S3）URI 添加到组件配方中。
+  AWS IoT Greengrass 从组件配方中创建组件。

在本节中，您将在 Greengrass 核心设备上完成这些步骤，将 Hello World 组件上传到该服务。 AWS IoT Greengrass 

## 在 AWS IoT Greengrass （控制台）中创建您的组件
<a name="upload-first-component-console"></a>

1. 在您的 AWS 账户中使用一个 S3 存储桶来托管 AWS IoT Greengrass 组件项目。当您将组件部署到核心设备时，设备会从存储桶中下载该组件的构件。

   您可以使用现有的 S3 存储桶，也可以创建新存储桶。

   1. 在 [Amazon S3 控制台](https://console.aws.amazon.com/s3)的**存储桶**下，选择**创建存储桶**。

   1. 对于**配置**，请输入唯一的存储桶名称。例如，您可以使用 **greengrass-component-artifacts-*region*-*123456789012***。*123456789012*替换为您的 AWS 账户 ID *region* 和您在本教程中 AWS 区域 使用的账户 ID。

   1. 对于**AWS 区域**，请选择您用于本教程的 AWS 区域。

   1. 选择 **创建存储桶 **。

   1. 在**存储桶**下，选择您创建的存储桶，然后将 `hello_world.py` 脚本上传至存储桶中的 `artifacts/com.example.HelloWorld/1.0.0` 文件夹。有关将对象上传至 S3 存储桶的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[上传对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html)。

   1. 复制 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
      ```

1. <a name="core-device-allow-s3-bucket-access-console"></a><a name="core-device-allow-s3-bucket-access-console-intro-1"></a>允许核心设备访问 S3 存储桶中的组件构件。

   <a name="core-device-allow-s3-bucket-access-console-intro-2"></a>每台核心设备都有一个[核心设备 IAM 角色](device-service-role.md)，允许其与云进行交互 AWS IoT 并将日志发送到 AWS 云端。默认情况下，此设备角色不允许访问 S3 存储桶，因此您必须创建并附加一个允许核心设备从 S3 存储桶检索组件构件的策略。

   <a name="core-device-allow-s3-bucket-access-console-intro-3"></a>如果设备的角色已允许访问 S3 存储桶，则可跳过此步骤。否则，请创建允许访问的 IAM 策略并将其附加到该角色，如下所示：

   1. <a name="core-device-allow-s3-bucket-access-console-step-1"></a>在 [IAM 控制台](https://console.aws.amazon.com/iam)的导航菜单中，选择**策略**，然后选择**创建策略**。

   1. <a name="core-device-allow-s3-bucket-access-console-step-2"></a>在 **JSON** 选项卡中，将占位符内容替换为以下策略。将 amzn-s3-demo-bucket 替换为包含供核心设备下载的组件构件的 S3 存储桶名称。

      ```
      {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
          }
        ]
      }
      ```

   1. <a name="core-device-allow-s3-bucket-access-console-step-3"></a>选择**下一步**。

   1. <a name="core-device-allow-s3-bucket-access-console-step-4"></a>在**策略详细信息部分**，对于**名称**，请输入 **MyGreengrassV2ComponentArtifactPolicy**。

   1. <a name="core-device-allow-s3-bucket-access-console-step-5"></a>选择**创建策略**。

   1. <a name="core-device-allow-s3-bucket-access-console-step-6"></a>在 [IAM 控制台](https://console.aws.amazon.com/iam)导航菜单中，选择**角色**，然后选择核心设备的角色名称。您在安装 C AWS IoT Greengrass ore 软件时指定了此角色名称。如果您未指定名称，则默认使用 `GreengrassV2TokenExchangeRole`。

   1. <a name="core-device-allow-s3-bucket-access-console-step-7"></a>在**权限**下，选择**添加权限**，然后选择**附加策略**。

   1. <a name="core-device-allow-s3-bucket-access-console-step-8"></a>在**添加权限**页面，选中与您创建的策略 `MyGreengrassV2ComponentArtifactPolicy` 对应的复选框，然后选择**添加权限**。

1. 使用组件配方在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)中创建组件。

   1. 在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)导航菜单中，选择**组件**，然后选择**创建组件**。

   1. 在**组件信息**下，选择**以 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"
              }
            ]
          }
        ]
      }
      ```

   1. 将每个 `Artifacts` 部分中的占位符 URI 替换为 `hello_world.py` 对象的 S3 URI。

   1. 选择**创建组件**。

   1. 在 **com.example 上。 HelloWorld**组件页面上，验证组件的**状态**是否为**可部署**。

## 在 AWS IoT Greengrass (AWS CLI) 中创建你的组件
<a name="upload-first-component-cli"></a>

**上传 Hello World 组件**

1. 使用您的中的 S3 存储桶 AWS 账户 来托管 AWS IoT Greengrass 组件项目。当您将组件部署到核心设备时，设备会从存储桶中下载该组件的构件。

   您可以使用现有 S3 存储桶，也可以运行以下命令以创建存储桶。此命令使用您的 AWS 账户 ID 创建一个存储桶 AWS 区域 ，并形成一个唯一的存储桶名称。*123456789012*用你的 AWS 账户 ID 和*region*你在本教程 AWS 区域 中使用的 ID 替换。

   ```
   aws s3 mb s3://greengrass-component-artifacts-123456789012-region
   ```

   如果请求成功，命令将输出以下信息。

   ```
   make_bucket: greengrass-component-artifacts-123456789012-region
   ```

1. <a name="core-device-allow-s3-bucket-access-cli"></a>允许核心设备访问 S3 存储桶中的组件构件。

   每台核心设备都有一个[核心设备 IAM 角色](device-service-role.md)，允许其与核心设备交互 AWS IoT 并向其发送日志 AWS 云。默认情况下，此设备角色不允许访问 S3 存储桶，因此您必须创建并附加一个允许核心设备从 S3 存储桶检索组件构件的策略。

   如果核心设备的角色已允许访问 S3 存储桶，则可跳过此步骤。否则，请创建允许访问的 IAM 策略并将其附加到该角色，如下所示：

   1. 创建一个名为 `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/*"
          }
        ]
      }
      ```

   1. 运行以下命令，从 `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 来将此策略附加到核心设备角色。

   1. 运行以下命令以将策略附加到核心设备角色。*GreengrassV2TokenExchangeRole*替换为核心设备的角色名称。您在安装 C AWS 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 存储桶的构件。

1. 将 Hello World Python 脚本构件上传至 S3 存储桶。

   运行以下命令将脚本上传到 AWS IoT Greengrass 核心上存在脚本的存储桶中的相同路径。将 amzn-s3-demo-bucket 替换为 S3 存储桶的名称。

------
#### [ Linux or Unix ]

   ```
   aws s3 cp \
     artifacts/com.example.HelloWorld/1.0.0/hello_world.py \
     s3://amzn-s3-demo-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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
   ```

------

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

1. 将构件的 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` 列表。

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

   ```
   "Artifacts": [
     {
       "URI": "s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py"
     }
   ]
   ```

   在文本编辑器中打开配方文件。

   <a name="nano-command-intro"></a>例如，在基于 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 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"
           }
         ]
       }
     ]
   }
   ```

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

   ```
   Artifacts:
     - URI: s3://amzn-s3-demo-bucket/artifacts/com.example.HelloWorld/1.0.0/hello_world.py
   ```

   在文本编辑器中打开配方文件。

   <a name="nano-command-intro"></a>例如，在基于 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 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
   ```

------

1.  AWS 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`，以便在下一步中检查组件的状态。
**注意**  
您还可以在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com/greengrass)的**组件**页面上看到 Hello World 组件。

1. 验证组件是否已创建且已准备好部署。创建组件后，其状态为 `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 核心设备或其它核心设备。