Amazon IoT Greengrass在具有手动资源配置的 Docker 容器中运行 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon IoT Greengrass在具有手动资源配置的 Docker 容器中运行

本教程向您展示如何使用手动配置的资源在 Docker 容器中安装和运行Amazon IoT Greengrass核心软件。Amazon

先决条件

要完成本教程,您需要:

检索Amazon IoT端点

获取您的终Amazon IoT端节点Amazon Web Services 账户,然后保存它们以供日后使用。您的设备使用这些端点来连接Amazon IoT。执行以下操作:

  1. 为您获取Amazon IoT数据终端节点Amazon Web Services 账户。

    aws iot describe-endpoint --endpoint-type iot:Data-ATS

    如果请求成功,则响应看起来与以下示例类似。

    { "endpointAddress": "device-data-prefix-ats.iot.us-west-2.amazonaws.com" }
  2. 获取您的Amazon IoT证书终端节点Amazon Web Services 账户。

    aws iot describe-endpoint --endpoint-type iot:CredentialProvider

    如果请求成功,则响应看起来与以下示例类似。

    { "endpointAddress": "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com" }

创建一个Amazon IoT东西

Amazon IoT事物表示连接到的设备和逻辑实体Amazon IoT。Greengrass 的核心设备就是Amazon IoT东西。当您将设备注册为Amazon IoT事物时,该设备可以使用数字证书进行身份验证Amazon。

在本节中,您将创建一个代表您的设备Amazon IoT的事物。

创造事Amazon IoT物
  1. 为你的设备创建一个Amazon IoT东西。在您的开发计算机上,运行以下命令。

    • MyGreengrassCore替换为要使用的事物名称。这个名字也是你的 Greengrass 核心设备的名称。

      注意

      事物名称不能包含冒号 (:) 字符。

    aws iot create-thing --thing-name MyGreengrassCore

    如果请求成功,则响应看起来与以下示例类似。

    { "thingName": "MyGreengrassCore", "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore", "thingId": "8cb4b6cd-268e-495d-b5b9-1713d71dbf42" }
  2. (可选)将Amazon IoT事物添加到新的或现有的事物组。你可以使用事物组来管理 Greengrass 核心设备的队列。将软件组件部署到设备时,可以将单个设备或设备组作为目标。您可以将设备添加到具有活跃 Greengrass 部署的事物组,以便将该事物组的软件组件部署到该设备。执行以下操作:

    1. (可选)创建Amazon IoT事物组。

      • MyGreengrassCoreGroup替换为要创建的事物组的名称。

        注意

        事物组名称不能包含冒号 (:) 字符。

      aws iot create-thing-group --thing-group-name MyGreengrassCoreGroup

      如果请求成功,则响应看起来与以下示例类似。

      { "thingGroupName": "MyGreengrassCoreGroup", "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/MyGreengrassCoreGroup", "thingGroupId": "4df721e1-ff9f-4f97-92dd-02db4e3f03aa" }
    2. 将Amazon IoT事物添加到事物组。

      • MyGreengrassCore用你的Amazon IoT东西的名字代替。

      • MyGreengrassCoreGroup替换为事物组的名称。

      aws iot add-thing-to-thing-group --thing-name MyGreengrassCore --thing-group-name MyGreengrassCoreGroup

      如果请求成功,该命令没有任何输出。

创建事物证书

当您将设备注册为Amazon IoT事物时,该设备可以使用数字证书进行身份验证Amazon。此证书允许设备与Amazon IoT和通信Amazon IoT Greengrass。

在本节中,您将创建和下载您的设备可用于连接的证书Amazon。

创建事物证书
  1. 创建一个文件夹,用于下载Amazon IoT事物的证书。

    mkdir greengrass-v2-certs
  2. 创建和下载Amazon IoT事物的证书。

    aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile greengrass-v2-certs/device.pem.crt --public-key-outfile greengrass-v2-certs/public.pem.key --private-key-outfile greengrass-v2-certs/private.pem.key

    如果请求成功,则响应看起来与以下示例类似。

    { "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4", "certificateId": "aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4", "certificatePem": "-----BEGIN CERTIFICATE----- MIICiTCCAfICCQD6m7oRw0uXOjANBgkqhkiG9w 0BAQUFADCBiDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZ WF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIw EAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5 jb20wHhcNMTEwNDI1MjA0NTIxWhcNMTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBh MCVVMxCzAJBgNVBAgTAldBMRAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBb WF6b24xFDASBgNVBAsTC0lBTSBDb25zb2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMx HzAdBgkqhkiG9w0BCQEWEG5vb25lQGFtYXpvbi5jb20wgZ8wDQYJKoZIhvcNAQE BBQADgY0AMIGJAoGBAMaK0dn+a4GmWIWJ21uUSfwfEvySWtC2XADZ4nB+BLYgVI k60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9TrDHudUZg3qX4waLG5M43q7Wgc/MbQ ITxOUSQv7c7ugFFDzQGBzZswY6786m86gpEIbb3OhjZnzcvQAaRHhdlQWIMm2nr AgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4nUhVVxYUntneD9+h8Mg9q6q+auN KyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0FkbFFBjvSfpJIlJ00zbhNYS5f6Guo EDmFJl0ZxBHjJnyp378OD8uTs7fLvjx79LjSTbNYiytVbZPQUQ5Yaxu2jXnimvw 3rrszlaEXAMPLE= -----END CERTIFICATE-----", "keyPair": { "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\nMMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\n59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\nhJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\nFQIDAQAB\n-----END PUBLIC KEY-----\n", "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nkey omitted for security reasons\n-----END RSA PRIVATE KEY-----\n" } }

    保存证书的 Amazon 资源名称 (ARN),以便稍后用于配置证书。

配置事物证书

将事物证书附加到您之前创建Amazon IoT的事物上,然后向证书添加Amazon IoT策略以定义核心设备的Amazon IoT权限。

配置事物的证书
  1. 将证书附在Amazon IoT东西上。

    • MyGreengrassCore用你的Amazon IoT东西的名字代替。

    • 将证书亚马逊资源名称 (ARN) 替换为您在上一步中创建的证书的 ARN。

    aws iot attach-thing-principal --thing-name MyGreengrassCore --principal arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4

    如果请求成功,该命令没有任何输出。

  2. 创建并附加定义您的 Greengrass 核心设备Amazon IoT权限的Amazon IoT策略。以下策略允许访问所有 MQTT 主题和 Greengrass 操作,因此您的设备可与需要新 Greengrass 操作的自定义应用程序和未来更改一起使用。您可以根据自己的用例限制此政策。有关更多信息,请参阅Amazon IoT Greengrass V2核心设备的最低Amazon IoT政策

    如果您之前设置过 Greengrass 核心设备,则可以附加其Amazon IoT策略而不是创建新设备。

    执行以下操作:

    1. 创建一个包含 Greengrass 核心设备所需的Amazon IoT策略文档的文件。

      例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

      nano greengrass-v2-iot-policy.json

      将以下 JSON 复制到文件中。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Receive", "iot:Connect", "greengrass:*" ], "Resource": [ "*" ] } ] }
    2. 从Amazon IoT策略文档创建策略。

      • Greengrassv2IoT ThingPolicy 替换为要创建的策略的名称。

      aws iot create-policy --policy-name GreengrassV2IoTThingPolicy --policy-document file://greengrass-v2-iot-policy.json

      如果请求成功,则响应看起来与以下示例类似。

      { "policyName": "GreengrassV2IoTThingPolicy", "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassV2IoTThingPolicy", "policyDocument": "{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Action\": [ \"iot:Publish\", \"iot:Subscribe\", \"iot:Receive\", \"iot:Connect\", \"greengrass:*\" ], \"Resource\": [ \"*\" ] } ] }", "policyVersionId": "1" }
    3. 将Amazon IoT政策附加到Amazon IoT事物的证书上。

      • Greengrassv2IoT ThingPolicy 替换为要附加的策略的名称。

      • 将目标 ARN 替换为您的Amazon IoT事物的证书的 ARN。

      aws iot attach-policy --policy-name GreengrassV2IoTThingPolicy --target arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4

      如果请求成功,该命令没有任何输出。

创建代币交换角色

Greengrass 核心设备使用 IAM 服务角色(称为代币交换角色)来授权对Amazon服务的调用。设备使用Amazon IoT证书提供者获取此角色的临时Amazon证书,这允许设备与Amazon IoT之交互、向 A CloudWatch mazon Logs 发送日志以及从 Amazon S3 下载自定义组件构件。有关更多信息,请参阅授权核心设备与Amazon服务

您可以使用Amazon IoT角色别名为 Greengrass 核心设备配置令牌交换角色。角色别名使您可以更改设备的令牌交换角色,但保持设备配置不变。有关更多信息,请参阅Amazon IoT Core开发人员指南中的授权直接调用Amazon服务

在本节中,您将创建代币交换 IAM 角色和指向该Amazon IoT角色的角色别名。如果您已经设置了 Greengrass 核心设备,则可以使用其代币交换角色和角色别名,而不是创建新的代币交换角色和角色别名。然后,你将设备的Amazon IoT东西配置为使用该角色和别名。

创建代币交换 IAM 角色
  1. 创建一个 IAM 角色,您的设备可以将其用作令牌交换角色。执行以下操作:

    1. 创建一个包含令牌交换角色所需的信任策略文档的文件。

      例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

      nano device-role-trust-policy.json

      将以下 JSON 复制到文件中。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    2. 使用信任策略文档创建代币交换角色。

      • GreenGrassv2 TokenExchangeRole 替换为要创建的 IAM 角色的名称。

      aws iam create-role --role-name GreengrassV2TokenExchangeRole --assume-role-policy-document file://device-role-trust-policy.json

      如果请求成功,则响应看起来与以下示例类似。

      { "Role": { "Path": "/", "RoleName": "GreengrassV2TokenExchangeRole", "RoleId": "AROAZ2YMUHYHK5OKM77FB", "Arn": "arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole", "CreateDate": "2021-02-06T00:13:29+00:00", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "credentials.iot.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } }
    3. 创建一个包含令牌交换角色所需的访问策略文档的文件。

      例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

      nano device-role-access-policy.json

      将以下 JSON 复制到文件中。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams", "s3:GetBucketLocation" ], "Resource": "*" } ] }
      注意

      此访问策略不允许访问 S3 存储桶中的组件对象。要在 Amazon S3 中部署定义构件的自定义组件,您必须向该角色添加权限以允许您的核心设备检索组件构件。有关更多信息,请参阅允许访问 S3 存储桶以获取组件项目

      如果您还没有用于存放组件工件的 S3 存储桶,则可以在创建存储桶后稍后添加这些权限。

    4. 从策略文档创建 IAM 策略。

      • GreenGrassv2 TokenExchangeRoleAccess 替换为要创建的 IAM 策略的名称。

      aws iam create-policy --policy-name GreengrassV2TokenExchangeRoleAccess --policy-document file://device-role-access-policy.json

      如果请求成功,则响应看起来与以下示例类似。

      { "Policy": { "PolicyName": "GreengrassV2TokenExchangeRoleAccess", "PolicyId": "ANPAZ2YMUHYHACI7C5Z66", "Arn": "arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess", "Path": "/", "DefaultVersionId": "v1", "AttachmentCount": 0, "PermissionsBoundaryUsageCount": 0, "IsAttachable": true, "CreateDate": "2021-02-06T00:37:17+00:00", "UpdateDate": "2021-02-06T00:37:17+00:00" } }
    5. 将 IAM 策略附加到代币交换角色。

      • GreenGrassv2 TokenExchangeRole 替换为 IAM 角色的名称。

      • 将策略 ARN 替换为您在上一步中创建的 IAM 策略的 ARN。

      aws iam attach-role-policy --role-name GreengrassV2TokenExchangeRole --policy-arn arn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess

      如果请求成功,该命令没有任何输出。

  2. 创建Amazon IoT指向代币交换角色的角色别名。

    • GreengrassCoreTokenExchangeRoleAlias替换为要创建的角色别名的名称。

    • 将角色 ARN 替换为您在上一步中创建的 IAM 角色的 ARN。

    aws iot create-role-alias --role-alias GreengrassCoreTokenExchangeRoleAlias --role-arn arn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole

    如果请求成功,则响应看起来与以下示例类似。

    { "roleAlias": "GreengrassCoreTokenExchangeRoleAlias", "roleAliasArn": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias" }
    注意

    要创建角色别名,您必须具有将代币交换 IAM 角色传递给的权限Amazon IoT。如果您在尝试创建角色别名时收到错误消息,请检查您的Amazon用户是否具有此权限。有关更多信息,请参阅《用户指南》中的授予Amazon Identity and Access Management用户将角色传递给Amazon服务的权限

  3. 创建并附加一项Amazon IoT策略,允许您的 Greengrass 核心设备使用角色别名担任代币交换角色。如果您之前设置过 Greengrass 核心设备,则可以附加其角色别名Amazon IoT策略,而不是创建新策略。执行以下操作:

    1. (可选)创建一个包含角色别名所需的Amazon IoT策略文档的文件。

      例如,在基于 Linux 的系统上,你可以运行以下命令来使用 GNU nano 来创建文件。

      nano greengrass-v2-iot-role-alias-policy.json

      将以下 JSON 复制到文件中。

      • 将资源 ARN 替换为您的角色别名的 ARN。

      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:AssumeRoleWithCertificate", "Resource": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias" } ] }
    2. 从Amazon IoT策略文档创建策略。

      • GreengrassCoreTokenExchangeRoleAliasPolicy替换为要创建的Amazon IoT策略的名称。

      aws iot create-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --policy-document file://greengrass-v2-iot-role-alias-policy.json

      如果请求成功,则响应看起来与以下示例类似。

      { "policyName": "GreengrassCoreTokenExchangeRoleAliasPolicy", "policyArn": "arn:aws:iot:us-west-2:123456789012:policy/GreengrassCoreTokenExchangeRoleAliasPolicy", "policyDocument": "{ \"Version\":\"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Action\": \"iot:AssumeRoleWithCertificate\", \"Resource\": \"arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias\" } ] }", "policyVersionId": "1" }
    3. 将Amazon IoT政策附加到Amazon IoT事物的证书上。

      • GreengrassCoreTokenExchangeRoleAliasPolicy替换为角色别名Amazon IoT策略的名称。

      • 将目标 ARN 替换为您的Amazon IoT事物的证书的 ARN。

      aws iot attach-policy --policy-name GreengrassCoreTokenExchangeRoleAliasPolicy --target arn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4

      如果请求成功,该命令没有任何输出。

将证书下载到设备

早些时候,您已将设备的证书下载到开发计算机上。在本节中,您将下载亚马逊根证书颁发机构 (CA) 证书。然后,如果您计划在与开发计算机不同的计算机上在 Docker 中运行 Amazon IoT Greengrass Core 软件,则将证书复制到该主机。Amazon IoT GreengrassCore 软件使用这些证书连接到Amazon IoT云服务。

将证书下载到设备
  1. 在您的开发计算机上,下载亚马逊根证书颁发机构 (CA) 证书。 Amazon IoT默认情况下,证书与亚马逊的根 CA 证书相关联。

    Linux or Unix
    sudo curl -o ./greengrass-v2-certs/AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
    Windows Command Prompt (CMD)
    curl -o .\greengrass-v2-certs\AmazonRootCA1.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
    PowerShell
    iwr -Uri https://www.amazontrust.com/repository/AmazonRootCA1.pem -OutFile .\greengrass-v2-certs\AmazonRootCA1.pem
  2. 如果您计划在与开发计算机不同的设备上运行 Docker 中的Amazon IoT Greengrass核心软件,请将证书复制到主计算机。如果在开发计算机和主机计算机上启用了 SSH 和 SCP,则可以在开发计算机上使用scp命令来传输证书。device-ip-address替换为您的主机计算机的 IP 地址。

    scp -r greengrass-v2-certs/ device-ip-address:~

创建配置文件

  1. 在主机上,创建一个用于放置配置文件的文件夹。

    mkdir ./greengrass-v2-config
  2. 使用文本编辑器在./greengrass-v2-config文件夹中创建名为config.yaml的配置文件。

    例如,你可以运行以下命令来使用 GNU nano 来创建。config.yaml

    nano ./greengrass-v2-config/config.yaml
  3. 将以下 YAML 内容复制到文件中。此部分配置文件指定了系统参数和 Greengrass 核参数。

    --- system: certificateFilePath: "/tmp/certs/device.pem.crt" privateKeyPath: "/tmp/certs/private.pem.key" rootCaPath: "/tmp/certs/AmazonRootCA1.pem" rootpath: "/greengrass/v2" thingName: "MyGreengrassCore" services: aws.greengrass.Nucleus: componentType: "NUCLEUS" version: "nucleus-version" configuration: awsRegion: "region" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" iotDataEndpoint: "device-data-prefix-ats.iot.region.amazonaws.com" iotCredEndpoint: "device-credentials-prefix.credentials.region.amazonaws.com"

    然后,替换以下值:

    • /tmp/证书。Docker 容器中的目录,启动容器时将下载的证书装载到该目录。

    • /greengrass/v2。您要用于安装的 Greengrass 根文件夹。您可以使用GGC_ROOT环境变量来设置此值。

    • MyGreengrassCore。Amazon IoT 事物的名称。

    • 核版本。要安装的Amazon IoT Greengrass核心软件版本。此值必须与您下载的 Docker 镜像或 Dockerfile 的版本相匹配。如果你下载了带有latest标签的 Greengrass Docker 镜像,请使用它docker inspect image-id来查看镜像版本。

    • 地区。您创建Amazon IoT资源Amazon Web Services 区域的地方。您还必须为环境文件中的AWS_REGION环境变量指定相同的值。

    • GreengrassCoreTokenExchangeRoleAlias。代币交换角色别名。

    • device-data-prefix。您的Amazon IoT数据终端节点的前缀。

    • device-credentials-prefix。您的Amazon IoT证书终端节点的前缀。

创建环境文件

本教程使用环境文件来设置环境变量,这些变量将传递给 Docker 容器内的 Amazon IoT Greengrass Core 软件安装程序。您还可以在docker run命令中使用-e--env参数在 Docker 容器中设置环境变量,或者可以在docker-compose.yml文件的environment块中设置变量。

  1. 使用文本编辑器创建名为的环境文件.env

    例如,在基于 Linux 的系统上,您可以运行以下命令来使用 GNU nano 在当前目录.env中创建。

    nano .env
  2. 将以下内容复制到文件中。

    GGC_ROOT_PATH=/greengrass/v2 AWS_REGION=region PROVISION=false COMPONENT_DEFAULT_USER=ggc_user:ggc_group INIT_CONFIG=/tmp/config/config.yaml

    然后,替换以下值。

    • /greengrass/v2。用于安装 Amazon IoT Greengrass Core 软件的根文件夹路径。

    • 地区。您创建Amazon IoT资源Amazon Web Services 区域的地方。必须为配置文件中的awsRegion配置参数指定相同的值。

    • /tmp/config/。启动 Docker 容器时装载配置文件的文件夹。

    注意

    您可以将DEPLOY_DEV_TOOLS环境变量设置为true以部署 Greengrass CLI 组件,这使您能够在 Docker 容器内开发自定义组件。我们建议您仅在开发环境中使用此组件,而不是在生产环境中使用。此组件提供对生产环境中通常不需要的信息和操作的访问。遵循最小权限原则,将此组件仅部署到需要它的核心设备上。

在容器中运行 Amazon IoT Greengrass Core 软件

本教程向您展示如何启动在 Docker 容器中构建的 Docker 镜像。你可以使用 Docker CLI 或 Docker Compose CLI 在 Docker 容器中运行Amazon IoT Greengrass核心软件镜像。

Docker
  • 本教程向您展示如何启动在 Docker 容器中构建的 Docker 镜像。

    docker run --rm --init -it --name docker-image \ -v path/to/greengrass-v2-config:/tmp/config/:ro \ -v path/to/greengrass-v2-certs:/tmp/certs:ro \ --env-file .env \ -p 8883 \ your-container-image:version

    此示例命令使用以下参数进行 docker 运行

    • --rm。 在容器退出时清理容器。

    • --init。 在容器中使用初始化进程。

      注意

      停止 Docker 容器时,需要使用该--init参数来关闭Amazon IoT Greengrass核心软件。

    • -it。 (可选)作为交互式进程在前台运行 Docker 容器。你可以将其替换为-d参数,改为在分离模式下运行 Docker 容器。有关更多信息,请参阅 Docker 文档中的分离式与前景

    • --name。 运行名为的容器 aws-iot-greengrass

    • -v。 在 Docker 容器中装入一个卷,使配置文件和证书文件可以在容器内Amazon IoT Greengrass运行。

    • --env-file。 (可选)指定环境文件以设置环境变量,这些变量将传递给 Docker 容器内的 Amazon IoT Greengrass Core 软件安装程序。仅当您创建了用于设置环境变量的环境文件时,才需要此参数。如果您没有创建环境文件,则可以使用--env参数直接在 Docker run 命令中设置环境变量。

    • -p。 (可选)将 8883 容器端口发布到主机。如果您想通过 MQTT 进行连接和通信,则此参数是必需的,因为Amazon IoT Greengrass使用 8883 端口 MQTT 流量。要打开其他端口,请使用其他-p参数。

    注意

    要以更高的安全性运行 Docker 容器,您可以使用--cap-drop--cap-add参数有选择地为容器启用 Linux 功能。有关更多信息,请参阅 Docker 文档中的运行时权限和 Linux 功能

Docker Compose
  1. 使用文本编辑器创建名docker-compose.yml为的 Docker Compose 文件。

    例如,在基于 Linux 的系统上,您可以运行以下命令来使用 GNU nano 在当前目录docker-compose.yml中创建。

    nano docker-compose.yml
    注意

    您也可以从中下载和使用Amazon提供的 Compose 文件的最新GitHub版本。

  2. 将以下内容添加到 Compose 文件中。您的文件应类似于以下示例。将:版本替换为你的 D your-container-nameo cker 镜像的名称。

    version: '3.7' services: greengrass: init: true build: context: . container_name: aws-iot-greengrass image: your-container-name:version volumes: - /path/to/greengrass-v2-config:/tmp/config/:ro - /path/to/greengrass-v2-certs:/tmp/certs:ro env_file: .env ports: - "8883:8883"

    此示例 Compose 文件中的以下参数是可选的:

    • ports—将 8883 容器端口发布到主机。如果您想通过 MQTT 进行连接和通信,则此参数是必需的,因为 MQTT 流量Amazon IoT Greengrass使用端口 8883。

    • env_file—指定环境文件以设置环境变量,这些变量将传递给 Docker 容器内的 Amazon IoT Greengrass Core 软件安装程序。仅当您创建了用于设置环境变量的环境文件时,才需要此参数。如果您没有创建环境文件,则可以使用环境参数直接在 Compose 文件中设置变量。

    注意

    要以更高的安全性运行 Docker 容器,您可以在 Compose 文件cap_add中使用cap_drop和有选择地为容器启用 Linux 功能。有关更多信息,请参阅 Docker 文档中的运行时权限和 Linux 功能

  3. 运行以下命令启动容器。

    docker-compose -f docker-compose.yml up

后续步骤

Amazon IoT Greengrass核心软件现在在 Docker 容器中运行。运行以下命令以检索当前正在运行的容器的容器 ID。

docker ps

然后,您可以运行以下命令来访问容器并浏览容器内运行的 Amazon IoT Greengrass Core 软件。

docker exec -it container-id /bin/bash

有关创建简单组件的信息,请参步骤 4:在您的设备上开发和测试组件教程:Amazon IoT Greengrass V2 入门

注意

当你使用docker exec在 Docker 容器内运行命令时,这些命令不会记录在 Docker 日志中。要在 Docker 日志中记录您的命令,请将交互式 shell 连接到 Docker 容器。有关更多信息,请参阅将交互式 Shell 附加到 Docker 容器

Amazon IoT Greengrass核心日志文件被调用greengrass.log,位于中/greengrass/v2/logs。组件日志文件也位于同一个目录中。要将 Greengrass 日志复制到主机上的临时目录,请运行以下命令:

docker cp container-id:/greengrass/v2/logs /tmp/logs

如果您想在容器退出或被删除后保留日志,我们建议您仅将该目录绑定挂载到主机上的临时日志/greengrass/v2/logs目录,而不是装载整个 Greengrass 目录。有关更多信息,请参阅在 Docker 容器之外保留 Greengrass 日志

要停止正在运行的 Amazon IoT Greengrass Docker 容器,请运行docker stopdocker-compose -f docker-compose.yml stop。此操作发送SIGTERM到 Greengrass 进程,并关闭容器中启动的所有关联进程。Docker 容器使用docker-init可执行文件初始化为进程 PID 1,这有助于删除所有剩余的僵尸进程。有关更多信息,请参阅 Docker 文档

有关解决在 Docker 容器Amazon IoT Greengrass中运行的问题的信息,请参阅对 Docker 容器中的 Amazon IoT Greengrass 执行问题排查