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

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

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

完成核心裝置上的元件開發後,您可以將它上傳到 AWS 雲端. AWS IoT Greengrass 您也可以直接在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. Replace (取代) 123456789012 使用您的 AWS 帳戶 ID 和 region 與您 AWS 區域 在本教程中使用的。

    3. 對於「AWS 區域」,請選取您在此自學課程中使用的「 AWS 區域」。

    4. 選擇建立儲存貯體

    5. 在「值區」下,選擇您建立的值區,然後將指hello_world.py令碼上傳至值區中的artifacts/com.example.HelloWorld/1.0.0資料夾。如需將物件上傳到 S3 儲存貯體的相關資訊,請參閱 Amazon 簡單儲存服務使用者指南中的上傳物件

    6. 複製 S3 儲存貯體中hello_world.py物件URI的 S3。這看起來URI應該類似於下面的例子。將 amzn-S3-示範儲存貯體取代為 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-示範儲存貯體取代為 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 上。例如。 HelloWorld「元件」頁面上,確認元件的「狀態」 是否為可建置

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

    您可以使用現有的 S3 儲存貯體,或執行下列命令來建立儲存貯體。此指令會使用您的 AWS 帳戶 ID 建立值區,並形 AWS 區域 成唯一的值區名稱。Replace (取代) 123456789012 使用您的 AWS 帳戶 身份證和 region 與您 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-示範儲存貯體取代為 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 資源名稱 (ARN)。您可ARN以在下一個步驟中使用此原則將此原則附加至核心裝置角色。

    3. 執行下列命令,將原則附加至核心裝置角色。Replace (取代) 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. 上傳你好世界 Python 腳本工件到 S3 存儲桶。

    執行下列命令,將指令碼上傳至 AWS IoT Greengrass 核心中指令碼所在值區中的相同路徑。將 amzn-S3-示範儲存貯體取代為 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-示範儲存貯體取代為 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" } ]

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

    例如,在 Linux 系統上,您可以執行下列命令來使用 GNU nano 來建立檔案。

    nano recipes/com.example.HelloWorld-1.0.0.json

    將神器添加到配方中。您的 recipe 檔案看起來應該類似於下列範例。

    { "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

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

    例如,在 Linux 系統上,您可以執行下列命令來使用 GNU nano 來建立檔案。

    nano recipes/com.example.HelloWorld-1.0.0.yaml

    將神器添加到配方中。您的 recipe 檔案看起來應該類似於下列範例。

    --- 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 從方案中建立元件資源。執行下列命令,從 recipe (您提供為二進位檔案) 建立元件。

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