本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS IoT Greengrass 在具有手動資源佈建的 Docker 容器中執行
本教學課程說明如何使用手動佈建 AWS 的資源,在 Docker 容器中安裝和執行 AWS IoT Greengrass 核心軟體。
主題
先決條件
為了完成本教學,您需要以下項目:
-
AWS 帳戶。如果您沒有帳戶,請參閱 設定 AWS 帳戶。
-
Docker AWS IoT Greengrass 映像。您可以從 Dockerfile AWS IoT Greengrass 建置映像。
-
您執行 Docker 容器的主機電腦必須符合下列要求:
-
具有網際網路連線的 Linux 作業系統。
-
Docker 引擎
18.09 版或更新版本。 -
(選用) Docker Compose
1.22 版或更新版本。只有在您想要使用 Docker Compose CLI 執行 Docker 映像時,才需要 Docker Compose。
-
擷取 AWS IoT 端點
取得 的 AWS IoT 端點 AWS 帳戶,並儲存它們以供稍後使用。您的裝置使用這些端點來連線 AWS IoT。請執行下列操作:
-
取得 AWS IoT 的資料端點 AWS 帳戶。
aws iot describe-endpoint --endpoint-type iot:Data-ATS如果請求成功,回應看起來與下列範例類似。
{ "endpointAddress": "device-data-prefix-ats.iot.us-west-2.amazonaws.com" } -
取得 的 AWS IoT 登入資料端點 AWS 帳戶。
aws iot describe-endpoint --endpoint-type iot:CredentialProvider如果請求成功,回應看起來與下列範例類似。
{ "endpointAddress": "device-credentials-prefix.credentials.iot.us-west-2.amazonaws.com" }
建立 AWS IoT 物件
AWS IoT 物件代表連線至 的裝置和邏輯實體 AWS IoT。Greengrass 核心裝置是 AWS IoT 實物。當您將裝置註冊為 AWS IoT 物件時,該裝置可以使用數位憑證進行身分驗證 AWS。
在本節中,您會建立代表裝置的 AWS IoT 物件。
建立 AWS IoT 物件
-
為您的裝置建立 AWS IoT 物件。在您的開發電腦上,執行下列命令。
-
將
MyGreengrassCore取代為要使用的物件名稱。此名稱也是 Greengrass 核心裝置的名稱。注意
物件名稱不能包含冒號 (
:) 字元。
aws iot create-thing --thing-nameMyGreengrassCore如果請求成功,回應看起來與下列範例類似。
{ "thingName": "MyGreengrassCore", "thingArn": "arn:aws:iot:us-west-2:123456789012:thing/MyGreengrassCore", "thingId": "8cb4b6cd-268e-495d-b5b9-1713d71dbf42" } -
-
(選用) 將 AWS IoT 物件新增至新的或現有的物件群組。您可以使用物件群組來管理 Greengrass 核心裝置的機群。當您將軟體元件部署到裝置時,您可以將個別裝置或裝置群組設為目標。您可以將裝置新增至具有作用中 Greengrass 部署的物件群組,以將該物件群組的軟體元件部署到裝置。請執行下列操作:
-
(選用) 建立 AWS IoT 物件群組。
-
將
MyGreengrassCoreGroup取代為要建立的物件群組名稱。注意
物件群組名稱不能包含冒號 (
:) 字元。
aws iot create-thing-group --thing-group-nameMyGreengrassCoreGroup如果請求成功,回應看起來與下列範例類似。
{ "thingGroupName": "MyGreengrassCoreGroup", "thingGroupArn": "arn:aws:iot:us-west-2:123456789012:thinggroup/MyGreengrassCoreGroup", "thingGroupId": "4df721e1-ff9f-4f97-92dd-02db4e3f03aa" } -
-
將 AWS IoT 物件新增至物件群組。
-
將
MyGreengrassCore取代為您 AWS IoT 物件的名稱。 -
將
MyGreengrassCoreGroup取代為物件群組的名稱。
aws iot add-thing-to-thing-group --thing-nameMyGreengrassCore--thing-group-nameMyGreengrassCoreGroup如果請求成功,命令不會有任何輸出。
-
-
建立物件憑證
當您將裝置註冊為 AWS IoT 物件時,該裝置可以使用數位憑證進行身分驗證 AWS。此憑證可讓裝置與 AWS IoT 和 通訊 AWS IoT Greengrass。
在本節中,您可以建立和下載裝置可用來連線的憑證 AWS。
建立物件憑證
-
建立資料夾以下載 AWS IoT 物件的憑證。
mkdir greengrass-v2-certs -
建立並下載 AWS 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-----\ MIIBIjANBgkqhkEXAMPLEQEFAAOCAQ8AMIIBCgKCAQEAEXAMPLE1nnyJwKSMHw4h\ MMEXAMPLEuuN/dMAS3fyce8DW/4+EXAMPLEyjmoF/YVF/gHr99VEEXAMPLE5VF13\ 59VK7cEXAMPLE67GK+y+jikqXOgHh/xJTwo+sGpWEXAMPLEDz18xOd2ka4tCzuWEXAMPLEahJbYkCPUBSU8opVkR7qkEXAMPLE1DR6sx2HocliOOLtu6Fkw91swQWEXAMPLE\\GB3ZPrNh0PzQYvjUStZeccyNCx2EXAMPLEvp9mQOUXP6plfgxwKRX2fEXAMPLEDa\ hJLXkX3rHU2xbxJSq7D+XEXAMPLEcw+LyFhI5mgFRl88eGdsAEXAMPLElnI9EesG\ FQIDAQAB\ -----END PUBLIC KEY-----\ ", "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\ key omitted for security reasons\ -----END RSA PRIVATE KEY-----\ " } }儲存憑證的 Amazon Resource Name (ARN),以供稍後用於設定憑證。
接著,設定物件憑證。如需詳細資訊,請參閱設定物件憑證。
建立字符交換角色
Greengrass 核心裝置使用稱為字符交換角色的 IAM 服務角色來授權呼叫 AWS 服務。裝置使用 AWS IoT 登入資料提供者取得此角色的臨時 AWS 登入資料,允許裝置與 互動 AWS IoT、將日誌傳送至 Amazon CloudWatch Logs,以及從 Amazon S3 下載自訂元件成品。如需詳細資訊,請參閱授權核心裝置與 AWS 服務互動。
您可以使用 AWS IoT 角色別名來設定 Greengrass 核心裝置的字符交換角色。角色別名可讓您變更裝置的字符交換角色,但保持裝置的組態相同。如需詳細資訊,請參閱《 AWS IoT Core 開發人員指南》中的授權直接呼叫 AWS 服務。
在本節中,您會建立權杖交換 IAM 角色和指向角色 AWS IoT 的角色別名。如果您已經設定 Greengrass 核心裝置,您可以使用其權杖交換角色和角色別名,而不是建立新的權杖交換角色和角色別名。然後,您將裝置的 AWS IoT 物件設定為使用該角色和別名。
建立權杖交換 IAM 角色
-
建立您的裝置可用作字符交換角色的 IAM 角色。請執行下列操作:
-
建立檔案,其中包含權杖交換角色所需的信任政策文件。
例如,在以 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" } ] } -
使用信任政策文件建立權杖交換角色。
-
將
GreengrassV2TokenExchangeRole取代為要建立的 IAM 角色名稱。
aws iam create-role --role-nameGreengrassV2TokenExchangeRole--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" } ] } } -
-
建立檔案,其中包含權杖交換角色所需的存取政策文件。
例如,在以 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 儲存貯體,您可以在建立儲存貯體之後新增這些許可。
-
從政策文件中建立 IAM 政策。
-
以要建立的 IAM 政策名稱取代
GreengrassV2TokenExchangeRoleAccess。
aws iam create-policy --policy-nameGreengrassV2TokenExchangeRoleAccess--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" } } -
-
將 IAM 政策連接至字符交換角色。
-
將
GreengrassV2TokenExchangeRole取代為 IAM 角色的名稱。 -
將政策 ARN 取代為您在上一個步驟中建立的 IAM 政策 ARN。
aws iam attach-role-policy --role-nameGreengrassV2TokenExchangeRole--policy-arnarn:aws:iam::123456789012:policy/GreengrassV2TokenExchangeRoleAccess如果請求成功,命令不會有任何輸出。
-
-
-
建立指向字符交換角色 AWS IoT 的角色別名。
-
以要建立的角色別名名稱取代
GreengrassCoreTokenExchangeRoleAlias。 -
將角色 ARN 取代為您在上一個步驟中建立之 IAM 角色的 ARN。
aws iot create-role-alias --role-aliasGreengrassCoreTokenExchangeRoleAlias--role-arnarn:aws:iam::123456789012:role/GreengrassV2TokenExchangeRole如果請求成功,回應看起來與下列範例類似。
{ "roleAlias": "GreengrassCoreTokenExchangeRoleAlias", "roleAliasArn": "arn:aws:iot:us-west-2:123456789012:rolealias/GreengrassCoreTokenExchangeRoleAlias" }注意
若要建立角色別名,您必須具有傳遞字符交換 IAM 角色的許可 AWS IoT。如果您在嘗試建立角色別名時收到錯誤訊息,請檢查您的 AWS 使用者是否具有此許可。如需詳細資訊,請參閱AWS Identity and Access Management 《 使用者指南》中的授予使用者將角色傳遞至 AWS 服務的許可。
-
-
建立並連接允許 Greengrass 核心裝置使用角色別名來擔任字符交換角色 AWS IoT 的政策。如果您之前已設定 Greengrass 核心裝置,您可以連接其角色別名 AWS IoT 政策,而不是建立新的。請執行下列操作:
-
(選用) 建立檔案,其中包含角色別名所需的 AWS 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" } ] } -
-
從 AWS IoT 政策文件中建立政策。
-
將
GreengrassCoreTokenExchangeRoleAliasPolicy取代為要建立 AWS IoT 的政策名稱。
aws iot create-policy --policy-nameGreengrassCoreTokenExchangeRoleAliasPolicy--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" } -
-
將 AWS IoT 政策連接至 AWS IoT 物件的憑證。
-
以角色別名 AWS IoT 政策的名稱取代
GreengrassCoreTokenExchangeRoleAliasPolicy。 -
將目標 ARN 取代為您 AWS IoT 物件的憑證 ARN。
aws iot attach-policy --policy-nameGreengrassCoreTokenExchangeRoleAliasPolicy--targetarn:aws:iot:us-west-2:123456789012:cert/aa0b7958770878eabe251d8a7ddd547f4889c524c9b574ab9fbf65f32248b1d4如果請求成功,命令不會有任何輸出。
-
-
將憑證下載至裝置
先前,您已將裝置的憑證下載到開發電腦。在本節中,您可以下載 Amazon 根憑證授權機構 (CA) 憑證。然後,如果您計劃在開發電腦以外的電腦上在 Docker 中執行 AWS IoT Greengrass Core 軟體,請將憑證複製到該主機電腦。Core AWS IoT Greengrass 軟體使用這些憑證來連線至 AWS IoT 雲端服務。
將憑證下載至裝置
-
在您的開發電腦上,下載 Amazon 根憑證授權機構 (CA) certificate. AWS IoT certificates 預設會與 Amazon 根憑證授權機構憑證相關聯。
-
如果您計劃在與開發電腦不同的裝置上在 Docker 中執行 AWS IoT Greengrass Core 軟體,請將憑證複製到主機電腦。如果在開發電腦和主機電腦上啟用 SSH 和 SCP,您可以使用開發電腦上的
scp命令來傳輸憑證。將device-ip-address取代為主機電腦的 IP 地址。scp -r greengrass-v2-certs/device-ip-address:~
建立組態檔案
-
在主機電腦上,建立您放置組態檔案的資料夾。
mkdir ./greengrass-v2-config -
使用文字編輯器在
./greengrass-v2-config資料夾中建立名為config.yaml的組態檔案。例如,您可以執行下列命令,使用 GNU nano 建立
config.yaml。nano ./greengrass-v2-config/config.yaml -
將下列 YAML 內容複製到 檔案。此部分組態檔案會指定系統參數和 Greengrass 核參數。
--- system: certificateFilePath: "/tmp/certs/device.pem.crt" privateKeyPath: "/tmp/certs/private.pem.key" rootCaPath: "/tmp/certs/AmazonRootCA1.pem" rootpath: "" thingName: "/greengrass/v2MyGreengrassCore" 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/certs。您在啟動容器時,將下載的憑證掛載到 Docker 容器中的目錄。 -
。 您要用於安裝的 Greengrass 根資料夾。您可以使用/greengrass/v2GGC_ROOT環境變數來設定此值。 -
MyGreengrassCore。物件的名稱 AWS IoT 。 -
nucleus-version。要安裝 AWS IoT Greengrass 的核心軟體版本。此值必須符合您下載的 Docker 映像或 Dockerfile 版本。如果您使用latest標籤下載 Greengrass Docker 映像,請使用docker inspect查看映像版本。image-id -
區域。您建立 AWS IoT 資源 AWS 區域 的 。您也必須為AWS_REGION環境檔案中的環境變數指定相同的值。 -
GreengrassCoreTokenExchangeRoleAlias。字符交換角色別名。 -
device-data-prefix。 AWS IoT 資料端點的字首。 -
device-credentials-prefix。登入 AWS IoT 資料端點的字首。
-
建立環境檔案
本教學課程使用環境檔案來設定環境變數,這些變數將傳遞至 Docker 容器內的 AWS IoT Greengrass Core 軟體安裝程式。您也可以在docker run命令中使用 -e或 --env引數docker-compose.yml 檔案的 environment區塊
-
使用文字編輯器來建立名為 的環境檔案
.env。例如,在以 Linux 為基礎的系統上,您可以執行下列命令,使用 GNU nano
.env在目前的目錄中建立 。nano .env -
將下列內容複製到 檔案。
GGC_ROOT_PATH=AWS_REGION=/greengrass/v2regionPROVISION=false COMPONENT_DEFAULT_USER=ggc_user:ggc_group INIT_CONFIG=/tmp/config/config.yaml然後,取代下列值。
-
。 用來安裝 AWS IoT Greengrass Core 軟體的根資料夾路徑。/greengrass/v2 -
區域。您建立 AWS IoT 資源 AWS 區域 的 。您必須為awsRegion組態檔案中的組態參數指定相同的值。 -
/tmp/config/。您在啟動 Docker 容器時掛載組態檔案的資料夾。
注意
您可以將
DEPLOY_DEV_TOOLS環境變數設定為true以部署 Greengrass CLI 元件,這可讓您在 Docker 容器內開發自訂元件。建議您僅在開發環境中使用此元件,而非生產環境中。此元件可讓您存取您在生產環境中通常不需要的資訊和操作。僅將此元件部署到您需要的核心裝置,以遵循最低權限原則。 -
在容器中執行 AWS IoT Greengrass 核心軟體
本教學課程說明如何啟動您在 Docker 容器中建置的 Docker 映像。您可以使用 Docker CLI 或 Docker Compose CLI 在 Docker 容器中執行 AWS IoT Greengrass 核心軟體映像。
後續步驟
AWS IoT Greengrass 核心軟體現在正在 Docker 容器中執行。執行下列命令,以擷取目前執行中容器的容器 ID。
docker ps
然後,您可以執行下列命令來存取容器,並探索在容器內執行 AWS IoT Greengrass 的核心軟體。
docker exec -itcontainer-id/bin/bash
如需建立簡單元件的詳細資訊,請參閱 步驟 4:在您的裝置上開發和測試元件中的 教學課程:入門 AWS IoT Greengrass V2
注意
當您使用 在 Docker 容器內docker exec執行命令時,這些命令不會記錄在 Docker 日誌中。若要在 Docker 日誌中記錄命令,請將互動式 shell 連接到 Docker 容器。如需詳細資訊,請參閱將互動式 shell 連接至 Docker 容器。
AWS IoT Greengrass 核心日誌檔案稱為 greengrass.log,位於 中。元件日誌檔案也位於相同的目錄中。若要將 Greengrass 日誌複製到主機上的暫存目錄,請執行下列命令:/logs/greengrass/v2
docker cpcontainer-id:/greengrass/v2/logs/tmp/logs
如果您想要在容器結束或移除後保留日誌,建議您僅將目錄繫結至主機上的暫存日誌目錄,而不是掛載整個 Greengrass 目錄。如需詳細資訊,請參閱Docker 容器外的持久性 Greengrass 日誌。/logs/greengrass/v2
若要停止執行中的 AWS IoT Greengrass Docker 容器,請執行 docker stop或 docker-compose -f docker-compose.yml stop。此動作會SIGTERM傳送至 Greengrass 程序,並關閉在容器中啟動的所有相關程序。Docker 容器會使用docker-init可執行檔初始化為程序 PID 1,這有助於移除任何剩餘的殭屍程序。如需詳細資訊,請參閱 Docker 文件中的指定初始化程序
如需對 AWS IoT Greengrass 在 Docker 容器中執行 的問題進行疑難排解的資訊,請參閱 Docker 容器中 AWS IoT Greengrass 的故障診斷。