Amazon IoT Greengrass Version 12023 年 6 月 30 日进入延长寿命阶段。有关更多信息,请参阅Amazon IoT Greengrass V1维护政策。在此日期之后,将Amazon IoT Greengrass V1不会发布提供功能、增强功能、错误修复或安全补丁的更新。运行的设备Amazon IoT Greengrass V1不会中断,将继续运行并连接到云端。我们强烈建议您迁移到 Amazon IoT Greengrass Version 2,这增加了重要的新功能并支持其他平台。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Docker 应用程序部署连接器
Greengrass Docker 应用程序部署连接器可以更轻松地在Amazon IoT Greengrass内核上运行 Docker 镜像。连接器使用 Docker Compose 从 docker-compose.yml
文件启动多容器 Docker 应用程序。具体而言,连接器运行 docker-compose
命令来管理单个核心设备上的 Docker 容器。有关详细信息,请参阅 Docker 文档中的 Docker Compose 概述
部署 Greengrass 组后,连接器提取最新的映像并启动 Docker 容器。它运行docker-compose pull
和docker-compose
up
命令。然后,连接器将命令的状态发布到输出 MQTT 主题。它还记录有关运行 Docker 容器的状态信息。这使您可以在 Amazon 中监控您的应用程序日志 CloudWatch。有关更多信息,请参阅利用 Amazon IoT Greengrass 日志进行监控:连接器还会在每次 Greengrass 守护程序重新启动时启动 Docker 容器。可以在内核上运行的 Docker 容器数量取决于您的硬件。
Docker 容器在核心设备上的 Greengrass 域之外运行,因此它们无法访问核心的进程间通信 (IPC)。但是,您可以使用 Greengrass 组件配置一些通信通道,例如本地 Lambda 函数。有关更多信息,请参阅与 Docker 容器通信:
您可以将连接器用于在核心设备上托管 Web 服务器或 MySQL 服务器等此类方案。Docker 应用程序中的本地服务可以彼此、与本地环境中的其他进程以及云服务通信。例如,您可以在核心上运行一个 Web 服务器,将来自 Lambda 函数的请求发送到云中的 Web 服务。
此连接器在无容器隔离模式下运行,因此,您可以将其部署到在没有 Greengrass 容器化的情况下运行的 Greengrass 组。
此连接器有以下版本。
版本 |
ARN |
---|---|
7 |
|
6 |
|
5 |
|
4 |
|
3 |
|
2 |
|
1 |
|
有关版本更改的信息,请参阅更改日志。
要求
此连接器具有以下要求:
-
Amazon IoT Greengrass核心软件 v1.10 或更高版本。
注意
OpenWrt 发行版不支持此连接器。
-
Python
版本 3.7 或 3.8 安装在核心设备上并添加到 PATH 环境变量中。 注意
要使用 Python 3.8,请运行以下命令创建从默认 Python 3.7 安装文件夹到已安装的 Python 3.8 二进制文件的符号链接。
sudo ln -s
path-to-python-3.8
/python3.8 /usr/bin/python3.7这会将设备配置为满足 Amazon IoT Greengrass 的 Python 要求。
-
Greengrass 内核上至少有 36 MB RAM,供连接器监控正在运行的 Docker 容器。总内存需求取决于在内核上运行的 Docker 容器的数量。
-
Greengrass 核心上安装的 Docker Engine
1.9.1 或更高版本。版本 19.0.3 是经验证可与连接器一起使用的最新版本。 docker
可执行文件必须位于/usr/bin
或/usr/local/bin
目录中。重要
我们建议您安装凭证存储以保护 Docker 凭证的本地副本。有关更多信息,请参阅安全说明:
有关在亚马逊 Linux 发行版上安装 Docker 的信息,请参阅《亚马逊弹性容器服务开发者指南》中的 Amazon ECS 的 Docker 基础知识。
-
Greengrass 核心上安装的 Docker Compose
。 docker-compose
可执行文件必须位于/usr/bin
或/usr/local/bin
目录中。以下 Docker Compose 版本经验证可与此连接器一起使用。
连接器版本
经验证的 Docker Compose 版本
7
1.25.4
6
1.25.4
5
1.25.4
4
1.25.4
3
1.25.4
2
1.25.1
1
1.24.1
-
单个 Docker Compose 文件(例如
docker-compose.yml
),存储在 Amazon Simple Storage Service (Amazon S3) 中。格式必须与安装在核心上的 Docker Compose 版本兼容。在核心上使用文件之前,应先对其进行测试。如果在部署 Greengrass 组后编辑该文件,则必须重新部署该组以更新核心上的本地副本。 -
有权调用本地 Docker 守护程序并写入存储 Compose 文件的本地副本的目录的 Linux 用户。有关更多信息,请参阅在核心上设置 Docker 用户:
-
Greengrass 组角色,配置为允许对包含 Compose 文件的 S3 存储桶执行
s3:GetObject
操作。此权限显示在以下示例 IAM 策略中。{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToComposeFileS3Bucket", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Effect": "Allow", "Resource": "arn:aws:s3:::
bucket-name
/*" } ] }注意
如果您的 S3 存储桶启用了版本控制,则必须将角色配置为允许该
s3:GetObjectVersion
操作。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的使用版本控制。对于组角色要求,您必须将角色配置为授予所需权限,并确保角色已添加到组中。有关更多信息,请参阅 管理 Greengrass 组角色(控制台) 或 管理 Greengrass 组角色 (CLI)。
-
如果您的 Docker Compose 文件引用了存储在 Amazon ECR 中的 Docker 镜像,则 Greengrass 群组角色配置为允许以下内容:
-
ecr:GetDownloadUrlForLayer
以及对包含 Docker 镜像的 Amazon ECR 存储库执行的ecr:BatchGetImage
操作。 -
对您的资源执行的
ecr:GetAuthorizationToken
操作。
存储库必须与连接器位于Amazon Web Services 区域同一Amazon Web Services 账户和中。
重要
群组角色中的权限可以由 Greengrass 组中的所有 Lambda 函数和连接器承担。有关更多信息,请参阅安全说明:
以下示例策略中显示了这些权限。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowGetEcrRepositories", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": [ "arn:aws:ecr:
region
:account-id
:repository/repository-name
" ] }, { "Sid": "AllowGetEcrAuthToken", "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" } ] }有关更多信息,请参阅 Amazon ECR 用户指南中的 Amazon ECR 存储库策略示例。
对于组角色要求,您必须将角色配置为授予所需权限,并确保角色已添加到组中。有关更多信息,请参阅 管理 Greengrass 组角色(控制台) 或 管理 Greengrass 组角色 (CLI)。
-
-
如果您的 Docker Compose 文件引用来自 Amazon Web Services Marketplace
的 Docker 镜像,则连接器还具有以下要求: -
您必须订阅 Amazon Web Services Marketplace 容器产品。有关更多信息,请参阅订阅Amazon Web Services Marketplace者指南中的查找和订阅容器产品。
-
Amazon IoT Greengrass必须配置为支持本地密钥,如密钥要求中所述。连接器仅使用此功能从中检索您的密钥Amazon Secrets Manager,而不是存储它们。
-
您必须在 Secrets Manager 中为每个存储 Compose 文件中引用的 Docker 镜像的Amazon Web Services Marketplace注册表创建密钥。有关更多信息,请参阅从私有存储库访问 Docker 镜像:
-
-
如果您的 Docker Compose 文件引用了来自 Amazon ECR 以外的注册表(例如 Docker Hub)中的私有存储库的 Docker 镜像,则连接器还具有以下要求:
-
Amazon IoT Greengrass必须配置为支持本地密钥,如密钥要求中所述。连接器仅使用此功能从中检索您的密钥Amazon Secrets Manager,而不是存储它们。
-
您必须在 Secrets Manager 中为每个存储 Compose 文件中引用的 Docker 镜像的私有仓库创建密钥。有关更多信息,请参阅从私有存储库访问 Docker 镜像:
-
-
当您部署包含此连接器的 Greengrass 组时,Docker 守护程序必须正在运行。
从私有存储库访问 Docker 镜像
如果您使用凭证问 Docker 镜像,则必须允许连接器访问它们。您执行此操作的方式取决于 Docker 镜像的位置。
对于存储的 Amazon ECR 的 Docker 镜像,您授予以 Greengrass 群组角色获取授权令牌的权限。有关更多信息,请参阅要求:
对于存储在其他私有存储库或镜像仓库中的 Docker 镜像,您必须在 Amazon Secrets Manager 中创建一个密钥来存储您的登录信息。这包括您在 Amazon Web Services Marketplace 中订阅的 Docker 镜像。为每个存储库创建一个密钥。如果您在 Secrets Manager 中更新您的密钥,则更改将在您下次部署群组时传播到核心。
注意
Secrets Manager 是一项服务,您可以使用它在中安全地存储和管理您的证书、密钥和其他机密Amazon Web Services 云。有关更多信息,请参阅《Amazon Secrets Manager 用户指南》中的什么是 Amazon Secrets Manager?。
每个密钥必须包含以下键:
键 |
值 |
---|---|
|
用于访问存储库或镜像仓库的用户名。 |
|
用于访问存储库或镜像仓库的密码。 |
|
镜像仓库的终端节点。这必须与 Compose 文件中相应的镜像仓库 URL 匹配。 |
注意
要默认允许 Amazon IoT Greengrass 访问密钥,密钥的名称必须以 greengrass- 开头。否则,您的 Greengrass 服务角色必须授予访问权限。有关更多信息,请参阅允许 Amazon IoT Greengrass 获取密钥值:
- 从 Amazon Web Services Marketplace 获取 Docker 镜像的登录信息
-
-
使用
aws ecr get-login-password
命令从中Amazon Web Services Marketplace获取 Docker 镜像的密码。有关更多信息,请参阅《Amazon CLI 命令参考》中的 get-login-password。aws ecr get-login-password
-
检索 Docker 镜像的注册表网址。打开Amazon Web Services Marketplace网站,然后打开容器产品启动页面。在 “容器镜像” 下,选择 “查看容器映像详细信息” 以找到用户名和注册表 URL。
使用检索到的用户名、密码和注册表 URL 为存储 Compose 文件中引用的 Docker 镜像的每个Amazon Web Services Marketplace注册表创建密钥。
-
- 创建密钥(控制台)
-
在 Amazon Secrets Manager 控制台中,选择其他密钥类型。在 Specify the key-value pairs to be stored for this secret (指定要为此密钥存储的键值对) 下,添加针对
username
、password
和registryUrl
的行。有关更多信息,请参阅Amazon Secrets Manager用户指南中的创建基本密钥。 - 创建密钥 (CLI)
-
在中Amazon CLI,使用 Secre
create-secret
ts Manager 命令,如以下示例中所示。有关更多信息,请参阅《Amazon CLI命令参考》中的 create-sec ret。aws secretsmanager create-secret --name greengrass-MySecret --secret-string [{"username":"Mary_Major"},{"password":"abc123xyz456"},{"registryUrl":"https://docker.io"}]
重要
您有责任保护用于存储 Docker Compose 文件的DockerComposeFileDestinationPath
目录以及来自私有存储库的 Docker 镜像的凭证。有关更多信息,请参阅安全说明:
参数
该连接器提供以下参数:
创建连接器示例 (Amazon CLI)
以下 CLI 命令ConnectorDefinition
使用包含 Greengrass Docker 应用程序部署连接器的初始版本创建一个。
aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyDockerAppplicationDeploymentConnector", "ConnectorArn": "arn:aws:greengrass:
region
::/connectors/DockerApplicationDeployment/versions/5", "Parameters": { "DockerComposeFileS3Bucket": "myS3Bucket", "DockerComposeFileS3Key": "production-docker-compose.yml", "DockerComposeFileS3Version": "123", "DockerComposeFileDestinationPath": "/home/username/myCompose", "DockerUserId": "1000", "AWSSecretsArnList": "[\"arn:aws:secretsmanager:region
:account-id
:secret:greengrass-secret1-hash
\",\"arn:aws:secretsmanager:region
:account-id
:secret:greengrass-secret2-hash
\"]", "DockerContainerStatusLogFrequency": "30", "ForceDeploy": "True", "DockerPullBeforeUp": "True" } } ] }'
注意
此连接器中的 Lambda 函数具有很长的生命周期。
输入数据
此连接器不需要或接受输入数据。
输出数据
此连接器将 docker-compose up
命令的状态发布为输出数据。
- 订阅中的主题筛选条件
-
dockerapplicationdeploymentconnector/message/status
- 示例输出:成功
-
{ "status":"success", "GreengrassDockerApplicationDeploymentStatus":"Successfully triggered docker-compose up", "S3Bucket":"myS3Bucket", "ComposeFileName":"production-docker-compose.yml", "ComposeFileVersion":"123" }
- 示例输出:失败
-
{ "status":"fail", "error_message":"
description of error
", "error":"InvalidParameter" }错误类型可以是
InvalidParameter
或InternalError
。
在 Amazon IoT Greengrass 核心上设置 Docker 用户
Greengrass Docker 应用程序部署连接器以您为DockerUserId
参数指定的用户身份运行。如果不指定值,则连接器将以 ggc_user
身份运行,这是默认的 Greengrass 访问标识。
要允许连接器与 Docker 守护程序交互,Docker 用户必须属于核心上的 docker
Linux 组。Docker 用户还必须具有对 DockerComposeFileDestinationPath
目录的写入权限。这是连接器存储本地 docker-compose.yml
文件和 Docker 凭证的位置。
注意
-
我们建议您创建 Linux 用户,而不是使用默认
ggc_user
。否则,Greengrass 组中的任何 Lambda 函数都可以访问 Compose 文件和 Docker 证书。 -
除非绝对有必要,否则建议避免以根用户身份运行。如果您指定了根用户,则必须允许 Lambda 函数以 root 身份在Amazon IoT Greengrass核心上运行。有关更多信息,请参阅以根用户身份运行 Lambda 函数:
-
创建用户。您可以运行
useradd
命令并包含用于分配 UID 的可选-u
选项。例如:sudo useradd -u
1234
user-name
-
将用户添加到核心上的
docker
组。例如:sudo usermod -aG docker
user-name
有关详细信息,包括如何创建
docker
组,请参阅 Docker 文档中的以非 root 用户身份管理 Docker。 -
授予用户写入为
DockerComposeFileDestinationPath
参数指定的目录的权限。例如:-
将用户设置为目录的所有者。此示例使用步骤 1 中的 UID。
chown
1234
docker-compose-file-destination-path
-
为所有者授予读写权限。
chmod 700
docker-compose-file-destination-path
有关详细信息,请参阅 Linux Foundation 文档中的如何在 Linux 中管理文件和文件夹权限
。 -
如果您在创建用户时没有分配 UID,或者使用现有用户,请运行
id
命令查找 UID。id -u
user-name
您可以使用 UID 配置连接器的
DockerUserId
参数。
-
使用情况信息
当您在使用 Greengrass Docker 应用程序部署连接器时,您应了解:以下特定于实现的使用信息。
-
修复了项目名称的前缀。连接器将
greengrassdockerapplicationdeployment
前缀附加到其启动的 Docker 容器的名称前面。连接器在它所运行的docker-compose
命令中使用此前缀作为项目名称。 -
记录行为。连接器将状态信息和疑难解答信息写入日志文件。您可以配置为将日志发送Amazon IoT Greengrass到 CloudWatch 日志并在本地写入日志。有关更多信息,请参阅连接器的日志记录:这是连接器的本地日志的路径:
/
greengrass-root
/ggc/var/log/user/region
/aws/DockerApplicationDeployment.log您必须具有 root 权限才能访问本地日志。
-
正在更新 Docker 镜像。Docker 在核心设备上缓存镜像。如果您更新 Docker 镜像并希望将更改传播到核心设备,请确保更改 Compose 文件中镜像的标签。更改将在部署 Greengrass 组后生效。
-
清理操作超时 10 分钟。当 Greengrass 守护程序在重新启动期间停止时,
docker-compose down
命令即会启动。所有 Docker 容器在启动后docker-compose down
最多有 10 分钟的时间来执行任何清理操作。如果清理未在 10 分钟内完成,则必须手动清理剩余的容器。有关更多信息,请参阅 Docker CLI 文档中的 docker rm。 -
正在运行 Docker 命令。要解决问题,您可以在核心设备上的终端窗口中运行 Docker 命令。例如,运行以下命令以查看由连接器启动的 Docker 容器:
docker ps --filter name="greengrassdockerapplicationdeployment"
-
预留资源 ID。连接器使用它在 Greengrass 组中创建的 Greengrass 资源的
DOCKER_DEPLOYER_SECRET_RESOURCE_RESERVED_ID_
ID。资源 ID 在组中必须是唯一的,因此不要分配可能与此保留资源 ID 冲突的资源 ID。index
-
离线模式。当您将
DockerOfflineMode
配置参数设置为时True
,Docker 连接器可以在离线模式下运行。当核心设备处于脱机状态时 Greengrass 群组部署重新启动,并且连接器无法建立与 Amazon S3 或 Amazon ECR 的连接以检索 Docker Compose 文件时,就会发生这种情况。启用离线模式后,连接器会尝试下载您的 Compose 文件,并像正常重启一样运行
docker login
命令。如果这些尝试失败,则连接器将在使用DockerComposeFileDestinationPath
参数指定的文件夹中查找本地存储的 Compose 文件。如果存在本地 Compose 文件,则连接器会按照正常的docker-compose
命令顺序从本地图像中提取。如果 Compose 文件或本地图像不存在,则连接器将失败。ForceDeploy
和StopContainersOnNewDeployment
参数的行为在离线模式下保持不变。
与 Docker 容器通信
Amazon IoT Greengrass 支持 Greengrass 组件和 Docker 容器之间的以下通信通道:
-
Greengrass Lambda 函数可以使用 REST API 与 Docker 容器中的进程进行通信。您可以在 Docker 容器中设置服务器来打开端口。Lambda 函数可以在此端口上与容器通信。
-
Docker 容器中的进程可以通过本地 Greengrass 消息代理交换 MQTT 消息。您可以将 Docker 容器设置为 Greengrass 组中的客户端设备,然后创建订阅以允许容器与 Greengrass Lambda 函数、客户端设备和组中的其他连接器通信,或者与Amazon IoT本地影子服务通信。有关更多信息,请参阅配置 MQTT 与 Docker 容器的通信:
-
Greengrass Lambda 函数可以更新共享文件以将信息传递给 Docker 容器。您可以使用 Compose 文件绑定装载 Docker 容器的共享文件路径。
配置 MQTT 与 Docker 容器的通信
您可以将 Docker 容器配置为客户端设备并将其添加到 Greengrass 组中。然后,您可以创建允许在 Docker 容器和 Greengrass 组件或 Amazon IoT 之间进行 MQTT 通信的订阅。在以下过程中,您将创建允许 Docker 容器设备从本地影子服务接收影子更新消息的订阅。您可以按照此模式创建其他订阅。
注意
此过程假设您已经创建了 Greengrass 群组和 Greengrass 核心(v1.10 或更高版本)。有关创建 Greengrass 组和核心的信息,请参阅Amazon IoT Greengrass 入门。
将 Docker 容器配置为客户端设备并将其添加到 Greengrass 组
-
在核心设备上创建一个文件夹,用于存储用于验证 Greengrass 设备的证书和密钥。
文件路径必须装载在要启动的 Docker 容器上。以下代码段显示如何在您的 Compose 文件中装载文件路径。在此示例中,
path-to-device-certs
表示您在此步骤中创建的文件夹。version: '3.3' services: myService: image:
user-name
/repo
:image-tag
volumes: - /path-to-device-certs
/:/path-accessible-in-container
在Amazon IoT控制台导航窗格的 “管理” 下,展开 Greengrass 设备,然后选择群组 (V1)。
选择目标组。
-
在组配置页面上,选择客户端设备,然后选择关联。
-
在 “将客户端设备与此组关联起来” 模式中,选择 “创建新Amazon IoT事物”。
创建事物页面将在新选项卡中打开。
-
在 “创建事物” 页面上,选择 “创建单个事物”,然后选择 “下一步”。
-
在 “指定事物属性” 页面上,输入设备的名称,然后选择 “下一步”。
-
在配置设备证书页面上,选择下一步。
-
在 “将策略附加到证书” 页面上,执行以下操作之一:
-
选择授予客户端设备所需权限的现有策略,然后选择 “创建事物”。
将打开一个模式,您可以在其中下载设备用于连接和核心的证书Amazon Web Services 云和密钥。
-
创建并附加授予客户端设备权限的新策略。执行以下操作:
-
选择 Create policy(创建策略)。
此时将在新选项卡中打开创建策略页面。
-
在创建策略页面上,执行以下操作:
-
对于策略名称,输入可描述策略的名称,如
GreengrassV1ClientDevicePolicy
。 -
在 “政策声明” 选项卡的 “策略文档” 下,选择 JSON。
-
输入以下策略文档。此策略允许客户端设备发现 Greengrass 内核并就所有 MQTT 主题进行通信。有关如何限制此策略访问权限的信息,请参阅Amazon IoT Greengrass 的设备身份验证和授权。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Connect", "iot:Receive" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": [ "*" ] } ] }
-
选择 Create(创建)以创建策略。
-
-
返回到浏览器选项卡,并打开 “将策略附加到证书” 页面。执行以下操作:
-
在策略列表中,选择您创建的策略,例如GreengrassV1ClientDevicePolicy。
如果您未看到策略,请选择 Refresh(刷新)按钮。
-
选择 Create thing(创建事物)。
将打开一个模式,您可以在其中下载设备用于连接和核心的证书Amazon Web Services 云和密钥。
-
-
-
-
在下载证书和密钥模式中,下载设备的证书。
重要
在选择 “完成” 之前,请下载安全资源。
执行以下操作:
-
对于设备证书,选择下载以下载设备证书。
-
对于公钥文件,选择下载以下载证书的公钥。
-
对于私钥文件,选择下载以下载证书的私钥文件。
-
查看《Amazon IoT开发者指南》中的服务器身份验证,然后选择相应的根 CA 证书。我们建议您使用亚马逊信任服务 (ATS) 终端节点和 ATS 根 CA 证书。在根 CA 证书下,为根 CA 证书选择下载。
-
选择完成。
记下设备证书和密钥文件名中常见的证书 ID。稍后您将需要用到它。
-
-
将证书和密钥复制到您在步骤 1 中创建的文件夹。
接下来,在组中创建订阅。对于此示例,您创建一个订阅,以允许 Docker 容器设备从本地影子服务接收 MQTT 消息。
注意
影子文档的最大大小为 8 KB。有关更多信息,请参阅《Amazon IoT 开发人员指南》中的 Amazon IoT 配额。
创建允许 Docker 容器设备从本地影子服务接收 MQTT 消息的订阅。
-
在选择您的源和目标页面,配置源和目标,如下所示:
-
对于选择源,选择服务,然后选择本地影子服务。
-
对于 Select a target (选择目标),选择 Devices (设备),然后选择您的设备。
-
选择 Next(下一步)。
-
在 “使用主题筛选数据” 页面上,对于 “主题” 筛选器,选择
$aws/things/
,然后选择 “下一步”。MyDockerDevice
/shadow/update/acceptedMyDockerDevice
替换为你之前创建的设备的名称。 -
选择 Finish (结束)。
-
在您的 Compose 文件中引用的 Docker 镜像中包含以下代码段。这是 Greengrass 设备代码。此外,在 Docker 容器中添加代码,以启动容器内的 Greengrass 设备。它可以作为一个单独的进程在镜像或单独的线程中运行。
import os import sys import time import uuid from AWSIoTPythonSDK.core.greengrass.discovery.providers import DiscoveryInfoProvider from AWSIoTPythonSDK.exception.AWSIoTExceptions import DiscoveryInvalidRequestException from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient # Replace thingName with the name you registered for the Docker device. thingName = "MyDockerDevice" clientId = thingName # Replace host with the IoT endpoint for your &AWS-account;. host = "myPrefix.iot.region.amazonaws.com" # Replace topic with the topic where the Docker container subscribes. topic = "$aws/things/MyDockerDevice/shadow/update/accepted" # Replace these paths based on the download location of the certificates for the Docker container. rootCAPath = "/path-accessible-in-container/AmazonRootCA1.pem" certificatePath = "/path-accessible-in-container/certId-certificate.pem.crt" privateKeyPath = "/path-accessible-in-container/certId-private.pem.key" # Discover Greengrass cores. discoveryInfoProvider = DiscoveryInfoProvider() discoveryInfoProvider.configureEndpoint(host) discoveryInfoProvider.configureCredentials(rootCAPath, certificatePath, privateKeyPath) discoveryInfoProvider.configureTimeout(10) # 10 seconds. GROUP_CA_PATH = "./groupCA/" MQTT_QOS = 1 discovered = False groupCA = None coreInfo = None try: # Get discovery info from AWS IoT. discoveryInfo = discoveryInfoProvider.discover(thingName) caList = discoveryInfo.getAllCas() coreList = discoveryInfo.getAllCores() # Use first discovery result. groupId, ca = caList[0] coreInfo = coreList[0] # Save the group CA to a local file. groupCA = GROUP_CA_PATH + groupId + "_CA_" + str(uuid.uuid4()) + ".crt" if not os.path.exists(GROUP_CA_PATH): os.makedirs(GROUP_CA_PATH) groupCAFile = open(groupCA, "w") groupCAFile.write(ca) groupCAFile.close() discovered = True except DiscoveryInvalidRequestException as e: print("Invalid discovery request detected!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) print("Stopping...") except BaseException as e: print("Error in discovery!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) print("Stopping...") myAWSIoTMQTTClient = AWSIoTMQTTClient(clientId) myAWSIoTMQTTClient.configureCredentials(groupCA, privateKeyPath, certificatePath) # Try to connect to the Greengrass core. connected = False for connectivityInfo in coreInfo.connectivityInfoList: currentHost = connectivityInfo.host currentPort = connectivityInfo.port myAWSIoTMQTTClient.configureEndpoint(currentHost, currentPort) try: myAWSIoTMQTTClient.connect() connected = True except BaseException as e: print("Error in connect!") print("Type: %s" % str(type(e))) print("Error message: %s" % str(e)) if connected: break if not connected: print("Cannot connect to core %s. Exiting..." % coreInfo.coreThingArn) sys.exit(-2) # Handle the MQTT message received from GGShadowService. def customCallback(client, userdata, message): print("Received an MQTT message") print(message) # Subscribe to the MQTT topic. myAWSIoTMQTTClient.subscribe(topic, MQTT_QOS, customCallback) # Keep the process alive to listen for messages. while True: time.sleep(1)
安全说明
当您在使用 Greengrass Docker 应用程序部署连接器时,请注意以下安全注意事项:
-
Docker Compose 文件的本地存储
连接器将 Compose 文件的副本存储在为
DockerComposeFileDestinationPath
参数指定的目录中。您负责确保此目录安全。您应该使用文件系统权限来限制对目录的访问。
-
Docker 凭证的本地存储
如果 Docker 镜像存储在私有存储库中,则连接器将 Docker 凭证存储在为
DockerComposeFileDestinationPath
参数指定的目录中。您负责保护这些证书。例如,在安装 Docker Engine 时,应在核心设备上使用 credential-helper
。 -
从可信来源安装 Docker Engine
您负责从可信来源安装 Docker Engine。此连接器使用核心设备上的 Docker 守护程序访问您的 Docker 资产并管理 Docker 容器。
-
Greengrass 组角色权限的范围
您在 Greengrass 组角色中添加的权限可以由 Greengrass 组中的所有 Lambda 函数和连接器承担。此连接器需要访问存储在 S3 存储桶中的 Docker Compose 文件。如果您的 Docker 镜像存储在 Amazon ECR 的私有存储库中,则还需要访问您的 Amazon ECR 授权令牌。
许可证
Greengrass Docker 应用程序部署连接器包括以下第三方软件/许可:
-
Amazon SDK for Python (Boto3)
/Apache 许可证 2.0 -
botocore
/Apache 许可证 2.0 -
dateutil
/PSF 许可证 -
docutils
/BSD 许可证,GNU 通用公共许可证 (GPL),Python 软件基金会许可证,公共领域 -
jmespath
/MIT 许可证 -
s3transfer
/Apache 许可证 2.0 -
urllib3
/MIT 许可证
此连接器根据 Greengrass 核心软件许可协议
更改日志
下表说明每个版本的连接器更改。
版本 |
更改 |
---|---|
7 |
|
6 |
添加了 |
5 |
图像在运行之前被拉取 |
4 |
添加了更新 Docker 镜像的 pull-before-up 行为。 |
3 |
修复了查找环境变量的问题。 |
2 |
添加了 |
1 |
首次发布。 |
Greengrass 组一次只能包含连接器的一个版本。有关升级连接器版本的信息,请参阅升级连接器版本。