運行碼頭容器 - AWS IoT Greengrass

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

運行碼頭容器

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

  • Amazon 彈性容器註冊表(AmazonECR)中的公共和私有映像存儲庫

  • 公共碼頭集線器存儲庫

  • 公共碼頭信任的註冊表

  • S3 儲存貯體

在您的自訂元件中,包含 Docker 映像檔URI做為成品,以擷取映像檔並在核心裝置上執行。對於 Amazon ECR 和 Docker Hub 映像檔,您可以使用 Docker 應用程式管理器元件下載映像並管理私有 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 精靈。

    此外,請將影像納入URIs為元件假影。影像格式URIs必須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 容器元件中包含令牌交換服務元件作為依賴項。此外,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 的私人映像運行 Docker 容器 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 或碼頭集線器中的公共映像運行碼頭集裝箱

本節介紹如何創建使用 Docker 撰寫從存儲 Amazon ECR 和 Docker 集線器的 Docker 映像運行碼頭容器的自定義組件。

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

    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 和 Docker 集線器存儲庫下載圖像。

    • 在公用 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://amzn-s3-demo-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://amzn-s3-demo-bucket/folder/docker-compose.yaml"
    注意

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

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

    重要

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

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

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

從 Amazon 的私人映像運行 Docker 容器 ECR

本節介紹如何從存儲在 Amazon 私有存儲庫中的 Docker 映像創建運行 Docker 容器的自定義組件。ECR

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

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

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

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

    • 使用 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。Replace (取代) hello-world 用圖像的名稱,並替換 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://amzn-s3-demo-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://amzn-s3-demo-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

若要IPC在 Docker 容器元件中使用,您必須使用下列參數執行 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 AWS IoT Core訊息發佈至的範例 Docker 容器元件。此配方具有下列屬性:

  • 允許元件 AWS IoT Core 在所有主題上將MQTT訊息發佈到的授權原則 (accessControl)。如需詳細資訊,請參閱授權元件執行IPC作業AWS IoT Core MQTTIPC授權

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

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

  • 從映像執行 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://amzn-s3-demo-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://amzn-s3-demo-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 SDKs使用這些環境變數來擷取 AWS 認證。

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

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

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

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

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

  • 從映像執行 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://amzn-s3-demo-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://amzn-s3-demo-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) 從串流管理員元件組態取得連接埠。您必須使IPC用其他選項來執行 Docker 容器。如需詳細資訊,請參閱下列內容:

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

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

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

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

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

  • 從映像執行 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://amzn-s3-demo-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://amzn-s3-demo-bucket/artifacts/com.example.python.docker.StreamFileToS3/1.0.0/stream-file-to-s3.tar