View a markdown version of this page

步驟 5:在 AWS IoT Greengrass 服務中建立元件 - AWS IoT Greengrass

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

步驟 5:在 AWS IoT Greengrass 服務中建立元件

當您在核心裝置上完成元件的開發時,您可以將其 AWS IoT Greengrass 上傳至 中的 服務 AWS 雲端。您也可以直接在 AWS IoT Greengrass 主控台中建立元件。 AWS IoT Greengrass 提供元件管理服務,可託管您的元件,以便將元件部署到個別裝置或裝置機群。若要將元件上傳至 AWS IoT Greengrass 服務,請完成下列步驟:

  • 將元件成品上傳至 S3 儲存貯體。

  • 將每個成品的 Amazon Simple Storage Service (Amazon S3) URI 新增至元件配方。

  • AWS IoT Greengrass 從元件配方在 中建立元件。

在本節中,您可以在 Greengrass 核心裝置上完成這些步驟,將 Hello World 元件上傳至 AWS IoT Greengrass 服務。

  1. 使用您 AWS 帳戶中的 S3 儲存貯體來託管 AWS IoT Greengrass 元件成品。當您將元件部署到核心裝置時,裝置會從儲存貯體下載元件的成品。

    您可以使用現有的 S3 儲存貯體,也可以建立新的儲存貯體。

    1. 在 Amazon S3 主控台的儲存貯體下,選擇建立儲存貯體。

    2. 針對儲存貯體名稱,輸入唯一的儲存貯體名稱。例如,您可以使用 greengrass-component-artifacts-region-123456789012. 將 123456789012 取代 AWS 區域 為您在本教學課程中使用的 AWS 帳戶 ID 和區域。

    3. 針對AWS 區域,選取您用於本教學課程 AWS 的區域。

    4. 選擇建立儲存貯體。

    5. 在儲存貯體下,選擇您建立的儲存貯體,將hello_world.py指令碼上傳至儲存貯體中的artifacts/com.example.HelloWorld/1.0.0資料夾。如需將物件上傳至 S3 儲存貯體的資訊,請參閱《Amazon Simple Storage Service 使用者指南》中的上傳物件。

    6. 複製 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
  2. 允許核心裝置存取 S3 儲存貯體中的元件成品。

    每個核心裝置都有一個核心裝置 IAM 角色,允許它與 互動 AWS IoT 並將日誌傳送到 AWS 雲端。根據預設,此裝置角色不允許存取 S3 儲存貯體,因此您必須建立並連接允許核心裝置從 S3 儲存貯體擷取元件成品的政策。

    如果您裝置的角色已允許存取 S3 儲存貯體,您可以略過此步驟。否則,請建立允許存取的 IAM 政策,並將其連接到角色,如下所示:

    1. 在 IAM 主控台導覽功能表中,選擇政策,然後選擇建立政策。

    2. 在 JSON 標籤上,用以下政策取代預留位置內容。將 amzn-s3-demo-bucket 取代為 S3 儲存貯體的名稱,其中包含要下載的核心裝置元件成品。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*" } ] }
    3. 選擇下一步。

    4. 在政策詳細資訊區段中,針對名稱輸入 MyGreengrassV2ComponentArtifactPolicy。

    5. 選擇建立政策。

    6. 在 IAM 主控台導覽功能表中,選擇角色,然後選擇核心裝置的角色名稱。您在安裝 AWS IoT Greengrass 核心軟體時指定了此角色名稱。如果您未指定名稱,則預設值為 GreengrassV2TokenExchangeRole。

    7. 在許可下,選擇新增許可,然後選擇連接政策。

    8. 在新增許可頁面上,選取您建立MyGreengrassV2ComponentArtifactPolicy的政策旁的核取方塊,然後選擇新增許可。

  3. 使用元件配方在AWS IoT Greengrass 主控台中建立元件。

    1. 在AWS IoT Greengrass 主控台導覽功能表中,選擇元件,然後選擇建立元件。

    2. 在元件資訊下,選擇將配方輸入為 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" } ] } ] }
    3. 將每個Artifacts區段中的預留位置 URI 取代為hello_world.py物件的 S3 URI。

    4. 選擇建立元件。

    5. 在 com.example.HelloWorld 元件頁面上,確認元件的狀態為可部署。

上傳您的 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
  2. 允許核心裝置存取 S3 儲存貯體中的元件成品。

    每個核心裝置都有一個核心裝置 IAM 角色,允許它與 互動 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/*" } ] }
    2. 執行下列命令,從 中的政策文件建立政策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 將此政策連接至核心裝置角色。

    3. 執行下列命令,將政策連接至核心裝置角色。以核心裝置的角色名稱取代 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 儲存貯體的成品。

  3. 將 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:會輸出以 開頭的行。

  4. 將成品的 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" } ]

    在文字編輯器中開啟配方檔案。

    例如,在以 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

    在文字編輯器中開啟配方檔案。

    例如,在以 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
  5. 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 主控台的 元件頁面上看到 Hello World 元件。

  6. 確認元件已建立並準備好部署。當您建立元件時,其狀態為 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 核心裝置或其他核心裝置。