Docker 應用程式部署連接器 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長壽命階段。如需詳細資訊,請參閱 AWS IoT Greengrass V1 維護政策 。在此日期之後, AWS IoT Greengrass V1 不會發佈提供功能、增強功能、錯誤修正或安全修補程式的更新。在 上執行的裝置 AWS IoT Greengrass V1 不會中斷,並會繼續運作和連線至雲端。我們強烈建議您遷移至 AWS IoT Greengrass Version 2,這會新增重要的新功能,並支援其他平台

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Docker 應用程式部署連接器

Greengrass 碼頭應用程式部署連接器可讓您更輕鬆地在核心上執行 Docker 映像檔。AWS IoT Greengrass連接器使用 Docker Compose 從 docker-compose.yml 檔案啟動多容器 Docker 應用程式。具體而言,連接器會執行 docker-compose 命令來管理單一核心裝置上的 Docker 容器。如需詳細資訊,請參閱 Docker 文件中的 Docker Compose 概觀。該連接器可以訪問存儲在 Docker 容器註冊表中的 Docker 映像,例如 Amazon Elastic Container Registry (Amazon ECR),碼頭集線器和私人碼頭受信任的註冊表。

在您部署 Greengrass 群組之後,連接器會提取最新映像並啟動 Docker 容器。它會執行 docker-compose pull and docker-compose up 命令。然後,連接器會將指令的狀態發佈至輸出 MQTT 主題。它也會記錄有關執行 Docker 容器的狀態資訊。這使您可以監控 Amazon 中的應用程序日誌 CloudWatch。如需詳細資訊,請參閱 使用 AWS IoT Greengrass 日誌進行監控。每次 Greengrass 協助程式重新啟動時,連接器也會啟動 Docker 容器。可在核心上執行的 Docker 容器數量取決於您的硬體。

Docker 容器須在核心設備上的 Greengrass 網域外執行,因此無法存取核心的處理程序間通訊 (IPC)。不過,您可以使用 Greengrass 元件來設定某些通訊管道,例如本機 Lambda 函數。如需詳細資訊,請參閱 與 Docker 容器通訊

您可以使用連接器來處理在核心裝置上託管 Web 伺服器或 MySQL 伺服器等案例。Docker 應用程式中的本機服務可以互相通訊,也能和本機環境中的其他程序以及雲端服務通訊。例如,您可以在核心上執行 Web 伺服器,將 Lambda 函數的請求傳送到雲端中的 Web 服務。

此連接器會以無容器隔離模式執行,因此您可以將其部署到在沒有 Greengrass 容器化的情況下執行的 Greengrass 群組。

此連接器具有下列版本。

版本

ARN

7

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/7

6

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/6

5

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/5

4

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/4

3

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/3

2

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/2

1

arn:aws:greengrass:region::/connectors/DockerApplicationDeployment/versions/1

如需版本變更的詳細資訊,請參閱 Changelog

要求

此連接器有下列要求:

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

    這會設定您的裝置以符合 AWS 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 登入資料的本機複本。如需詳細資訊,請參閱 安全注意事項

    有關在 Amazon Linux 發行版上安裝 Docker 的信息,請參閱 Amazon 彈性容器服務開發人員指南中的 Amazon ECS 碼頭基礎知識

  • 安裝在 Greengrass 核心上的 Docker Composedocker-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

  • 存放在亞馬遜簡單儲存服務 (Amazon S3docker-compose.yml) 中的單一碼頭構成檔案 (例如)。格式必須與安裝在核心上的 Docker Compose 版本相容。在您的核心上使用該文件前,請先測試該文件。如果您在部署 Greengrass 群組後才編輯檔案,則必須重新部署群組,以更新核心上的本機複本。

  • 具有呼叫本機 Docker 協助程式之權限的 Linux 使用者,以及寫入儲存 Compose 檔案本機複本的目錄。如需詳細資訊,請參閱 在核心上設定 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 簡單儲存服務使用者指南中的使用版本控制

    針對群組角色要求,您必須設定角色以授與必要的許可,並確認已將角色新增至群組。如需詳細資訊,請參閱 管理 Greengrass 群組角色 (主控台)管理 Greengrass 群組角色 (CLI)

  • 如果您的碼頭構成檔案參照儲存在 Amazon ECR 中的 Docker 映像,則 Greengrass 群組角色設定為允許下列項目:

    • ecr:GetDownloadUrlForLayer以及在包含 Docker 映像檔的 Amazon ECR 儲存庫上ecr:BatchGetImage執行的動作。

    • 您資源上的 ecr:GetAuthorizationToken 動作。

    存放庫必須AWS 帳戶與AWS 區域連接器位於相同的位置。

    重要

    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 檔案從 AWS Marketplace 中參考 Docker 影像,則連接器也會有下列需求:

  • 如果您的 Docker 撰寫檔案參考來自 Amazon ECR 以外登錄 (例如 Docker Hub) 中私有儲存庫的 Docker 映像,則連接器也會有下列要求:

    • AWS IoT Greengrass必須設定為支援本機密碼,如機密需求中所述。連接器僅使用此功能來擷取您的密碼AWS Secrets Manager,而不是儲存它們。

    • 您必須在 Secrets Manager 中為每個儲存在撰寫檔案中參照的 Docker 映像檔案的私人存放庫建立密碼。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

  • 部署包含此連接器的 Greengrass 群組時,必須執行 Docker 協助程式。

從私有儲存庫存取 Docker 影像

如果您使用登入資料來存取 Docker 影像,則必須允許連接器存取它們。此作法取決於 Docker 影像的位置。

對於存放 Amazon ECR 的 Docker 映像檔,您授予在 Greengrass 群組角色中取得授權權杖的權限。如需詳細資訊,請參閱 要求

針對儲存在其他私有儲存庫或登錄檔中的 Docker 影像,您必須在 AWS Secrets Manager 中建立秘密來儲存您的登入資訊。這包括 AWS Marketplace 中您訂閱的 Docker 影像。為每個儲存庫建立一個秘密。如果您在 Secrets Manager 中更新密碼,則變更會在您下次部署群組時傳播至核心。

注意

Secrets Manager 是一項服務,您可以使用它在中安全地儲存和管理您的認證、金鑰和其他密碼AWS 雲端。如需詳細資訊,請參閱《AWS Secrets Manager 使用者指南》中的什麼是 AWS Secrets Manager?

每個秘密都必須包含下列金鑰:

金鑰

username

用來存取儲存庫或登錄檔的使用者名稱。

password

用來存取儲存庫或登錄的密碼。

registryUrl

登錄檔的端點。這必須符合 Compose 檔案中對應的登錄檔 URL。

注意

為了允許 AWS IoT Greengrass 根據預設存取秘密,秘密名稱必須以 greengrass- 開頭。否則,您的 Greengrass 服務角色必須授與存取權。如需詳細資訊,請參閱 允許 AWS IoT Greengrass 取得秘密值

從 AWS Marketplace 取得 Docker 影像的登入資訊
  1. 使用aws ecr get-login-password命令從中AWS Marketplace獲取 Docker 圖像的密碼。如需詳細資訊,請參閱 AWS CLI 命令參考中的 get-login-password

    aws ecr get-login-password
  2. 擷取泊塢視窗映像檔的登錄網址。開啟AWS Marketplace網站,然後開啟容器產品發佈頁面。在 [容器映像] 下,選擇 [檢視容器映像詳細資料],找出使用者名稱和登錄 URL。

使用擷取的使用者名稱、密碼和登錄 URL,為儲存 Compose 檔案中參照的 Docker 影像的每個AWS Marketplace登錄建立密碼。

建立秘密 (主控台)

在 AWS Secrets Manager 主控台,選擇 Other type of secrets (其他類型的秘密)。在 Specify the key/value pairs to be stored for this secret (指定此秘密要儲存的索引鍵/值組) 下,新增 usernamepasswordregistryUrl 的列。若要取得更多資訊,請參閱《AWS Secrets Manager使用指南》中的〈建立基本密碼

用使用者名稱、密碼和註冊庫 URL 金鑰建立一個秘密。
建立秘密 (CLI)

在中AWS CLI,使用 Secrets Manager create-secret 命令,如下列範例所示。若要取得更多資訊,請參閱《指令參考》中的AWS CLI建立機密

aws secretsmanager create-secret --name greengrass-MySecret --secret-string [{"username":"Mary_Major"},{"password":"abc123xyz456"},{"registryUrl":"https://docker.io"}]
重要

您有責任保護儲存 Docker Compose 檔案的 DockerComposeFileDestinationPath 目錄以及私有儲存庫的 Docker 影像登入資料的安全。如需詳細資訊,請參閱 安全注意事項

參數

此連接器提供下列參數:

Version 7
DockerComposeFileS3Bucket

包含 Docker Compose 檔案的 S3 儲存貯體名稱。建立值區時,請務必遵循 Amazon 簡單儲存服務使用者指南中所述的儲存貯體名稱規則

AWS IoT控制台中的顯示名稱:S3 中的 Docker 撰寫文件

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 [a-zA-Z0-9\\-\\.]{3,63}

DockerComposeFileS3Key

您在 Amazon S3 中碼頭撰寫檔案的物件金鑰。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的物件金鑰和中繼資料。

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 .+

DockerComposeFileS3Version

Amazon S3 中碼頭構成文件的對象版本。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的使用版本控制

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:false

類型:string

有效模式 .+

DockerComposeFileDestinationPath

用來儲存 Docker Compose 檔案複本的本機目錄絕對路徑。這必須是現有目錄。DockerUserId 的指定使用者必須具有在此目錄中建立檔案的權限。如需詳細資訊,請參閱 在 AWS IoT Greengrass 核心上設定 Docker 使用者

重要

儲存 Docker Compose 檔案的目錄以及私有儲存庫的 Docker 影像登入資料的安全。您有責任保護此目錄。如需詳細資訊,請參閱 安全注意事項

AWS IoT主控台中的顯示名稱:本機撰寫檔案的目錄路徑

必要:true

類型:string

有效模式 \/.*\/?

範例:/home/username/myCompose

DockerUserId

連接器用於執行的 Linux 使用者 UID。此使用者必須屬於核心裝置上的 docker Linux 群組,並具有 DockerComposeFileDestinationPath 目錄的寫入權限。如需詳細資訊,請參閱 在核心上設定 Docker 使用者

注意

我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

AWS IoT控制台中的顯示名稱:碼頭用戶 ID

必要:false

類型:string

有效模式:^[0-9]{1,5}$

AWSSecretsArnList

AWS Secrets Manager 中秘密的 Amazon Resource Names (ARN),包含用於存取私有儲存庫中 Docker 影像的登入資訊。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

AWS IoT主控台中的顯示名稱:專用儲存區域的證明資料

必要:false。此參數需要存取儲存在私有儲存庫中的 Docker 影像。

類型:arraystring

有效模式:[( ?,? ?"(arn:(aws(-[a-z]+)):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:([a-zA-Z0-9\]+/)[a-zA-Z0-9/_+=,.@-]+-[a-zA-Z0-9]+)")]

DockerContainerStatusLogFrequency

連接器記錄有關核心上 Docker 容器執行狀態資訊的頻率 (秒)。預設值為 300 秒 (5 分鐘)。

AWS IoT主控台中的顯示名稱:記錄頻率

必要:false

類型:string

有效模式:^[1-9]{1}[0-9]{0,3}$

ForceDeploy

指出 Docker 部署因不當清理上次部署而失敗時,是否強制執行 Docker 部署。預設值為 False

AWS IoT主控台中的顯示名稱:強制部署

必要:false

類型:string

有效模式:^(true|false)$

DockerPullBeforeUp

指出部署工具是否應docker-compose pull在執行行docker-compose up為之前執 pull-down-up 行。預設值為 True

AWS IoT控制台中的顯示名稱:Docker 在向上之前拉動

必要:false

類型:string

有效模式:^(true|false)$

StopContainersOnNewDeployment

指出當 GGC 停止時,連接器是否應停止 Docdocker 部署器管理碼頭容器 (GGC 會在部署新群組或核心關閉時停止)。預設值為 True

AWS IoT控制台中的顯示名稱:Docker 在新部署時停止

注意

我們建議將此參數設定保持為預設True值。即使在終止AWS IoT Greengrass核心或啟動新部署之後,也False會導致 Docker 容器繼續執行的參數。如果將此參數設定為False,則必須確保在docker-compose服務名稱變更或新增時視需要維護 Docker 容器。

如需詳細資訊,請參閱docker-compose撰寫檔案文件。

必要:false

類型:string

有效模式:^(true|false)$

DockerOfflineMode

指出離線AWS IoT Greengrass啟動時是否使用現有的 Docker 撰寫檔案。預設值為 False

必要:false

類型:string

有效模式:^(true|false)$

Version 6
DockerComposeFileS3Bucket

包含 Docker Compose 檔案的 S3 儲存貯體名稱。建立值區時,請務必遵循 Amazon 簡單儲存服務使用者指南中所述的儲存貯體名稱規則

AWS IoT控制台中的顯示名稱:S3 中的 Docker 撰寫文件

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 [a-zA-Z0-9\\-\\.]{3,63}

DockerComposeFileS3Key

您在 Amazon S3 中碼頭撰寫檔案的物件金鑰。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的物件金鑰和中繼資料。

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 .+

DockerComposeFileS3Version

Amazon S3 中碼頭構成文件的對象版本。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的使用版本控制

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:false

類型:string

有效模式 .+

DockerComposeFileDestinationPath

用來儲存 Docker Compose 檔案複本的本機目錄絕對路徑。這必須是現有目錄。DockerUserId 的指定使用者必須具有在此目錄中建立檔案的權限。如需詳細資訊,請參閱 在 AWS IoT Greengrass 核心上設定 Docker 使用者

重要

儲存 Docker Compose 檔案的目錄以及私有儲存庫的 Docker 影像登入資料的安全。您有責任保護此目錄。如需詳細資訊,請參閱 安全注意事項

AWS IoT主控台中的顯示名稱:本機撰寫檔案的目錄路徑

必要:true

類型:string

有效模式 \/.*\/?

範例:/home/username/myCompose

DockerUserId

連接器用於執行的 Linux 使用者 UID。此使用者必須屬於核心裝置上的 docker Linux 群組,並具有 DockerComposeFileDestinationPath 目錄的寫入權限。如需詳細資訊,請參閱 在核心上設定 Docker 使用者

注意

我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

AWS IoT控制台中的顯示名稱:碼頭用戶 ID

必要:false

類型:string

有效模式:^[0-9]{1,5}$

AWSSecretsArnList

AWS Secrets Manager 中秘密的 Amazon Resource Names (ARN),包含用於存取私有儲存庫中 Docker 影像的登入資訊。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

AWS IoT主控台中的顯示名稱:專用儲存區域的證明資料

必要:false。此參數需要存取儲存在私有儲存庫中的 Docker 影像。

類型:arraystring

有效模式:[( ?,? ?"(arn:(aws(-[a-z]+)):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:([a-zA-Z0-9\]+/)[a-zA-Z0-9/_+=,.@-]+-[a-zA-Z0-9]+)")]

DockerContainerStatusLogFrequency

連接器記錄有關核心上 Docker 容器執行狀態資訊的頻率 (秒)。預設值為 300 秒 (5 分鐘)。

AWS IoT主控台中的顯示名稱:記錄頻率

必要:false

類型:string

有效模式:^[1-9]{1}[0-9]{0,3}$

ForceDeploy

指出 Docker 部署因不當清理上次部署而失敗時,是否強制執行 Docker 部署。預設值為 False

AWS IoT主控台中的顯示名稱:強制部署

必要:false

類型:string

有效模式:^(true|false)$

DockerPullBeforeUp

指出部署工具是否應docker-compose pull在執行行docker-compose up為之前執 pull-down-up 行。預設值為 True

AWS IoT控制台中的顯示名稱:Docker 在向上之前拉動

必要:false

類型:string

有效模式:^(true|false)$

StopContainersOnNewDeployment

指出當 GGC 停止時 (進 docker 新的群組部署或核心關閉時),連接器是否應停止 Docker 部署工具管理碼頭容器。預設值為 True

AWS IoT控制台中的顯示名稱:Docker 在新部署時停止

注意

我們建議將此參數設定保持為預設True值。即使在終止AWS IoT Greengrass核心或啟動新部署之後,也False會導致 Docker 容器繼續執行的參數。如果將此參數設定為False,則必須確保在docker-compose服務名稱變更或新增時視需要維護 Docker 容器。

如需詳細資訊,請參閱docker-compose撰寫檔案文件。

必要:false

類型:string

有效模式:^(true|false)$

Version 5
DockerComposeFileS3Bucket

包含 Docker Compose 檔案的 S3 儲存貯體名稱。建立值區時,請務必遵循 Amazon 簡單儲存服務使用者指南中所述的儲存貯體名稱規則

AWS IoT控制台中的顯示名稱:S3 中的 Docker 撰寫文件

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 [a-zA-Z0-9\\-\\.]{3,63}

DockerComposeFileS3Key

您在 Amazon S3 中碼頭撰寫檔案的物件金鑰。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的物件金鑰和中繼資料。

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 .+

DockerComposeFileS3Version

Amazon S3 中碼頭構成文件的對象版本。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的使用版本控制

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:false

類型:string

有效模式 .+

DockerComposeFileDestinationPath

用來儲存 Docker Compose 檔案複本的本機目錄絕對路徑。這必須是現有目錄。DockerUserId 的指定使用者必須具有在此目錄中建立檔案的權限。如需詳細資訊,請參閱 在 AWS IoT Greengrass 核心上設定 Docker 使用者

重要

儲存 Docker Compose 檔案的目錄以及私有儲存庫的 Docker 影像登入資料的安全。您有責任保護此目錄。如需詳細資訊,請參閱 安全注意事項

AWS IoT主控台中的顯示名稱:本機撰寫檔案的目錄路徑

必要:true

類型:string

有效模式 \/.*\/?

範例:/home/username/myCompose

DockerUserId

連接器用於執行的 Linux 使用者 UID。此使用者必須屬於核心裝置上的 docker Linux 群組,並具有 DockerComposeFileDestinationPath 目錄的寫入權限。如需詳細資訊,請參閱 在核心上設定 Docker 使用者

注意

我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

AWS IoT控制台中的顯示名稱:碼頭用戶 ID

必要:false

類型:string

有效模式:^[0-9]{1,5}$

AWSSecretsArnList

AWS Secrets Manager 中秘密的 Amazon Resource Names (ARN),包含用於存取私有儲存庫中 Docker 影像的登入資訊。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

AWS IoT主控台中的顯示名稱:專用儲存區域的證明資料

必要:false。此參數需要存取儲存在私有儲存庫中的 Docker 影像。

類型:arraystring

有效模式:[( ?,? ?"(arn:(aws(-[a-z]+)):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:([a-zA-Z0-9\]+/)[a-zA-Z0-9/_+=,.@-]+-[a-zA-Z0-9]+)")]

DockerContainerStatusLogFrequency

連接器記錄有關核心上 Docker 容器執行狀態資訊的頻率 (秒)。預設值為 300 秒 (5 分鐘)。

AWS IoT主控台中的顯示名稱:記錄頻率

必要:false

類型:string

有效模式:^[1-9]{1}[0-9]{0,3}$

ForceDeploy

指出 Docker 部署因不當清理上次部署而失敗時,是否強制執行 Docker 部署。預設值為 False

AWS IoT主控台中的顯示名稱:強制部署

必要:false

類型:string

有效模式:^(true|false)$

DockerPullBeforeUp

指出部署工具是否應docker-compose pull在執行行docker-compose up為之前執 pull-down-up 行。預設值為 True

AWS IoT控制台中的顯示名稱:Docker 在向上之前拉動

必要:false

類型:string

有效模式:^(true|false)$

Versions 2 - 4
DockerComposeFileS3Bucket

包含 Docker Compose 檔案的 S3 儲存貯體名稱。建立值區時,請務必遵循 Amazon 簡單儲存服務使用者指南中所述的儲存貯體名稱規則

AWS IoT控制台中的顯示名稱:S3 中的 Docker 撰寫文件

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 [a-zA-Z0-9\\-\\.]{3,63}

DockerComposeFileS3Key

您在 Amazon S3 中碼頭撰寫檔案的物件金鑰。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的物件金鑰和中繼資料。

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 .+

DockerComposeFileS3Version

Amazon S3 中碼頭構成文件的對象版本。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的使用版本控制

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:false

類型:string

有效模式 .+

DockerComposeFileDestinationPath

用來儲存 Docker Compose 檔案複本的本機目錄絕對路徑。這必須是現有目錄。DockerUserId 的指定使用者必須具有在此目錄中建立檔案的權限。如需詳細資訊,請參閱 在 AWS IoT Greengrass 核心上設定 Docker 使用者

重要

儲存 Docker Compose 檔案的目錄以及私有儲存庫的 Docker 影像登入資料的安全。您有責任保護此目錄。如需詳細資訊,請參閱 安全注意事項

AWS IoT主控台中的顯示名稱:本機撰寫檔案的目錄路徑

必要:true

類型:string

有效模式 \/.*\/?

範例:/home/username/myCompose

DockerUserId

連接器用於執行的 Linux 使用者 UID。此使用者必須屬於核心裝置上的 docker Linux 群組,並具有 DockerComposeFileDestinationPath 目錄的寫入權限。如需詳細資訊,請參閱 在核心上設定 Docker 使用者

注意

我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

AWS IoT控制台中的顯示名稱:碼頭用戶 ID

必要:false

類型:string

有效模式:^[0-9]{1,5}$

AWSSecretsArnList

AWS Secrets Manager 中秘密的 Amazon Resource Names (ARN),包含用於存取私有儲存庫中 Docker 影像的登入資訊。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

AWS IoT主控台中的顯示名稱:專用儲存區域的證明資料

必要:false。此參數需要存取儲存在私有儲存庫中的 Docker 影像。

類型:arraystring

有效模式:[( ?,? ?"(arn:(aws(-[a-z]+)):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:([a-zA-Z0-9\]+/)[a-zA-Z0-9/_+=,.@-]+-[a-zA-Z0-9]+)")]

DockerContainerStatusLogFrequency

連接器記錄有關核心上 Docker 容器執行狀態資訊的頻率 (秒)。預設值為 300 秒 (5 分鐘)。

AWS IoT主控台中的顯示名稱:記錄頻率

必要:false

類型:string

有效模式:^[1-9]{1}[0-9]{0,3}$

ForceDeploy

指出 Docker 部署因不當清理上次部署而失敗時,是否強制執行 Docker 部署。預設值為 False

AWS IoT主控台中的顯示名稱:強制部署

必要:false

類型:string

有效模式:^(true|false)$

Version 1
DockerComposeFileS3Bucket

包含 Docker Compose 檔案的 S3 儲存貯體名稱。建立值區時,請務必遵循 Amazon 簡單儲存服務使用者指南中所述的儲存貯體名稱規則

AWS IoT控制台中的顯示名稱:S3 中的 Docker 撰寫文件

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 [a-zA-Z0-9\\-\\.]{3,63}

DockerComposeFileS3Key

您在 Amazon S3 中碼頭撰寫檔案的物件金鑰。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的物件金鑰和中繼資料。

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:true

類型:string

有效模式 .+

DockerComposeFileS3Version

Amazon S3 中碼頭構成文件的對象版本。如需詳細資訊,包括物件金鑰命名準則,請參閱 Amazon 簡單儲存服務使用者指南中的使用版本控制

注意

在主控台中,Docker Compose file in S3 (S3 中的 Docker Compose 檔案) 屬性會結合 DockerComposeFileS3BucketDockerComposeFileS3KeyDockerComposeFileS3Version 參數。

必要:false

類型:string

有效模式 .+

DockerComposeFileDestinationPath

用來儲存 Docker Compose 檔案複本的本機目錄絕對路徑。這必須是現有目錄。DockerUserId 的指定使用者必須具有在此目錄中建立檔案的權限。如需詳細資訊,請參閱 在 AWS IoT Greengrass 核心上設定 Docker 使用者

重要

儲存 Docker Compose 檔案的目錄以及私有儲存庫的 Docker 影像登入資料的安全。您有責任保護此目錄。如需詳細資訊,請參閱 安全注意事項

AWS IoT主控台中的顯示名稱:本機撰寫檔案的目錄路徑

必要:true

類型:string

有效模式 \/.*\/?

範例:/home/username/myCompose

DockerUserId

連接器用於執行的 Linux 使用者 UID。此使用者必須屬於核心裝置上的 docker Linux 群組,並具有 DockerComposeFileDestinationPath 目錄的寫入權限。如需詳細資訊,請參閱 在核心上設定 Docker 使用者

注意

我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

AWS IoT控制台中的顯示名稱:碼頭用戶 ID

必要:false

類型:string

有效模式:^[0-9]{1,5}$

AWSSecretsArnList

AWS Secrets Manager 中秘密的 Amazon Resource Names (ARN),包含用於存取私有儲存庫中 Docker 影像的登入資訊。如需詳細資訊,請參閱 從私有儲存庫存取 Docker 影像

AWS IoT主控台中的顯示名稱:專用儲存區域的證明資料

必要:false。此參數需要存取儲存在私有儲存庫中的 Docker 影像。

類型:arraystring

有效模式:[( ?,? ?"(arn:(aws(-[a-z]+)):secretsmanager:[a-z0-9-]+:[0-9]{12}:secret:([a-zA-Z0-9\]+/)[a-zA-Z0-9/_+=,.@-]+-[a-zA-Z0-9]+)")]

DockerContainerStatusLogFrequency

連接器記錄有關核心上 Docker 容器執行狀態資訊的頻率 (秒)。預設值為 300 秒 (5 分鐘)。

AWS IoT主控台中的顯示名稱:記錄頻率

必要:false

類型:string

有效模式:^[1-9]{1}[0-9]{0,3}$

建立範例連接器 (AWS CLI)

下列 CLI 命令會建立包含 Greengrass 碼頭應ConnectorDefinition用程式部署連接器的初始版本。

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" }

錯誤類型可以是 InvalidParameterInternalError

在 AWS IoT Greengrass 核心上設定 Docker 使用者

Greengrass Docker 應用程式部署連接器會以您為參數指定的使用者身分執行。DockerUserId如果您未指定值,連接器會以 ggc_user 為身分執行,這也是預設 Greengrass 存取身分。

若要允許連接器與 Docker 協助程式互動,Docker 使用者必須屬於核心上的 docker Linux 群組。Docker 使用者也必須具有 DockerComposeFileDestinationPath 目錄的寫入權限。這是連接器儲存本機 docker-compose.yml 檔案和 Docker 登入資料的位置。

注意
  • 建議您建立 Linux 使用者,不要使用預設值 ggc_user。否則,Greengrass 群組中的任何 Lambda 函數都可以存取撰寫檔案和碼頭認證。

  • 我們建議您除非必要,避免以 root 身分執行。如果您確實指定了 root 使用者,則必須允許 Lambda 函數以 root 身分在AWS IoT Greengrass核心上執行。如需詳細資訊,請參閱 以根身份運行 Lambda 函數

  1. 建立使用者。您可以執行 useradd 命令,並包含選用的 -u 選項來指派 UID。例如:

    sudo useradd -u 1234 user-name
  2. 將使用者新增至核心上的 docker 群組。例如:

    sudo usermod -aG docker user-name

    如需詳細資訊 (包括如何建立 docker 群組),請參閱 Docker 文件中 Manage Docker as a non-root user (以非根使用者身分管理 Docker)。

  3. 授予使用者寫入 DockerComposeFileDestinationPath 參數指定目錄的權限。例如:

    1. 將使用者設定為目錄的擁有者。這個範例會使用步驟 1 中的 UID。

      chown 1234 docker-compose-file-destination-path
    2. 將讀取和寫入權限提供給擁有者。

      chmod 700 docker-compose-file-destination-path

      如需詳細資訊,請參閱 Linux 基礎文件中的 How To Manage File And Folder Permissions In Linux (如何管理 Linux 中的檔案及資料夾權限)。

    3. 如果您在建立使用者時未指派 UID,或者,您使用現有使用者,請執行 id 命令以查詢 UID。

      id -u user-name

      您可以使用 UID 來設定連接器的 DockerUserId 參數。

用量資訊

當您使用 Greengrass Docker 應用程式部署連接器時,您應該注意下列實作特定的使用資訊。

  • 修正了項目名稱的前綴。連接器會在它啟動的 Docker 容器名稱前加上 greengrassdockerapplicationdeployment 字首。連接器在其執行的 docker-compose 指令中使用此字首做為專案名稱。

  • 記錄行為。連接器會將狀態資訊和疑難排解資訊寫入日誌檔案。您可以設定AWS IoT Greengrass將記錄檔傳送至記 CloudWatch 錄檔,以及在本機寫入記錄檔。如需詳細資訊,請參閱 連接器的記錄。這是連接器本機記錄檔的路徑:

    /greengrass-root/ggc/var/log/user/region/aws/DockerApplicationDeployment.log

    您必須具有 root 權限才能存取本機日誌。

  • 更新碼頭圖像。Docker 會快取核心裝置上的影像。如果您更新 Docker 影像,並想將變更傳播到核心裝置,請務必變更 Compose 檔案中的影像標籤。部署 Greengrass 群組之後,變更就會生效。

  • 清理作業逾時 10 分鐘。當 Greengrass 精靈在重新啟動期間停止時,會啟動指docker-compose down令。啟動後,所有 Docker 容器都有最多 10 分鐘的時docker-compose down間來執行任何清理操作。如果清理未在 10 分鐘內完成,則必須手動清理剩餘的容器。如需詳細資訊,請參閱 Docker CLI 文件中的 docker rm

  • 運行碼頭命令。若要對問題進行疑難排解,可以在核心裝置的終端機視窗中執行 Docker 命令。例如,執行下列命令以查看連接器啟動的 Docker 容器:

    docker ps --filter name="greengrassdockerapplicationdeployment"
  • 保留的資源 ID。連接器會使用其在 Greengrass 群組中建立的 Greengrass 資源 DOCKER_DEPLOYER_SECRET_RESOURCE_RESERVED_ID_index ID。資源 ID 在群組中不得重複,因此請勿指派可能與此保留資源 ID 衝突的資源 ID。

  • 離線模式。當您將DockerOfflineMode組態參數設定為時True,Docker 連接器就可以在離線模式下操作。當 Greengrass 群組部署在核心裝置離線時重新啟動,且連接器無法建立與 Amazon S3 或 Amazon ECR 的連線以擷取 Docker 撰寫檔案時,就會發生這種情況。

    啟用離線模式後,連接器會嘗試下載您的 Compose 檔案,並依照正常重新啟動的方式執行docker login命令。如果這些嘗試失敗,則連接器會在使用DockerComposeFileDestinationPath參數指定的資料夾中尋找本機儲存的構成檔案。如果存在本機構成檔案,則連接器會遵循一般的docker-compose指令順序,並從本機影像中提取。如果構成檔案或本機映像不存在,則連接器會失敗。ForceDeployStopContainersOnNewDeployment參數在離線模式下的行為保持不變。

與 Docker 容器通訊

AWS IoT Greengrass 支援 Greengrass 元件和 Docker 容器之間的下列通訊頻道:

  • Greengrass Lambda 函數可以使用 REST API 與碼頭容器中的程序進行通訊。您可以在開啟連接埠的 Docker 容器中設定伺服器。Lambda 函數可以與此連接埠上的容器進行通訊。

  • Docker 容器中的處理程序可以透過本機 Greengrass 訊息中介裝置交換 MQTT 訊息。您可以在 Greengrass 群組中將 Docker 容器設定為用戶端裝置,然後建立訂閱以允許容器與 Greengrass Lambda 函數、用戶端裝置和群組中的其他連接器通訊,或與本機陰影服務進行通訊。AWS IoT如需詳細資訊,請參閱 設定與 Docker 容器的 MQTT 通訊

  • Greengrass Lambda 函數可以更新共享文件,以將信息傳遞給 Docker 容器。您可以使用 Compose 檔案綁定掛載 Docker 容器的共用檔案路徑。

設定與 Docker 容器的 MQTT 通訊

您可以將 Docker 容器設定為用戶端裝置,並將其新增至 Greengrass 群組。然後,您可以建立訂閱,以允許 Docker 容器和 Greengrass 元件或 AWS IoT 之間的 MQTT 通訊。在下列程序中,您會建立訂閱,允許 Docker 容器裝置接收來自本機陰影服務的陰影更新訊息。您可以遵循此模式來建立其他訂閱。

注意

此程序假設您已經建立了 Greengrass 群組和 Greengrass 核心 (v1.10 或更新版本)。如需有關建立 Greengrass 群組和核心的資訊,請參閱。入門 AWS IoT Greengrass

若要將 Docker 容器設定為用戶端裝置,並將其新增至 Greengrass 群組
  1. 在核心裝置上建立一個資料夾,以儲存用於驗證 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
  2. 在AWS IoT主控台瀏覽窗格的 [管理] 下,展開 [Greengrass 裝置],然後選擇 [群組 (V1)]。

  3. 選擇目標群組。

  4. 在群組設定頁面上,選擇 [用戶端裝置],然後選擇 [關聯]。

  5. 在「將用戶端裝置與此群組產生關聯」強制回應中,選擇「建立新AWS IoT物件」。

    建立物件」頁面會在新標籤中開啟。

  6. 在 [建立物件] 頁面上,選擇 [建立單一物件],然後選擇 [下一步]。

  7. 在 [指定物件內容] 頁面上,輸入設備的名稱,然後選擇 [下一步]。

  8. 在 [設定裝置憑證] 頁面上,選擇 [下一步]。

  9. 在 [將原則附加至憑證] 頁面上,執行下列其中一個動作:

    • 選取授與用戶端裝置所需權限的現有策略,然後選擇 [建立物件]。

      強制回應隨即開啟,您可以在其中下載憑證和金鑰,該裝置用來連線至AWS 雲端和核心。

    • 建立並附加授與用戶端裝置權限的新原則。請執行下列操作:

      1. 選擇建立政策

        Create policy (建立政策) 頁面隨即在新標籤中開啟。

      2. Create policy (建立政策) 頁面上,執行下列動作:

        1. 在「策略名稱」中,輸入描述策略的名稱,例如GreengrassV1ClientDevicePolicy

        2. 在 [原則陳述式] 索引標籤的 [原則文件] 下,選擇 [JSON]。

        3. 輸入下列政策文件。此原則可讓用戶端裝置探索 Greengrass 核心,並在所有 MQTT 主題上進行通訊。如需有關如何限制此原則存取權的資訊,請參閱AWS IoT Greengrass 的裝置身分驗證和授權

          { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Publish", "iot:Subscribe", "iot:Connect", "iot:Receive" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "greengrass:*" ], "Resource": [ "*" ] } ] }
        4. 選擇 Create (建立) 以建立政策。

      3. 返回瀏覽器索引標籤,並開啟 [將原則附加至憑證] 頁面。請執行下列操作:

        1. 在「略」清單中,選取您建立的策略,例如GreengrassV1ClientDevicePolicy

          如果您看不到原則,請選擇 [重新整理] 按鈕。

        2. 選擇 Create thing (建立物件)。

          強制回應隨即開啟,您可以在其中下載憑證和金鑰,該裝置用來連線至AWS 雲端和核心。

  10. 在「下載憑證和金鑰」模式中,下載裝置的憑證。

    重要

    選擇 [完成] 之前,請先下載安全性資源。

    請執行下列操作:

    1. 對於裝置憑證,請選擇載以下載裝置憑證。

    2. 對於公開金鑰檔案,請選擇 [下載] 以下載憑證的公開金鑰。

    3. 對於私密金鑰檔案,請選擇 [下載] 以下載憑證的私密金鑰檔案。

    4. 檢閱AWS IoT開發人員指南中的伺服器驗證,並選擇適當的根 CA 憑證。我們建議您使用 Amazon 信任服務 (ATS) 端點和 ATS 根 CA 憑證。在根 CA 憑證下,針對根 CA 憑證選擇 [下載]。

    5. 選擇完成

    記下裝置憑證和金鑰檔案名稱中常見的憑證 ID。供稍後使用。

  11. 將憑證和金鑰複製到您在步驟 1 中建立的資料夾中。

接下來,在群組中建立訂閱。在此範例中,您可以建立訂閱讓 Docker 容器裝置接收來自本機陰影服務的 MQTT 訊息。

注意

陰影文件的大小上限為 8 KB。如需詳細資訊,請參閱AWS IoT開發人員指南中的AWS IoT配額

建立訂閱,允許 Docker 容器裝置接收來自本機陰影服務的 MQTT 訊息
  1. 在群組設定頁面上,選擇 [訂閱] 索引標籤,然後選擇 [新增訂閱]。

  2. Select your source and target (選擇您的來源和目標) 頁面設定來源和目標,如下所示:

    1. Select a source (選取來源) 中,選擇 Services (服務),然後選擇 Local Shadow Service (本機陰影服務)

    2. Select a target (選取目標),選擇 Devices (裝置),然後選擇您的裝置。

    3. 選擇下一步

    4. 在 [使用主題篩選資料] 頁面上,針對 [主題篩選器] 選擇$aws/things/MyDockerDevice/shadow/update/accepted,然後選擇 [下一步]。以先前建立的裝置名稱取MyDockerDevice代。

    5. 選擇 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 群組中的所有 Lambda 函數和連接器都可以假設您在 Greengrass 群組角色中新增的權限。此連接器需要存取儲存 S3 儲存貯體中的 Docker Compose 檔案。如果您的 Docker 映像檔儲存在 Amazon ECR 的私有儲存庫中,它也需要存取您的 Amazon ECR 授權權杖。

授權

Greengrass Docker 應用程式部署連接器包含下列協力廠商軟體/授權:

此連接器是根據 Greengrass 核心軟體授權合約發行的。

變更記錄

下表說明每個版本連接器的變更。

版本

變更

7

DockerOfflineMode加了在離線AWS IoT Greengrass啟動時使用現有的 Docker 撰寫文件。已實作docker login命令的重試。Support 32 位元 UID。

6

新增StopContainersOnNewDeployment以在進行新部署或 GGC 停止時覆寫容器清理。更安全的關機和啟動機制。YAML 驗證錯誤修復。

5

圖像在運行之前被拉docker-compose down

4

添加了更新 Docker 圖像的 pull-before-up 行為。

3

修正了尋找環境變數的問題。

2

新增 ForceDeploy 參數。

1

初始版本。

Greengrass 群組一次只能包含一個版本的連接器。若要取得有關升級連接器版本的資訊,請參閱升級連接器版本

另請參閱