運行碼頭容器 - AWS IoT Greengrass

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

運行碼頭容器

您可以將 AWS IoT Greengrass 元件設定為從儲存在下列位置的映像執行 Docker 容器:

  • Amazon Elastic Container Registry (Amazon ECR) 中的公共和私有映像存儲庫

  • 公共碼頭集線器存儲庫

  • 公共碼頭信任的註冊表

  • S3 儲存貯體

在您的自訂元件中,包含 Docker 映像 URI 作為成品,以擷取映像並在核心裝置上執行。對於 Amazon ECR 和 Docker Hub 映像,您可以使用 Doc ker 應用程式管理員元件下載映像並管理私有 Amazon ECR 儲存庫的登入資料。

要求

要在組件中運行 Docker 容器,您需要以下內容:

  • 一個 Greengrass 核心設備。如果您沒有帳戶,請參閱 教學課程:AWS IoT Greengrass V2 入門

  • 碼頭引擎 1.9.1 或更高版本安裝在 Greengrass 核心設備上。版本 20.10 是經過驗證可與 AWS IoT Greengrass 核心軟件配合使用的最新版本。在部署執行 Docker 容器的元件之前,您必須直接在核心裝置上安裝 Docker。

    提示

    您也可以將核心裝置設定為在元件安裝時安裝 Docker Engine。例如,下列安裝指令碼會在載入 Docker 映像檔之前先安裝 Docker 引擎。此安裝腳本適用於基於 Debian 的 Linux 發行版,例如 Ubuntu。如果您將元件設定為使用此命令安裝 Docker Engine,您可能需要在生命週期指令碼trueRequiresPrivilege將設定為,才能執行安裝和命docker令。如需詳細資訊,請參閱 AWS IoT Greengrass 元件配方參考

    apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  • 執行 Docker 容器元件的系統使用者必須具有根或系統管理員權限,或者您必須將 Docker 設定為以非 root 使用者或非管理員使用者的身分執行。

    • 在 Linux 裝置上,您可以將使用者新增至docker群組,以便在不使用的情況下呼叫docker指令sudo

    • 在 Windows 裝置上,您可以將使用者新增至docker-users群組,以便在沒有系統管理員權限的情況下呼叫docker命令。

    Linux or Unix

    若要將ggc_user您用來執行 Docker 容器元件的非 root 使用者新增至docker群組,請執行下列命令。

    sudo usermod -aG docker ggc_user

    如需詳細資訊,請參閱以非 root 使用者身分管理 Docker

    Windows Command Prompt (CMD)

    若要將ggc_user或您用來執行 Docker 容器元件的使用者新增至docker-users群組,請以系統管理員身分執行下列命令。

    net localgroup docker-users ggc_user /add
    Windows PowerShell

    若要將ggc_user或您用來執行 Docker 容器元件的使用者新增至docker-users群組,請以系統管理員身分執行下列命令。

    Add-LocalGroupMember -Group docker-users -Member ggc_user
  • 裝載為 Docker 容器容器中的磁碟區的 Docker 容器元件存取的檔案。

  • 如果您將 AWS IoT Greengrass Core 軟體設定為使用網路 Proxy,則必須將 Docker 設定為使用相同的 Proxy 伺服器

除了這些需求之外,如果這些需求適用於您的環境,您還必須符合下列需求:

  • 若要使用 Docker 撰寫來建立和啟動您的 Docker 容器,請在 Greengrass 核心裝置上安裝 Docker 撰寫,然後將您的碼頭撰寫檔案上傳到 S3 儲存貯體。您必須將撰寫檔案存放在 S3 儲存貯體中 AWS 帳戶 與 AWS 區域 元件相同的儲存貯體中。若要取得在自訂元件中使用docker-compose up指令的範例,請參閱〈〉從 Amazon ECR 或碼頭集線器中的公共映像運行碼頭容器

  • 如果您在網路代理伺服器 AWS IoT Greengrass 後方執行,請將 Docker 常駐程式設定為使用代理伺服器

  • 如果您的 Docker 映像檔儲存在 Amazon ECR 或 Docker 集線器中,請在 Docker 容器元件中加入 Docker 元件管理員元件做為相依性。在部署元件之前,您必須在核心裝置上啟動 Docker 精靈。

    此外,請將影像 URI 納入為元件加工品。影像 URI 的格式必須docker:registry/image[:tag|@digest]如下列範例所示:

    • 私人 Amazon ECR 圖片:docker:account-id.dkr.ecr.region.amazonaws.com/repository/image[:tag|@digest]

    • 公共 Amazon ECR 圖片:docker:public.ecr.aws/repository/image[:tag|@digest]

    • 公共碼頭集線器映像:docker:name[:tag|@digest]

    有關從存儲在公共存儲庫中的映像運行 Docker 容器的更多信息,請參閱從 Amazon ECR 或碼頭集線器中的公共映像運行碼頭容器

  • 如果您的 Docker 映像檔儲存在 Amazon ECR 私有儲存庫中,則您必須將權杖交換服務元件作為 Docker 容器元件的相依性包含在 Docker 容器元件中。此外,Greengrass 裝置角色必須允許ecr:GetAuthorizationToken、和ecr:GetDownloadUrlForLayer動作ecr:BatchGetImage,如下列範例 IAM 政策所示。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    如需從 Amazon ECR 私有儲存庫中儲存的映像執行 Docker 容器的相關資訊,請參閱。從 Amazon ECR 中的私有映像運行碼頭集裝箱

  • 若要使用存放在 Amazon ECR 私有儲存庫中的 Docker 映像檔,私有存放庫必須與核心裝置位於 AWS 區域 相同。

  • 如果您的 Docker 映像或撰寫檔案儲存在 S3 儲存貯體中,Greengrass 裝置角色必須允許許s3:GetObject可允許核心裝置將映像下載為元件成品,如下列範例 IAM 政策所示。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject" ], "Resource": [ "*" ], "Effect": "Allow" } ] }

    如需從 Amazon S3 中存放的映像執行 Docker 容器的相關資訊,請參閱從 Amazon S3 中的映像運行碼頭集裝箱

  • 若要在 Docker 容器元件中使用處理序間通訊 (IPC)、 AWS 認證或串流管理員,您必須在執行 Docker 容器時指定其他選項。如需詳細資訊,請參閱下列內容:

從 Amazon ECR 或碼頭集線器中的公共映像運行碼頭容器

本節說明如何建立使用碼頭構成的自訂元件,從存放 Amazon ECR 和碼頭集線器的 Docker 映像執行碼頭容器。

使用碼頭構成運行碼頭容器
  1. 建立碼頭撰寫檔案並將其上傳到 Amazon S3 儲存貯體。請確定 Greengrass 裝置角色允許允許裝置存取撰寫檔案的s3:GetObject權限。下列範例中顯示的範例撰寫檔案包括來自 Amazon ECR 的 Amazon CloudWatch 代理程式映像以及來自碼頭集線器的 MySQL 映像。

    version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
  2. 在 AWS IoT Greengrass 核心裝置上建立自訂元件。下列範例中顯示的範例配方具有下列屬性:

    • Docker 應用程序管理器組件作為依賴關係。此元件可 AWS IoT Greengrass 讓您從公有的 Amazon ECR 和碼頭集線器儲存庫下載映像檔。

    • 在公用 Amazon ECR 儲存庫中指定 Docker 映像的元件成品。

    • 在公用 Docker Hub 儲存庫中指定 Docker 映像檔的元件人工因素。

    • 一種元件人工因素,指定 Docker 撰寫檔案,其中包含您要執行的 Docker 映像的容器。

    • 一個生命週期運行腳本,使用 docker-compose 最多從指定的映像創建和啟動容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyDockerComposeComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker-compose -f {artifacts:path}/docker-compose.yaml up" }, "Artifacts": [ { "URI": "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" }, { "URI": "docker:mysql:8.0" }, { "URI": "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyDockerComposeComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that uses Docker Compose to run images from public Amazon ECR and Docker Hub.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker-compose -f {artifacts:path}/docker-compose.yaml up Artifacts: - URI: "docker:public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" - URI: "docker:mysql:8.0" - URI: "s3://DOC-EXAMPLE-BUCKET/folder/docker-compose.yaml"
    注意

    若要在 Docker 容器元件中使用處理序間通訊 (IPC)、 AWS 認證或串流管理員,您必須在執行 Docker 容器時指定其他選項。如需詳細資訊,請參閱下列內容:

  3. 測試元件以確認其如預期般運作。

    重要

    您必須先安裝並啟動 Docker 精靈,才能部署元件。

    在本機部署元件之後,您可以執行 docker 容器 ls 命令來確認您的容器是否執行。

    docker container ls
  4. 當元件準備就緒時,請將元件上傳 AWS IoT Greengrass 至部署到其他核心裝置。如需詳細資訊,請參閱 發佈元件以部署到您的核心裝置

從 Amazon ECR 中的私有映像運行碼頭集裝箱

本節說明如何從存放在 Amazon ECR 的私有儲存庫中的 Docker 映像建立執行 Docker 容器的自訂元件。

若要執行泊塢視窗容器
  1. 在 AWS IoT Greengrass 核心裝置上建立自訂元件。使用下列範例配方,它具有下列屬性:

    • Docker 應用程序管理器組件作為依賴關係。此元件可 AWS IoT Greengrass 讓您管理認證,以便從專用儲存庫下載映像。

    • 令牌交換服務組件作為依賴項。此元件可讓您擷 AWS IoT Greengrass 取 AWS 登入資料,以便與 Amazon ECR 互動。

    • 在私有 Amazon ECR 儲存庫中指定碼頭映像的元件成品。

    • 使用 docker run 從映像建立和啟動容器的生命週期執行指令碼。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyPrivateDockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from a private Amazon ECR image.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.DockerApplicationManager": { "VersionRequirement": "~2.0.0" }, "aws.greengrass.TokenExchangeService": { "VersionRequirement": "~2.0.0" } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "run": "docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" }, "Artifacts": [ { "URI": "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyPrivateDockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from a private Amazon ECR image.' ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.DockerApplicationManager: VersionRequirement: ~2.0.0 aws.greengrass.TokenExchangeService: VersionRequirement: ~2.0.0 Manifests: - Platform: os: all Lifecycle: run: docker run account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest] Artifacts: - URI: "docker:account-id.dkr.ecr.region.amazonaws.com/repository[:tag|@digest]"
    注意

    若要在 Docker 容器元件中使用處理序間通訊 (IPC)、 AWS 認證或串流管理員,您必須在執行 Docker 容器時指定其他選項。如需詳細資訊,請參閱下列內容:

  2. 測試元件以確認其如預期般運作。

    重要

    您必須先安裝並啟動 Docker 精靈,才能部署元件。

    在本機部署元件之後,您可以執行 docker 容器 ls 命令來確認您的容器是否執行。

    docker container ls
  3. 將元件上傳 AWS IoT Greengrass 至部署至其他核心裝置。如需詳細資訊,請參閱 發佈元件以部署到您的核心裝置

從 Amazon S3 中的映像運行碼頭集裝箱

本節說明如何從存放在 Amazon S3 中的 Docker 映像執行元件中的 Docker 容器。

從 Amazon S3 中的映像執行元件中的 Docker 容器
  1. 運行 docker 保存命令來創建一個 Docker 容器的備份。您可以將此備份提供為元件加工品,以便在其上執行容器 AWS IoT Greengrass。以映像檔的名稱取代您的世界,並將 hello-world.tar 取代為要建立的封存檔案的名稱。

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. 在 AWS IoT Greengrass 核心裝置上建立自訂元件。使用下列範例配方,它具有下列屬性:

    • 一種生命週期安裝腳本,使用碼 docker 加載從歸檔中加載 Docker 映像。

    • 使用 docker run 從映像建立和啟動容器的生命週期執行指令碼。--rm此選項會在容器結束時清除容器。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } } } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world
    注意

    若要在 Docker 容器元件中使用處理序間通訊 (IPC)、 AWS 認證或串流管理員,您必須在執行 Docker 容器時指定其他選項。如需詳細資訊,請參閱下列內容:

  3. 測試元件以確認其如預期般運作。

    在本機部署元件之後,您可以執行 docker 容器 ls 命令來確認您的容器是否執行。

    docker container ls
  4. 當元件準備就緒時,請將 Docker 映像存檔上傳到 S3 儲存貯體,並將其 URI 新增至元件方案。然後,您可以將元件上傳 AWS IoT Greengrass 到部署到其他核心裝置。如需詳細資訊,請參閱 發佈元件以部署到您的核心裝置

    當您完成時,組件配方應如下列範例所示。

    JSON
    { "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.MyS3DockerComponent", "ComponentVersion": "1.0.0", "ComponentDescription": "A component that runs a Docker container from an image in an S3 bucket.", "ComponentPublisher": "Amazon", "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": { "Script": "docker load -i {artifacts:path}/hello-world.tar" }, "run": { "Script": "docker run --rm hello-world" } }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar" } ] } ] }
    YAML
    --- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.MyS3DockerComponent ComponentVersion: '1.0.0' ComponentDescription: 'A component that runs a Docker container from an image in an S3 bucket.' ComponentPublisher: Amazon Manifests: - Platform: os: linux Lifecycle: install: Script: docker load -i {artifacts:path}/hello-world.tar run: Script: docker run --rm hello-world Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar

在 Docker 容器組件中使用進程間通信

您可以使用中的 Greengrass 處理序間通訊 (IPC) 程式庫與 Greengrass 核心、其他 Greengrass 元件和通訊。 AWS IoT Device SDK AWS IoT Core如需詳細資訊,請參閱 使 AWS IoT Device SDK 用與 Greengrass 核、其他元件和通訊 AWS IoT Core

若要在 Docker 容器元件中使用 IPC,您必須使用下列參數執行 Docker 容器:

  • 將 IPC 插槽安裝在容器中。Greengrass 核在環境變量中提供了 IPC 套接字文件路徑。AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT

  • SVCUIDAWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT環境變量設置為 Greengrass 核提供給組件的值。您的組件使用這些環境變量來驗證與 Greengrass 核的連接。

範例 方法範例:將 MQTT 訊息發佈至 AWS IoT Core (Python)

下列方案定義了將 MQTT 訊息發佈至的範例 Docker 容器元件。 AWS IoT Core此配方具有下列屬性:

  • 一種授權原則 (accessControl),可讓元件 AWS IoT Core 在所有主題上將 MQTT 訊息發佈至。如需詳細資訊,請參閱授權元件執行 IPC 作業AWS IoT Core MQTT I PC 授權。

  • 在 Amazon S3 中將 Docker 映像指定為 TAR 存檔的元件成品。

  • 從 TAR 歸檔載入 Docker 映像檔的生命週期安裝指令碼。

  • 從映像執行 Docker 容器的生命週期執行指令碼。碼頭運行命令具有以下參數:

    • -v參數掛載 Greengrass IPC 套接字在容器中。

    • 前兩個-e引數會在 Docker 容器中設定必要的環境變數。

    • 其他-e引數會設定此範例所使用的環境變數。

    • --rm參數在退出時清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.PublishToIoTCore", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses interprocess communication to publish an MQTT message to IoT Core.", "ComponentPublisher": "Amazon", "ComponentConfiguration": { "DefaultConfiguration": { "topic": "test/topic/java", "message": "Hello, World!", "qos": "1", "accessControl": { "aws.greengrass.ipc.mqttproxy": { "com.example.python.docker.PublishToIoTCore:pubsub:1": { "policyDescription": "Allows access to publish to IoT Core on all topics.", "operations": [ "aws.greengrass#PublishToIoTCore" ], "resources": [ "*" ] } } } } }, "Manifests": [ { "Platform": { "os": "all" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/publish-to-iot-core.tar", "run": "docker run -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e SVCUID -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT -e MQTT_TOPIC=\"{configuration:/topic}\" -e MQTT_MESSAGE=\"{configuration:/message}\" -e MQTT_QOS=\"{configuration:/qos}\" --rm publish-to-iot-core" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.PublishToIoTCore ComponentVersion: 1.0.0 ComponentDescription: Uses interprocess communication to publish an MQTT message to IoT Core. ComponentPublisher: Amazon ComponentConfiguration: DefaultConfiguration: topic: 'test/topic/java' message: 'Hello, World!' qos: '1' accessControl: aws.greengrass.ipc.mqttproxy: 'com.example.python.docker.PublishToIoTCore:pubsub:1': policyDescription: Allows access to publish to IoT Core on all topics. operations: - 'aws.greengrass#PublishToIoTCore' resources: - '*' Manifests: - Platform: os: all Lifecycle: install: 'docker load -i {artifacts:path}/publish-to-iot-core.tar' run: | docker run \ -v $AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT:$AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e SVCUID \ -e AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT \ -e MQTT_TOPIC="{configuration:/topic}" \ -e MQTT_MESSAGE="{configuration:/message}" \ -e MQTT_QOS="{configuration:/qos}" \ --rm publish-to-iot-core Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.PublishToIoTCore/1.0.0/publish-to-iot-core.tar

在碼頭容器組件中使用 AWS 憑據(Linux)

您可以使用權杖交換服務元件與 Greengrass 元件中的 AWS 服務進行互動。此元件會使用本機容器伺服器,從核心裝置的 Token 交換角色提供 AWS 認證。如需詳細資訊,請參閱 與AWS服務互動

注意

本節中的範例僅適用於 Linux 核心裝置。

若要在 Docker 容器元件中使用權杖交換服務的 AWS 認證,您必須使用下列參數執行 Docker 容器:

  • 使用--network=host引數提供對主機網路的存取。此選項可讓 Docker 容器連線至本機權杖交換服務,以擷取 AWS 認證。這個論點僅適用於 Linux 的泊塢窗。

    警告

    此選項可讓容器存取主機上的所有區域網路介面,因此此選項比在沒有主機網路存取權的情況下執行 Docker 容器的安全性較低。當您開發並執行使用此選項的 Docker 容器元件時,請考慮這一點。如需詳細資訊,請參閱 Docker 文件中的網路:主機

  • AWS_CONTAINER_CREDENTIALS_FULL_URIAWS_CONTAINER_AUTHORIZATION_TOKEN環境變量設置為 Greengrass 核提供給組件的值。 AWS SDK 使用這些環境變數來擷取 AWS 認證。

範例配方:列出碼頭容器元件 (Python) 中的 S3 儲存貯體

下列方法定義範例 Docker 容器元件,該元件會列出您 AWS 帳戶的. 此配方具有下列屬性:

  • 令牌交換服務組件作為依賴項。此相依性可讓元件擷取 AWS 認證,以便與其他 AWS 服務互動。

  • 在 Amazon S3 中將 Docker 映像指定為 tar 存檔的元件成品。

  • 從 TAR 歸檔載入 Docker 映像檔的生命週期安裝指令碼。

  • 從映像執行 Docker 容器的生命週期執行指令碼。碼頭運行命令具有以下參數:

    • --network=host引數提供了對主機網絡的容器訪問,因此容器可以連接到令牌交換服務。

    • -e引數會在 Docker 容器中設定必要的環境變數。

    • --rm參數在退出時清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.ListS3Buckets", "ComponentVersion": "1.0.0", "ComponentDescription": "Uses the token exchange service to lists your S3 buckets.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.TokenExchangeService": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/list-s3-buckets.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e AWS_CONTAINER_CREDENTIALS_FULL_URI --rm list-s3-buckets" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.ListS3Buckets ComponentVersion: 1.0.0 ComponentDescription: Uses the token exchange service to lists your S3 buckets. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.TokenExchangeService: VersionRequirement: ^2.0.0 DependencyType: HARD Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/list-s3-buckets.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e AWS_CONTAINER_CREDENTIALS_FULL_URI \ --rm list-s3-buckets Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.ListS3Buckets/1.0.0/list-s3-buckets.tar

在碼頭容器組件中使用流管理器(Linux)

您可以使用串流管理員元件來管理 Greengrass 元件中的資料串流。此元件可讓您處理資料串流,並將大量 IoT 資料傳輸至. AWS 雲端 AWS IoT Greengrass 提供您用來與串流管理員元件互動的串流管理員 SDK。如需詳細資訊,請參閱 管理核心裝 Greengrass 資料串流

注意

本節中的範例僅適用於 Linux 核心裝置。

若要在 Docker 容器元件中使用串流管理員 SDK,您必須使用下列參數執行 Docker 容器:

  • 使用--network=host引數提供對主機網路的存取。此選項可讓 Docker 容器透過本機 TLS 連線與串流管理員元件互動。這個參數只適用於 Linux 的碼頭工具

    警告

    此選項可讓容器存取主機上的所有區域網路介面,因此此選項比在沒有主機網路存取權的情況下執行 Docker 容器的安全性較低。當您開發並執行使用此選項的 Docker 容器元件時,請考慮這一點。如需詳細資訊,請參閱 Docker 文件中的網路:主機

  • 如果您將串流管理員元件設定為需要驗證 (這是預設行為),請將AWS_CONTAINER_CREDENTIALS_FULL_URI環境變數設定為 Greengrass 核心提供給元件的值。如需詳細資訊,請參閱串流管理員組態

  • 如果您將串流管理員元件設定為使用非預設連接埠,請使用處理序間通訊 (IPC),從串流管理員元件組態取得連接埠。您必須使用其他選項來執行 Docker 容器,才能使用 IPC。如需詳細資訊,請參閱下列內容:

範例 方法範例:將檔案串流至碼頭容器元件 (Python) 中的 S3 儲存貯體

下列方法定義了建立檔案並將其串流至 S3 儲存貯體的範例 Docker 容器元件。此配方具有下列屬性:

  • 流管理器組件作為依賴關係。這種依賴關係使組件能夠使用流管理器 SDK 與流管理器組件進行交互。

  • 在 Amazon S3 中將 Docker 映像指定為 TAR 存檔的元件成品。

  • 從 TAR 歸檔載入 Docker 映像檔的生命週期安裝指令碼。

  • 從映像執行 Docker 容器的生命週期執行指令碼。碼頭運行命令具有以下參數:

    • --network=host引數提供了對主機網絡的容器訪問,因此容器可以連接到流管理器組件。

    • 第一個-e引數會在 Docker 容器中設定所需的AWS_CONTAINER_AUTHORIZATION_TOKEN環境變數。

    • 其他-e引數會設定此範例所使用的環境變數。

    • -v引數會在容器中掛載元件的工作資料夾。此範例會在工作資料夾中建立一個檔案,以使用串流管理員將該檔案上傳到 Amazon S3。

    • --rm參數在退出時清理容器。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.python.docker.StreamFileToS3", "ComponentVersion": "1.0.0", "ComponentDescription": "Creates a text file and uses stream manager to stream the file to S3.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.StreamManager": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "ComponentConfiguration": { "DefaultConfiguration": { "bucketName": "" } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "docker load -i {artifacts:path}/stream-file-to-s3.tar", "run": "docker run --network=host -e AWS_CONTAINER_AUTHORIZATION_TOKEN -e BUCKET_NAME=\"{configuration:/bucketName}\" -e WORK_PATH=\"{work:path}\" -v {work:path}:{work:path} --rm stream-file-to-s3" }, "Artifacts": [ { "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar" } ] } ] }
YAML
RecipeFormatVersion: '2020-01-25' ComponentName: com.example.python.docker.StreamFileToS3 ComponentVersion: 1.0.0 ComponentDescription: Creates a text file and uses stream manager to stream the file to S3. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.StreamManager: VersionRequirement: ^2.0.0 DependencyType: HARD ComponentConfiguration: DefaultConfiguration: bucketName: '' Manifests: - Platform: os: linux Lifecycle: install: 'docker load -i {artifacts:path}/stream-file-to-s3.tar' run: | docker run \ --network=host \ -e AWS_CONTAINER_AUTHORIZATION_TOKEN \ -e BUCKET_NAME="{configuration:/bucketName}" \ -e WORK_PATH="{work:path}" \ -v {work:path}:{work:path} \ --rm stream-file-to-s3 Artifacts: - URI: s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar