运行 Docker 容器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

运行 Docker 容器

您可以配置Amazon IoT Greengrass要运行的组件搬运工人容器来自存储在以下位置的映像:

  • Amazon Elastry (Amazon Elastic Container Registry (Amazon ECR) 中的公有和私有映像存储库

  • 公共 Docker Hub 存储库

  • 公共 Docker 可信注册表

  • S3 存储桶

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

要求

要在组件中运行 Docker 容器,您需要具备以下条件:

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

  • Docker 引擎Greengrass 核心设备上安装的 1.9.1 或更高版本。版本 20.10 是经验证可与Amazon IoT Greengrass核心软件。在部署运行 Docker 容器的组件之前,必须直接在核心设备上安装 Docker。

    提示

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

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

    • 在 Linux 设备上,您可以将用户添加到docker要呼叫的群组dockerWITHOUTsudo.

    • 在 Windows 设备上,您可以将用户添加到docker-users要呼叫的群组docker没有管理员权限的命令。

    Linux or Unix

    添加ggc_user,或者你用来运行 Docker 容器组件的非 root 用户转到docker组,运行以下命令。

    sudo usermod -aG docker ggc_user

    有关更多信息,请参阅 。以非根用户身份管理 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 容器中。

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

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

  • 使用Docker Compose要创建和启动 Docker 容器,请在 Greengrass 核心设备上安装 Docker Compose,然后将 Docker Compose 文件上传到 S3 存储桶。您必须将 Compose 文件存储在 S3 存储桶中Amazon Web Services 账户和Amazon Web Services 区域作为组件。举一个使用docker-compose up命令在自定义组件中,请参阅从 Amazon ECR 或 Docker Hub 中的公共映像运行 Docker 容器.

  • 如果你跑了Amazon IoT Greengrass在网络代理后面,将 Docker 守护进程配置为使用代理服务器.

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

    有关从存储在公共仓库中的映像运行 Docker 容器的更多信息,请参阅从 Amazon ECR 或 Docker Hub 中的公共映像运行 Docker 容器.

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

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

    有关从存储在 Amazon ECR 私有存储库中的映像运行 Docker 容器的信息,请参阅从 Amazon ECR 中的私有映像运行 Docker 容器.

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

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

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

    有关通过存储在 Amazon S3 中的映像运行 Docker 容器的信息,请参阅从 Amazon S3 中的映像运行 Docker 容器.

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

从 Amazon ECR 或 Docker Hub 中的公共映像运行 Docker 容器

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

使用 Docker Compose 运行 Docker 容器

  1. 创建 Docker Compose 文件并将其上载到 Amazon S3 存储桶。确保Greengrass 设备角色允许s3:GetObject允许设备访问合成文件的权限。以下示例中显示的示例合成文件包括 Amazon CloudWatch Amazon Ecr 中的代理映像和来自 Docker Hub 的 MySQL 镜像。

    version: "3" services: cloudwatchagent: image: "public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest" mysql: image: "mysql:8.0"
  2. 创建自定义组件在您的Amazon IoT Greengrass核心设备。以下示例中显示的示例配方具有以下属性:

    • 作为依赖项的 Docker 应用程序管理器组件。此组件启用Amazon IoT Greengrass从公共 Amazon ECR 和 Docker Hub 存储库下载映像。

    • 在公共 Amazon 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://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"
    注意

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

  3. 测试组件以验证它按预期运行。

    重要

    在部署组件之前,必须安装并启动 Docker 守护进程。

    在本地部署组件后,您可以运行docker 容器 ls命令以验证容器是否运行。

    docker container ls
  4. 组件准备就绪后,将组件上传到Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅 发布要部署到核心设备的组件

从 Amazon ECR 中的私有映像运行 Docker 容器

本节介绍如何通过存储在 Amazon ECR 私有仓库中的 Docker 映像创建运行 Docker 容器的自定义组件。

运行 Docker 容器

  1. 创建自定义组件在您的Amazon IoT Greengrass核心设备。使用以下示例配方,它具有以下属性:

    • 作为依赖项的 Docker 应用程序管理器组件。此组件启用Amazon IoT Greengrass管理从私有存储库下载映像的凭证。

    • 作为依赖项的令牌交换服务组件。此组件启用Amazon IoT Greengrass检索Amazon凭证来与 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]"
    注意

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

  2. 测试组件以验证它按预期运行。

    重要

    在部署组件之前,必须安装并启动 Docker 守护进程。

    在本地部署组件后,您可以运行docker 容器 ls命令以验证容器是否运行。

    docker container ls
  3. 将组件上传到Amazon IoT Greengrass以部署到其他核心设备。有关更多信息,请参阅 发布要部署到核心设备的组件

从 Amazon S3 中的映像运行 Docker 容器

本节介绍如何在存储在 Amazon S3 中的 Docker 映像的组件中运行 Docker 容器。

在 Amazon S3 中映像的组件中运行 Docker 容器

  1. 运行docker save命令来创建 Docker 容器的备份。您可以将此备份作为组件工件提供,以便在其上运行容器Amazon IoT Greengrass. Replacehello-world将替换为图像的名称,并将hello-world.tar使用要创建的存档文件的名称。

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. 创建自定义组件在您的Amazon 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
    注意

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

  3. 测试组件以验证它按预期运行。

    在本地部署组件后,您可以运行docker 容器 ls命令以验证容器是否运行。

    docker container ls
  4. 组件准备就绪后,将 Docker 映像存档上载到 S3 存储桶,然后将其 URI 添加到组件 registry。然后,可以将组件上载到Amazon 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) 库在Amazon IoT Device SDK与 Greengrass 核、其他 Greengrass 组件进行通信,以及Amazon IoT Core. 有关更多信息,请参阅 使用Amazon IoT Device SDK与 Greengrass 核、其他组件进行通信,以及Amazon IoT Core

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

  • 将 IPC 套接字安装到容器中。Greengrass 核心在AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT环境变量。

  • 设置SVCUIDAWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT环境变量转换为 Greengrass 核提供给组件的值。您的组件使用这些环境变量来验证与 Greengrass 核的连接。

例 配方示例:将 MQTT 消息发布到Amazon IoT Core(Python)

以下配方定义了一个示例 Docker 容器组件,该组件将 MQTT 消息发布到Amazon IoT Core. 该配方具有以下属性:

  • 授权策略 (accessControl),允许组件将 MQTT 消息发布到Amazon IoT Core所有话题。有关更多信息,请参阅 。授权组件执行 IPC 操作Amazon IoT CoreMQTT IPC 授权.

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

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

  • 从该映像运行 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

使用AmazonDocker 容器组件 (Linux) 中的凭据

您可以使用令牌交换服务组件与交互AmazonGreengrass 组件中的服务。此组件提供Amazon核心设备的凭证代币交换角色使用本地容器服务器。有关更多信息,请参阅 与交互Amazon服务

注意

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

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

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

    警告

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

  • 设置AWS_CONTAINER_CREDENTIALS_FULL_URIAWS_CONTAINER_AUTHORIZATION_TOKEN环境变量转换为 Greengrass 核提供给组件的值。AmazonSDK 使用这些环境变量来检索Amazon凭证。

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

以下配方定义了一个示例 Docker 容器组件,其中列出了您的Amazon Web Services 账户. 该配方具有以下属性:

  • 作为依赖项的令牌交换服务组件。此依赖关系使组件能够检索Amazon与其他人交互的证书Amazon服务。

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

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

  • 从该映像运行 Docker 容器的生命周期运行脚本。这些区域有:Docker 运行命令具有以下参数:

    • 这些区域有:--network=hostargument 提供对主机网络的容器访问,因此容器可以连接到令牌交换服务。

    • 这些区域有:-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

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

您可以使用流管理器组件来管理 Greengrass 组件中的数据流。此组件,您可以处理数据流并将大容量 IoT 数据传输到Amazon Web Services 云.Amazon IoT Greengrass提供了用于与流管理器组件交互的流管理器 SDK。有关更多信息,请参阅 管理 Greengrass 核心设备上的数据流

注意

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

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

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

    警告

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

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

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

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

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

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

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

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

  • 从该映像运行 Docker 容器的生命周期运行脚本。这些区域有:Docker 运行命令具有以下参数:

    • 这些区域有:--network=hostargument 提供对主机网络的容器访问,因此容器可以连接到流管理器组件。

    • 第一个-e参数设置了必需的AWS_CONTAINER_AUTHORIZATION_TOKENDocker 容器中的环境变量。

    • 其他的-e参数设置此示例使用的环境变量。

    • 这些区域有:-v参数挂载组件的Work文件夹在容器中。此示例在工作文件夹中创建一个文件,以便使用流管理器将该文件上传到 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