

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 步驟 5：在 AWS IoT Greengrass 服務中建立元件
<a name="upload-first-component"></a>

當您在核心裝置上完成元件的開發時，您可以將其 AWS IoT Greengrass 上傳至 中的 服務 AWS 雲端。您也可以直接在 [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 區域 為您在本教學課程中使用的 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)導覽功能表中，選擇**角色**，然後選擇核心裝置的角色名稱。您在安裝 AWS IoT Greengrass 核心軟體時指定了此角色名稱。如果您未指定名稱，則預設值為 `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 AWS 區域 和*區域*。

   ```
   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 Resource Name (ARN)。您可以在下一個步驟中使用此 ARN 將此政策連接至核心裝置角色。

   1. 執行下列命令，將政策連接至核心裝置角色。以核心裝置的角色名稱取代 *GreengrassV2TokenExchangeRole*。您在安裝 AWS IoT Greengrass 核心軟體時指定了此角色名稱。將政策 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
   ```

   若要將成品新增至配方，請新增包含具有 `Artifacts` Amazon S3 URI 結構的 清單。

------
#### [ 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 核心裝置或其他核心裝置。