步驟 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 您的帳戶 ID AWS 區域 ,並將 region取代為您用於本教學課程的 。

    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物件URI的 S3。這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. 選擇 Next (下一步)

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

    5. 選擇 建立政策

    6. IAM主控台導覽功能表中,選擇角色,然後選擇核心裝置的角色名稱。您在安裝 AWS IoT Greengrass Core 軟體時指定此角色名稱。如果您未指定名稱,則預設為 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物件URI的 S3。

    4. 選擇建立元件

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

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

    您可以使用現有的 S3 儲存貯體,或執行下列命令來建立儲存貯體。此命令會使用您的 AWS 帳戶 ID 和 建立儲存貯體 AWS 區域 ,以形成唯一的儲存貯體名稱。123456789012 將 取代為您的 AWS 帳戶 ID,並將 AWS 區域 region取代為您用於本教學課程的 。

    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 Core 軟體時指定此角色名稱。將政策取代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 核心裝置或其他核心裝置。