运行 Docker 容器 - AWS IoT Greengrass

运行 Docker 容器

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

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

  • 公共 Docker Hub 存储库

  • 公共 Docker 可信注册表

  • S3 存储桶

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

要求

要在组件中运行 Docker 容器,您需要:

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

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

    提示

    您还可以将核心设备配置为在组件安装时安装 Docker Engine。例如,以下安装脚本可在加载 Docker 映像之前安装 Docker Engine。此安装脚本适用于基于 Debian 的 Linux 发行版,例如 Ubuntu。如果您使用此命令将组件配置为安装 Docker Engine,则可能需要在生命周期脚本中将 RequiresPrivilege 设置为 true 才能运行安装和 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

    要添加 ggc_user 或您用于运行 Docker 容器组件的非根用户至 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 容器组件访问的文件。

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

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

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

  • 如果您在网络代理后面运行 AWS 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:BatchGetImageecr: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 映像,私有存储库必须与核心设备位于相同的 AWS 区域。

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

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

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

  • 要在 Docker 容器组件中使用进程间通信(IPC)、AWS 凭证或流管理器,必须在运行 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 权限,使设备能够访问 Compose 文件。以下示例中的示例 Compose 文件包括 Amazon ECR 中的 Amazon CloudWatch 代理映像和 Docker Hub 中的 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 和 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://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 container ls 命令来验证您的容器是否运行。

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

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

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

运行 Docker 容器
  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 container ls 命令来验证您的容器是否运行。

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

通过 Amazon S3 中的映像运行 Docker 容器

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

通过 Amazon S3 中的映像在组件中运行 Docker 容器
  1. 运行 docker save 命令以创建 Docker 容器的备份。您需要将此备份作为组件构件提供,以便在 AWS IoT Greengrass 上运行容器。将 hello-world 替换为图像的名称,将 hello-world.tar 替换为要创建的存档文件的名称。

    docker save hello-world > artifacts/com.example.MyDockerComponent/1.0.0/hello-world.tar
  2. 在 AWS IoT Greengrass 核心设备上创建自定义组件。使用以下配方示例,它具有以下属性:

    • 使用 docker load 从存档中加载 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 container 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 容器组件中使用进程间通信

您可以使用 AWS IoT Device SDK 中的 Greengrass 进程间通信(IPC)库与 Greengrass Nucleus、其他 Greengrass 组件和 AWS IoT Core 进行通信。有关更多信息,请参阅 使用 AWS IoT Device SDK 与 Greengrass Nucleus、其他组件和 AWS IoT Core 通信

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

  • 将 IPC 套接字挂载在容器中。Greengrass Nucleus在 AWS_GG_NUCLEUS_DOMAIN_SOCKET_FILEPATH_FOR_COMPONENT 环境变量中提供 IPC 套接字文件路径。

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

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

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

  • 允许组件向 AWS IoT Core 发布有关所有主题的 MQTT 消息的授权策略 (accessControl)。有关更多信息,请参阅 授权组件执行 IPC 操作AWS IoT Core MQTT IPC 授权

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

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

  • 通过映像运行 Docker 容器的生命周期运行脚本。Docker run 命令具有以下参数:

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

在 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 Nucleus为组件提供的值。AWSSDK 使用这些环境变量检索 AWS 凭证。

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

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

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

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

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

  • 通过映像运行 Docker 容器的生命周期运行脚本。Docker run 命令具有以下参数:

    • --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 组件中的数据流。此组件用于处理数据流并将大容量 IoT 数据传输到 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)

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

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

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

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

  • 通过映像运行 Docker 容器的生命周期运行脚本。Docker run 命令具有以下参数:

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