

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

# AWS IoT Greengrass 在具有手動資源佈建的 Docker 容器中執行
使用手動佈建在 Docker AWS IoT Greengrass 中執行

本教學課程說明如何使用手動佈建 AWS 的資源，在 Docker 容器中安裝和執行 AWS IoT Greengrass 核心軟體。

**Topics**
+ [

## 先決條件
](#docker-manual-provisioning-prereqs)
+ [

## 擷取 AWS IoT 端點
](#retrieve-iot-endpoints)
+ [

## 建立 AWS IoT 物件
](#create-iot-thing)
+ [

## 建立物件憑證
](#create-thing-certificate-mp)
+ [

## 建立權杖交換角色
](#create-token-exchange-role)
+ [

## 將憑證下載至裝置
](#download-thing-certificates)
+ [

## 建立組態檔案
](#create-docker-install-configuration-file)
+ [

## 建立環境檔案
](#create-env-file-manual-provisioning)
+ [

## 在容器中執行 AWS IoT Greengrass 核心軟體
](#run-greengrass-image-manual-provisioning)
+ [

## 後續步驟
](#run-greengrass-docker-next-steps)

## 先決條件


為了完成本教學，您需要以下項目：
+  AWS 帳戶。如果您沒有帳戶，請參閱 [設定 AWS 帳戶](setting-up.md#set-up-aws-account)。
+ Docker AWS IoT Greengrass 映像。您可以從 [Dockerfile AWS IoT Greengrass 建置映像](build-greengrass-dockerfile.md)。
+ 您執行 Docker 容器的主機電腦必須符合下列要求：
  + <a name="docker-host-reqs"></a>具有網際網路連線的 Linux 作業系統。
  + <a name="docker-engine-reqs"></a>[Docker 引擎](https://docs.docker.com/engine/install/) 18.09 版或更新版本。
  + <a name="docker-compose-reqs"></a>（選用） [Docker Compose](https://docs.docker.com/compose/install/) 1.22 版或更新版本。只有在您想要使用 Docker Compose CLI 執行 Docker 映像時，才需要 Docker Compose。

## 擷取 AWS IoT 端點


取得 的 AWS IoT 端點 AWS 帳戶，並儲存它們以供稍後使用。您的裝置使用這些端點來連線 AWS IoT。請執行下列操作：

1. 取得 AWS IoT 的資料端點 AWS 帳戶。

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

   如果請求成功，回應看起來與下列範例類似。

   ```
   {
     "endpointAddress": "device-data-prefix-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 取得 的 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 物件**

1. 為您的裝置建立 AWS IoT 物件。在您的開發電腦上，執行下列命令。
   + 將 *MyGreengrassCore* 取代為要使用的物件名稱。此名稱也是 Greengrass 核心裝置的名稱。
**注意**  <a name="install-argument-thing-name-constraint"></a>
物件名稱不能包含冒號 (`:`) 字元。

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

1. （選用） 將 AWS IoT 物件新增至新的或現有的物件群組。您可以使用物件群組來管理 Greengrass 核心裝置的機群。將軟體元件部署至裝置時，您可以將個別裝置或裝置群組設為目標。您可以將裝置新增至具有作用中 Greengrass 部署的物件群組，以將該物件群組的軟體元件部署到裝置。請執行下列操作：

   1. （選用） 建立 AWS IoT 物件群組。
      + 將 *MyGreengrassCoreGroup* 取代為要建立的物件群組名稱。
**注意**  <a name="install-argument-thing-group-name-constraint"></a>
物件群組名稱不能包含冒號 (`:`) 字元。

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

   1. 將 AWS IoT 物件新增至物件群組。
      + 將 *MyGreengrassCore* 取代為您的 AWS IoT 物件名稱。
      + 將 *MyGreengrassCoreGroup* 取代為物件群組的名稱。

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

      如果請求成功，命令不會有任何輸出。

## 建立物件憑證


<a name="create-thing-certificate-intro-1"></a>當您將裝置註冊為 AWS IoT 物件時，該裝置可以使用數位憑證進行身分驗證 AWS。此憑證可讓裝置與 AWS IoT 和 通訊 AWS IoT Greengrass。

<a name="create-thing-certificate-intro-2"></a>在本節中，您可以建立和下載裝置可用來連線的憑證 AWS。<a name="create-thing-certificate-cloud-steps"></a>

**建立物件憑證**

1. 建立資料夾以下載 AWS IoT 物件的憑證。

   ```
   mkdir greengrass-v2-certs
   ```

1. 建立並下載 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)，以供稍後用於設定憑證。

接著，設定物件憑證。如需詳細資訊，請參閱[設定物件憑證](manual-installation.md#configure-thing-certificate)。

## 建立權杖交換角色


<a name="installation-create-token-exchange-role-intro"></a>Greengrass 核心裝置使用稱為*字符交換角色的 IAM 服務角色*來授權呼叫 AWS 服務。裝置使用 AWS IoT 登入資料提供者取得此角色的臨時 AWS 登入資料，允許裝置與 互動 AWS IoT、將日誌傳送至 Amazon CloudWatch Logs，以及從 Amazon S3 下載自訂元件成品。如需詳細資訊，請參閱[授權核心裝置與 AWS 服務互動](device-service-role.md)。

<a name="installation-create-token-exchange-role-alias-intro"></a>您可以使用 AWS IoT *角色別名*來設定 Greengrass 核心裝置的字符交換角色。角色別名可讓您變更裝置的字符交換角色，但讓裝置組態保持不變。如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*》中的[授權直接呼叫 AWS 服務](https://docs.aws.amazon.com/iot/latest/developerguide/authorizing-direct-aws.html)。

在本節中，您會建立權杖交換 IAM 角色和指向角色 AWS IoT 的角色別名。如果您已經設定 Greengrass 核心裝置，您可以使用其權杖交換角色和角色別名，而不是建立新的權杖交換角色和角色別名。然後，您將裝置的 AWS IoT 物件設定為使用該角色和別名。

**建立權杖交換 IAM 角色**

1. <a name="create-token-exchange-role-create-iam-role"></a>建立您的裝置可用作字符交換角色的 IAM 角色。請執行下列操作：

   1. 建立檔案，其中包含權杖交換角色所需的信任政策文件。

      <a name="nano-command-intro"></a>例如，在以 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"
          }
        ]
      }
      ```

   1. 使用信任政策文件建立權杖交換角色。
      + 將 *GreengrassV2TokenExchangeRole* 取代為要建立的 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"
              }
            ]
          }
        }
      ```

   1. 建立檔案，其中包含權杖交換角色所需的存取政策文件。

      <a name="nano-command-intro"></a>例如，在以 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 儲存貯體](device-service-role.md#device-service-role-access-s3-bucket)。  
如果您還沒有元件成品的 S3 儲存貯體，您可以在建立儲存貯體之後新增這些許可。

   1. 從政策文件中建立 IAM 政策。
      + 以要建立的 IAM 政策名稱取代 *GreengrassV2TokenExchangeRoleAccess*。

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

   1. 將 IAM 政策連接至字符交換角色。
      + 將 *GreengrassV2TokenExchangeRole* 取代為 IAM 角色的名稱。
      + 將政策 ARN 取代為您在上一個步驟中建立的 IAM 政策 ARN。

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

      如果請求成功，命令不會有任何輸出。

1. <a name="create-token-exchange-role-create-iot-role-alias"></a>建立指向字符交換 AWS 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 角色傳遞至 的許可 AWS IoT。如果您在嘗試建立角色別名時收到錯誤訊息，請檢查您的 AWS 使用者是否具有此許可。如需詳細資訊，請參閱*AWS Identity and Access Management 《 使用者指南*》中的[授予使用者將角色傳遞至 AWS 服務的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

1. 建立並連接允許 Greengrass 核心裝置使用角色別名來擔任字符交換角色 AWS IoT 的政策。如果您之前已設定 Greengrass 核心裝置，您可以連接其角色別名 AWS IoT 政策，而不是建立新的。請執行下列操作：

   1. （選用） 建立檔案，其中包含角色別名所需的 AWS IoT 政策文件。

      <a name="nano-command-intro"></a>例如，在以 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"
          }
        ]
      }
      ```

   1. 從 AWS IoT 政策文件中建立政策。
      + 將 *GreengrassCoreTokenExchangeRoleAliasPolicy* 取代為要建立 AWS 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"
      }
      ```

   1. 將 AWS IoT 政策連接至 AWS IoT 物件的憑證。
      + 以角色別名 AWS IoT 政策的名稱取代 *GreengrassCoreTokenExchangeRoleAliasPolicy*。
      + 將目標 ARN 取代為物件 AWS IoT 憑證的 ARN。

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

      如果請求成功，命令不會有任何輸出。

## 將憑證下載至裝置


先前，您已將裝置的憑證下載到開發電腦。在本節中，您會下載 Amazon 根憑證授權機構 (CA) 憑證。然後，如果您計劃在開發電腦以外的電腦上在 Docker 中執行 AWS IoT Greengrass Core 軟體，您可以將憑證複製到該主機電腦。Core AWS IoT Greengrass 軟體使用這些憑證來連線至 AWS IoT 雲端服務。

**將憑證下載至裝置**

1. 在您的開發電腦上，下載 Amazon 根憑證授權機構 (CA) certificate. AWS IoT certificates 預設會與 Amazon 根憑證授權機構憑證相關聯。

------
#### [ 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
   ```

------

1. 如果您打算在與開發電腦不同的裝置上在 Docker 中執行 AWS IoT Greengrass Core 軟體，請將憑證複製到主機電腦。如果在開發電腦和主機電腦上啟用 SSH 和 SCP，您可以使用開發電腦上的 `scp`命令來傳輸憑證。將 *device-ip-address* 取代為主機電腦的 IP 地址。

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

## 建立組態檔案


1. 在主機電腦上，建立您放置組態檔案的資料夾。

   ```
   mkdir ./greengrass-v2-config
   ```

1. 使用文字編輯器在 `./greengrass-v2-config` 資料夾中建立名為 `config.yaml`的組態檔案。

   例如，您可以執行下列命令來使用 GNU nano 來建立 `config.yaml`。

   ```
   nano ./greengrass-v2-config/config.yaml
   ```

1. 將下列 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/certs*。您在啟動容器時，將下載的憑證掛載到 Docker 容器中的目錄。
   + `/greengrass/v2`。 您要用於安裝的 Greengrass 根資料夾。您可以使用 `GGC_ROOT`環境變數來設定此值。
   + *MyGreengrassCore*。物件的名稱 AWS IoT 。
   + *nucleus-version*。要安裝 AWS IoT Greengrass 的核心軟體版本。此值必須符合您下載的 Docker 映像或 Dockerfile 版本。如果您使用 `latest`標籤下載 Greengrass Docker 映像，請使用 ****docker inspect *image-id***** 查看映像版本。
   + *區域*。您建立 AWS IoT 資源 AWS 區域 的 。您也必須為`AWS_REGION`環境[檔案中](#create-env-file-manual-provisioning)的環境變數指定相同的值。
   + *GreengrassCoreTokenExchangeRoleAlias*。字符交換角色別名。
   + *device-data-prefix*。 AWS IoT 資料端點的字首。
   + *device-credentials-prefix*。登入 AWS IoT 資料端點的字首。

## 建立環境檔案


本教學課程使用環境檔案來設定將傳遞至 Docker 容器內 AWS IoT Greengrass Core 軟體安裝程式的環境變數。您也可以在`docker run`命令中使用 [`-e`或 `--env`引數](https://docs.docker.com/engine/reference/commandline/run/#env)，在 Docker 容器中設定環境變數，也可以在 `docker-compose.yml` 檔案的 [`environment`區塊](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)中設定變數。

1. 使用文字編輯器來建立名為 的環境檔案`.env`。

   例如，在以 Linux 為基礎的系統上，您可以執行下列命令，使用 GNU nano `.env` 在目前的目錄中建立 。

   ```
   nano .env
   ```

1. 將下列內容複製到 檔案。

   ```
   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`。 用來安裝 AWS IoT Greengrass Core 軟體的根資料夾路徑。
   + *區域*。您建立 AWS IoT 資源 AWS 區域 的 。您必須為`awsRegion`組態[檔案中的組態](#create-docker-install-configuration-file)參數指定相同的值。
   + */tmp/config/*。您在啟動 Docker 容器時掛載組態檔案的資料夾。
**注意**  <a name="docker-local-dev-tools-production-environment-warning"></a>
您可以將`DEPLOY_DEV_TOOLS`環境變數設定為 `true`以部署 [Greengrass CLI 元件](greengrass-cli-component.md)，這可讓您在 Docker 容器內開發自訂元件。<a name="local-dev-tools-production-environment-warning"></a>建議您僅在開發環境中使用此元件，而非生產環境中。此元件可讓您存取生產環境中通常不需要的資訊和操作。僅將此元件部署到您需要的核心裝置，以遵循最低權限原則。

## 在容器中執行 AWS IoT Greengrass 核心軟體
執行 AWS IoT Greengrass 核心軟體

本教學課程說明如何啟動您在 Docker 容器中建置的 Docker 映像。您可以使用 Docker CLI 或 Docker Compose CLI 在 Docker 容器中執行 AWS 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：](https://docs.docker.com/engine/reference/commandline/run/)
  + <a name="docker-run-rm"></a>[https://docs.docker.com/engine/reference/run/#clean-up---rm](https://docs.docker.com/engine/reference/run/#clean-up---rm)。 在容器結束時清除容器。
  + <a name="docker-run-init"></a>[https://docs.docker.com/engine/reference/run/#specify-an-init-process](https://docs.docker.com/engine/reference/run/#specify-an-init-process)。 在容器中使用初始化程序。
**注意**  
當您停止 Docker 容器時，需要 `--init`引數來關閉 AWS IoT Greengrass Core 軟體。
  + <a name="docker-run-it"></a>[https://docs.docker.com/engine/reference/run/#foreground](https://docs.docker.com/engine/reference/run/#foreground)。 （選用） 在前景中以互動式程序執行 Docker 容器。您可以使用 `-d`引數取代此值，以分離模式執行 Docker 容器。如需詳細資訊，請參閱 Docker 文件中的[分離與前景](https://docs.docker.com/engine/reference/run/#detached-vs-foreground)。
  + <a name="docker-run-name"></a>[https://docs.docker.com/engine/reference/run/#name---name](https://docs.docker.com/engine/reference/run/#name---name)。 執行名為 的容器 `aws-iot-greengrass` 
  + <a name="docker-run-v"></a>[https://docs.docker.com/storage/volumes/](https://docs.docker.com/storage/volumes/)。 將磁碟區掛載到 Docker 容器，讓組態檔案和憑證檔案可供容器內 AWS IoT Greengrass 執行。
  + <a name="docker-run-env-file"></a>[https://docs.docker.com/engine/reference/commandline/run/#env](https://docs.docker.com/engine/reference/commandline/run/#env)。 （選用） 指定環境檔案，以設定要傳遞至 Docker 容器內 AWS IoT Greengrass Core 軟體安裝程式的環境變數。只有在您建立[環境檔案](#create-env-file-manual-provisioning)來設定環境變數時，才需要此引數。如果您未建立環境檔案，您可以使用`--env`引數直接在 Docker 執行命令中設定環境變數。
  + <a name="docker-run-p"></a>[https://docs.docker.com/engine/reference/commandline/run/#publish](https://docs.docker.com/engine/reference/commandline/run/#publish)。 （選用） 將 8883 容器連接埠發佈至主機。如果您想要透過 MQTT 連接和通訊，則需要此引數，因為 AWS IoT Greengrass 使用連接埠 8883 處理 MQTT 流量。若要開啟其他連接埠，請使用其他引`-p`數。
**注意**  <a name="docker-run-cap-drop"></a>
若要以更高的安全性執行 Docker 容器，您可以使用 `--cap-drop`和 `--cap-add`引數來選擇性地為您的容器啟用 Linux 功能。如需詳細資訊，請參閱 Docker 文件中的[執行期權限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。

------
#### [ Docker Compose ]

1. 使用文字編輯器來建立名為 的 Docker Compose 檔案`docker-compose.yml`。

   例如，在以 Linux 為基礎的系統上，您可以執行下列命令，使用 GNU nano `docker-compose.yml` 在目前的目錄中建立 。

   ```
   nano docker-compose.yml
   ```
**注意**  
您也可以從 [GitHub](https://github.com/aws-greengrass/aws-greengrass-docker/releases/) 下載並使用最新版本的 AWS Compose 檔案。

1. 將下列內容新增至 Compose 檔案。您的檔案看起來應該如下列範例：將 *your-container-name：version* 取代為 Docker 映像的名稱。

   ```
   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"
   ```<a name="docker-compose-optional-params"></a>

   此範例中的下列參數 Compose 檔案為選用：
   + `ports`—發佈 8883 容器連接埠至主機。如果您想要透過 MQTT 連接和通訊，則需要此參數，因為 AWS IoT Greengrass 使用連接埠 8883 處理 MQTT 流量。
   + `env_file`- 指定環境檔案，以設定將傳遞至 Docker 容器內 AWS IoT Greengrass Core 軟體安裝程式的環境變數。只有在您建立[環境檔案](#create-env-file-manual-provisioning)來設定環境變數時，才需要此參數。如果您未建立環境檔案，您可以使用[環境](https://docs.docker.com/compose/compose-file/compose-file-v3/#environment)參數直接在 Compose 檔案中設定變數。
**注意**  <a name="docker-compose-cap-drop"></a>
若要以更高的安全性執行 Docker 容器，您可以在 `cap_add` Compose 檔案中使用 `cap_drop`和 ，為您的容器選擇性地啟用 Linux 功能。如需詳細資訊，請參閱 Docker 文件中的[執行期權限和 Linux 功能](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities)。

1. 執行下列命令來啟動容器。

   ```
   docker-compose -f docker-compose.yml up
   ```

------

## 後續步驟


<a name="run-greengrass-docker-success"></a>AWS IoT Greengrass 核心軟體現在正在 Docker 容器中執行。執行下列命令，以擷取目前執行中容器的容器 ID。

```
docker ps
```

然後，您可以執行下列命令來存取容器，並探索在容器內執行 AWS IoT Greengrass 的核心軟體。

```
docker exec -it container-id /bin/bash
```

如需建立簡單元件的詳細資訊，請參閱 [步驟 4：在您的裝置上開發和測試元件](create-first-component.md)中的 [教學課程：入門 AWS IoT Greengrass V2](getting-started.md)

**注意**  <a name="run-greengrass-commands-in-docker-note"></a>
當您使用 在 Docker 容器內`docker exec`執行命令時，這些命令不會記錄在 Docker 日誌中。若要在 Docker 日誌中記錄命令，請將互動式 shell 連接到 Docker 容器。如需詳細資訊，請參閱[將互動式 shell 連接至 Docker 容器](docker-troubleshooting.md#debugging-docker-attach-shell)。

 AWS IoT Greengrass 核心日誌檔案稱為 `greengrass.log`，位於 中`/greengrass/v2/logs`。元件日誌檔案也位於相同的目錄中。若要將 Greengrass 日誌複製到主機上的暫存目錄，請執行下列命令：

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

如果您想要在容器結束或移除後保留日誌，建議您僅將`/greengrass/v2/logs`目錄繫結至主機上的暫存日誌目錄，而不是掛載整個 Greengrass 目錄。如需詳細資訊，請參閱[在 Docker 容器外保留 Greengrass 日誌](docker-troubleshooting.md#debugging-docker-persist-logs)。

<a name="greengrass-docker-stop"></a>若要停止執行中的 AWS IoT Greengrass Docker 容器，請執行 `docker stop`或 `docker-compose -f docker-compose.yml stop`。此動作會`SIGTERM`傳送至 Greengrass 程序，並關閉在容器中啟動的所有相關程序。Docker 容器會使用`docker-init`可執行檔初始化為程序 PID 1，這有助於移除任何剩餘的殭屍程序。如需詳細資訊，請參閱 Docker 文件中的[指定初始化程序](https://docs.docker.com/engine/reference/run/#specify-an-init-process)。

<a name="see-docker-troubleshooting"></a>如需對 AWS IoT Greengrass 在 Docker 容器中執行 的問題進行故障診斷的資訊，請參閱 [在 Docker AWS IoT Greengrass 容器中進行故障診斷](docker-troubleshooting.md)。