运行 Docker 容器 - AWS IoT Greengrass

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

运行 Docker 容器

您可以将 AWS IoT Greengrass 组件配置为使用存储在以下位置的映像运行 Docker 容器:

  • Amazon 弹性容器注册表 (AmazonECR) 中的公有和私有图像存储库

  • 公共 Docker Hub 存储库

  • 公共 Docker 可信注册表

  • S3 存储桶

在您的自定义组件中,将 Docker 镜像URI作为工件包括在内,以检索镜像并在核心设备上运行。对于亚马逊ECR和 Docker Hub 镜像,您可以使用 Docker 应用程序管理器组件下载映像并管理亚马逊ECR私有存储库的凭证。

要求

要在组件中运行 Docker 容器,你需要以下内容:

  • 一款 Greengrass 核心设备。如果没有,请参阅教程:AWS IoT Greengrass V2 入门

  • 安装在 Greengr@@ ass 核心设备上的 Docker E ngine 1.9.1 或更高版本。版本 20.10 是经验证可与 AWS IoT Greengrass 核心软件配合使用的最新版本。在部署运行 Docker 容器的组件之前,必须直接在核心设备上安装 Docker。

    提示

    您还可以将核心设备配置为在组件安装时安装 Docker Engine。例如,以下安装脚本在加载 Docker 镜像之前安装 Docker 引擎。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要在生命周期脚本true中将其设置RequiresPrivilege为才能运行安装和docker命令。有关更多信息,请参阅 AWS IoT Greengrass 组件配方参考

    apt-get install docker-ce docker-ce-cli containerd.io && docker load -i {artifacts:path}/hello-world.tar
  • 运行 Docker 容器组件的系统用户必须具有根或管理员权限,或者您必须将 Docker 配置为以非根用户或非管理员用户身份运行。

    • 在 Linux 设备上,您可以将用户添加到docker群组中,无需用户即可调用docker命令sudo

    • 在 Windows 设备上,无需管理员权限即可将用户添加到docker-users群组中以调用docker命令。

    Linux or Unix

    要将或用于运行 Docker 容器组件的非 root 用户添加到ggc_userdocker群组,请运行以下命令。

    sudo usermod -aG docker ggc_user

    有关更多信息,请参阅以非 root 用户身份管理 Docker

    Windows Command Prompt (CMD)

    要将或您用来运行 Docker 容器组件的用户添加到ggc_userdocker-users组,请以管理员身份运行以下命令。

    net localgroup docker-users ggc_user /add
    Windows PowerShell

    要将或您用来运行 Docker 容器组件的用户添加到ggc_userdocker-users组,请以管理员身份运行以下命令。

    Add-LocalGroupMember -Group docker-users -Member ggc_user
  • 作为卷安装在 Docker 容器中的 Docker 容器组件访问的文件。

  • 如果您将 AWS IoT Greengrass Core 软件配置为使用网络代理,则必须将 Docker 配置为使用相同的代理服务器

除了这些要求外,如果这些要求适用于您的环境,则还必须满足以下要求:

  • 要使用 Docker Compose 创建和启动 Docker 容器,请在 Greengrass 核心设备上安装 Docker Compose,然后将你的 Docker Compose 文件上传到 S3 存储桶。您必须将 Compose 文件存储在 AWS 账户 与 AWS 区域 组件相同的 S3 存储桶中。有关在自定义组件中使用该docker-compose up命令的示例,请参阅使用亚马逊ECR或 Docker Hub 中的公共镜像运行 Docker 容器

  • 如果您在网络代理 AWS IoT Greengrass 后面运行,请将 Docker 守护程序配置为使用代理服务器

  • 如果您的 Docker 镜像存储在亚马逊ECR或 Docker Hub 中,请将 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 Hub 镜像:docker:name[:tag|@digest]

    有关使用存储在公共存储库中的镜像运行 Docker 容器的更多信息,请参阅使用亚马逊ECR或 Docker Hub 中的公共镜像运行 Docker 容器

  • 如果您的 Docker 镜像存储在 Amazon ECR 私有存储库中,则必须将令牌交换服务组件作为依赖项包含在 Docker 容器组件中。此外,Greengrass 设备角色必须允许ecr:GetAuthorizationTokenecr:GetDownloadUrlForLayer和操作ecr:BatchGetImage,如以下示例策略所示。IAM

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

    有关使用存储在 Amazon ECR 私有存储库中的映像运行 Docker 容器的信息,请参阅使用亚马逊的私有镜像运行 Docker 容器 ECR

  • 要使用存储在 Amazon ECR 私有存储库中的 Docker 映像,私有存储库必须与核心设备位于同一 AWS 区域 位置。

  • 如果您的 Docker 映像或 Compose 文件存储在 S3 存储桶中,则 Greengrass 设备角色必须允许核心设备将映像下载为组件工件,如以下示例策略所示。s3:GetObject IAM

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

    有关使用存储在 Amazon S3 中的映像运行 Docker 容器的信息,请参阅使用亚马逊 S3 中的镜像运行 Docker 容器

  • 要在 Docker 容器组件中使用进程间通信 (IPC)、 AWS 凭据或流管理器,必须在运行 Docker 容器时指定其他选项。有关更多信息,请参阅下列内容:

使用亚马逊ECR或 Docker Hub 中的公共镜像运行 Docker 容器

本节介绍如何创建自定义组件,该组件使用 Docker Compose 从存储在亚马逊ECR和 Docker Hub 的 Docker 镜像中运行 Docker 容器。

使用 Docker Compose 运行 Docker 容器
  1. 创建 Docker Compose 文件并将其上传到亚马逊 S3 存储桶。确保 Greengrass 设备角色允许设备访问 C s3:GetObject ompose 文件。以下示例中显示的示例撰写文件包括来自亚马逊的亚马逊 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 Hub 存储库下载映像。

    • 一种组件工件,用于在公共亚马逊ECR存储库中指定 Docker 镜像。

    • 一种组件工件,用于在公共 Docker Hub 存储库中指定 Docker 镜像。

    • 一个组件工件,它指定 Docker Compose 文件,该文件包含你要运行的 Docker 镜像的容器。

    • 一个生命周期运行脚本,它使用 docker-compose up 从指定的映像创建和启动容器。

    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 到以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备

使用亚马逊的私有镜像运行 Docker 容器 ECR

本节介绍如何使用存储在亚马逊私有存储库中的 Docker 镜像创建运行 Docker 容器的自定义组件。ECR

运行 Docker 容器
  1. 在 AWS IoT Greengrass 核心设备上创建自定义组件。使用以下示例配方,它具有以下属性:

    • Docker 应用程序管理器组件作为依赖项。此组件 AWS IoT Greengrass 允许管理从私有存储库下载图像的凭据。

    • 作为依赖项的令牌交换服务组件。此组件允许检索 AWS 凭证 AWS IoT Greengrass 以与 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 以部署到其他核心设备。有关更多信息,请参阅 发布组件以部署到您的核心设备

使用亚马逊 S3 中的镜像运行 Docker 容器

本节介绍如何通过存储在亚马逊 S3 中的 Docker 镜像在组件中运行 Docker 容器。

通过亚马逊 S3 中的镜像在组件中运行 Docker 容器
  1. 运行 docker save 命令创建 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 核、 AWS IoT Device SDK 其他 Greengrass 组件和进行通信。 AWS IoT Core有关更多信息,请参阅 使用 AWS IoT Device SDK 与 Greengrass 原子核、其他组件进行通信 AWS IoT Core

要IPC在 Docker 容器组件中使用,必须使用以下参数运行 Docker 容器:

  • 将IPC插座安装在容器中。Greengrass nucleus 在环境变量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 MQTTIPC授权

  • 在 Amazon S3 中将 Docker 镜像指定为TAR存档的组件工件。

  • 从TAR存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • -v参数将 G IPC reengrass 套接字安装在容器中。

    • 前两个-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

在 Docker 容器组件中使用 AWS 凭证 (Linux)

您可以使用令牌交换服务组件与 Greengrass 组件中的 AWS 服务进行交互。该组件使用本地容器服务器提供来自核心设备的令牌交换角色的 AWS 凭证。有关更多信息,请参阅 与AWS服务互动

注意

本节中的示例仅适用于 Linux 核心设备。

要在 Docker 容器组件中使用来自令牌交换服务的 AWS 凭证,必须使用以下参数运行 Docker 容器:

  • 使用--network=host参数提供对主机网络的访问权限。此选项使 Docker 容器能够连接到本地令牌交换服务以检索 AWS 凭据。这个参数仅适用于适用于 Linux 的 Docker。

    警告

    此选项允许容器访问主机上的所有本地网络接口,因此,与在没有主机网络访问权限的情况下运行 Docker 容器相比,此选项不那么安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机

  • AWS_CONTAINER_CREDENTIALS_FULL_URIAWS_CONTAINER_AUTHORIZATION_TOKEN环境变量设置为 Greengrass 核为组件提供的值。 AWS SDKs使用这些环境变量来检索 AWS 凭证。

例 示例配方:在 Docker 容器组件中列出 S3 存储桶 (Python)

以下配方定义了一个示例 Docker 容器组件,该组件列出了你的 S3 存储桶。 AWS 账户该配方具有以下属性:

  • 作为依赖项的令牌交换服务组件。这种依赖关系使组件能够检索 AWS 凭证以与其他 AWS 服务进行交互。

  • 一个组件工件,它将 Docker 镜像指定为 Amazon S3 中的 tar 存档。

  • 从TAR存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • --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

在 Docker 容器组件中使用流管理器 (Linux)

您可以使用流管理器组件来管理 Greengrass 组件中的数据流。此组件使您能够处理数据流并将大量物联网数据传输到. AWS Cloud AWS IoT Greengrass 提供了一个用于与流管理器SDK组件交互的流管理器。有关更多信息,请参阅 管理 Greengrass 核心设备上的数据流

注意

本节中的示例仅适用于 Linux 核心设备。

要在 Docker 容器组件SDK中使用流管理器,必须使用以下参数运行 Docker 容器:

  • 使用--network=host参数提供对主机网络的访问权限。此选项使 Docker 容器能够通过本地TLS连接与流管理器组件进行交互。这个参数仅适用于适用于 Linux 的 Docker

    警告

    此选项允许容器访问主机上的所有本地网络接口,因此,与在没有主机网络访问权限的情况下运行 Docker 容器相比,此选项不那么安全。在开发和运行使用此选项的 Docker 容器组件时,请考虑这一点。有关更多信息,请参阅 Docker 文档中的网络:主机

  • 如果您将流管理器组件配置为需要身份验证(这是默认行为),请将AWS_CONTAINER_CREDENTIALS_FULL_URI环境变量设置为 Greengrass nucleus 为组件提供的值。有关更多信息,请参阅直播管理器配置

  • 如果将流管理器组件配置为使用非默认端口,请使用进程间通信 (IPC) 从流管理器组件配置中获取端口。您必须使用IPC其他选项运行 Docker 容器。有关更多信息,请参阅下列内容:

例 示例配方:将文件流式传输到 Docker 容器组件中的 S3 存储桶 (Python)

以下配方定义了一个示例 Docker 容器组件,该组件用于创建文件并将其流式传输到 S3 存储桶。该配方具有以下属性:

  • 作为依赖项的流管理器组件。这种依赖关系使该组件能够使用流管理器SDK与流管理器组件进行交互。

  • 在 Amazon S3 中将 Docker 镜像指定为TAR存档的组件工件。

  • 从TAR存档中加载 Docker 镜像的生命周期安装脚本。

  • 基于镜像运行 Docker 容器的生命周期运行脚本。D ocker 运行命令具有以下参数:

    • --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