

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

# 使用 Amazon EC2 建立虛擬裝置
<a name="creating-a-virtual-thing"></a>

在本教學課程中，您將建立 Amazon EC2 執行個體，充當雲端中的虛擬裝置。

若要完成本教學課程，您需要 AWS 帳戶。若您沒有帳戶，請完成 [設定 AWS 帳戶](setting-up.md) 所述的步驟，然後再繼續。

**Topics**
+ [設定 Amazon EC2 執行個體](#set-up-ec2)
+ [安裝 Git、Node.js 並設定 AWS CLI](#install-git-node)
+ [為您的虛擬裝置建立 AWS IoT 資源](#ec2-create-certificate)
+ [安裝適用於 JavaScript 的 AWS IoT 裝置 SDK](#ec2-sdk)
+ [執行範例應用程式](#ec2-run-app)
+ [在 AWS IoT 主控台中檢視來自範例應用程式的訊息](#ec2-view-msg)

## 設定 Amazon EC2 執行個體
<a name="set-up-ec2"></a>

下列步驟顯示如何建立 Amazon EC2 執行個體，其將充當您的虛擬裝置取代實體裝置。

如果您是第一次建立 Amazon EC2 執行個體，[開始使用 Amazon EC2Linux 執行個體](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/EC2_GetStarted.html)中的相關指示可能會更有幫助。

**啟動執行個體**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 從左側的主控台功能表展開 **Instances** (執行個體) 區段，然後選擇 **Instances** (執行個體)。在 **Instances** (執行個體) 儀表板中，選擇右側的 **Launch instances** (啟動執行個體) 以顯示基本組態清單。

1. 在 **Name and tags** (名稱和標籤) 區段中，輸入執行個體的名稱，並選擇性地新增標籤。

1. 在 **Application in OS Images (Amazon Machine Image)** (應用程式和作業系統映像) 區段中選擇執行個體的 AMI 範本，例如 *Amazon Linux 2 AMI (HVM)*。請注意，此 AMI 會標示為 "Free tier eligible." (符合免費方案。)

1. 在 **Instance Type** (執行個體類型) 頁面中，您可以選取您執行個體的硬體組態。選取 `t2.micro` 類型，其預設為選取。請注意，此執行個體類型符合免費方案資格。

1. 在 **Key pair (login)** (金鑰對 (登入)) 區段中，從下拉式清單中選擇金鑰對名稱，或選擇 **Create a new key pair** (建立新金鑰對) 以建立新的金鑰對。建立新金鑰對時，請務必下載私密金鑰檔案並將其儲存在安全的地方，因為這是您下載並儲存的唯一機會。每次您連線至執行個體來啟動執行個體與對應的私有金鑰時，都需要提供您的金鑰對名稱。
**警告**  
不要選取 **Proceed without a key pair** (不使用金鑰對而繼續) 選項。如果不使用金鑰對而啟動執行個體，就無法與它連線。

1. 在 **Network settings** (網路設定) 區段和 **Configure storage** (設定儲存區) 區段中，您可以保留預設設定。當您就緒後，選擇 **Launch Instances** (啟動執行個體)。

1. 會有確認頁面讓您知道您的執行個體正在啟動。選擇 **View Instances** (檢視執行個體) 關閉確認頁面並返回主控台。

1. 您可以在 **Instances (執行個體)** 畫面中檢視啟動狀態。啟動執行個體無須費時。當您啟動執行個體時，其初始狀態是 `pending`。在執行個體啟動後，其狀態會變更為 `running`，並得到公有的 DNS 名稱。(如果隱藏 **Public DNS (IPv4) (公有 DNS (IPv4))** 欄，請選擇頁面右上角的 **Show/Hide Columns (顯示/隱藏欄)** (齒輪狀圖示)，然後選取 **Public DNS (IPv4) (公有 DNS (IPv4))**。)

1. 執行個體可能需要幾分鐘的時間準備就緒讓您連線。確認您的執行個體是否已通過狀態檢查，您可以在 **Status Checks (狀態檢查)** 欄檢視此資訊。

   在新的執行個體通過其狀態檢查之後，請繼續下一個程序並連接至該執行個體。

**連結到您的執行個體**

您可以從 Amazon EC2 主控台選取執行個體，並選擇使用 Amazon EC2 Instance Connect 來進行連線，以使用瀏覽器型用戶端連接至執行個體。Instance Connect 會處理許可並提供成功的連線。

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在左側選單中，選擇 **Instances** (執行個體)。

1. 選取執行個體，然後選取 **Connect (連線)**。

1. 選擇 **Amazon EC2 Instance Connect**，**Connect** (連線)。

您現在應該具有已登入新 Amazon EC2 執行個體的 **Amazon EC2 Instance Connect** 視窗。

## 安裝 Git、Node.js 並設定 AWS CLI
<a name="install-git-node"></a>

在本節中，您會在 Linux 執行個體上安裝 Git 和 Node.js。

**安裝 Git**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令更新您的執行個體。

   ```
   sudo yum update -y
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令安裝 Git。

   ```
   sudo yum install git -y
   ```

1. 若要檢查 Git 是否已安裝，以及 Git 的目前版本，請執行下列命令：

   ```
   git --version
   ```

**安裝 Node.js**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令安裝 Node Version Manager (NVM)。

   ```
   curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
   ```

   nvm 可以安裝多種 Node.js 版本且允許您在各版本間進行切換，因此我們會使用 nvm 安裝 Node.js。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令啟用 nvm。

   ```
   . ~/.nvm/nvm.sh
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用 nvm 來透過使用此命令安裝最新版本的 Node.js。

   ```
   nvm install 16
   ```
**注意**  
這會安裝 Node.js 的最新 LTS 版本。

   安裝 Node.js 時，系統會一併安裝節點套件管理工具 (npm)，您可以視需要安裝額外的模組。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令來測試是否已安裝並正確地執行 Node.js。

   ```
   node -e "console.log('Running Node.js ' + process.version)"
   ```

    本教學課程需要 Node v10.0 或更新版本。如需詳細資訊，請參閱 [Tutorial: Setting Up Node.js on an Amazon EC2 Instance](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html) (教學課程：在 Amazon EC2 執行個體上設定 Node.js)。

**設定 AWS CLI**

您的 Amazon EC2 執行個體已預先載入 AWS CLI。不過，您必須完成您的 AWS CLI 設定檔。如需如何設定 CLI 的詳細資訊，請參閱[設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

1. 下列範例顯示範本值。將它們取代為您自己的值。您可以在 [AWS 主控台中於您在 **My Security Credentials**](https://console.aws.amazon.com//iam/home#/security_credentials) (我的安全憑證) 下的帳戶資訊中找到這些值。

   在您的 **Amazon EC2 Instance Connect** 視窗中，輸入此命令：

   ```
   aws configure
   ```

   然後在顯示的提示中輸入來自您帳戶的值。

   ```
   AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
   AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   Default region name [None]: us-west-2
   Default output format [None]: json
   ```

1. 您可以使用此命令測試您的 AWS CLI 組態：

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

   如果您的 AWS CLI 設定正確，命令應該會從 傳回端點地址 AWS 帳戶。

## 為您的虛擬裝置建立 AWS IoT 資源
<a name="ec2-create-certificate"></a>

本節說明如何使用 AWS CLI 直接在虛擬裝置上建立物件物件及其憑證檔案。這是直接在裝置上完成，以避免從另一台電腦將它們複製到裝置時可能造成的潛在複雜性。在本節中，您將為虛擬裝置建立下列資源：
+ 代表虛擬裝置所在的物件 AWS IoT。
+ 要驗證虛擬裝置的憑證。
+ 政策文件，用來授權虛擬裝置連接至 AWS IoT，以及用來發佈、接收和訂閱訊息。

**在 Linux 執行個體中建立 AWS IoT 物件**

連接到 的裝置 AWS IoT 由 AWS IoT 登錄檔中的*物件*表示。「物件」**代表特定的裝置或邏輯實體。在此案例中，您的「物件」**將代表您的虛擬裝置，即 Amazon EC2 執行個體。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，執行下列命令來建立您的物件。

   ```
   aws iot create-thing --thing-name "MyIotThing"
   ```

1. JSON 回應應該如下所示：

   ```
   {
       "thingArn": "arn:aws:iot:your-region:your-aws-account:thing/MyIotThing", 
       "thingName": "MyIotThing",
       "thingId": "6cf922a8-d8ea-4136-f3401EXAMPLE"
   }
   ```

**在 Linux 執行個體中建立和連接 AWS IoT 金鑰和憑證**

**[create-keys-and-certificate](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/create-keys-and-certificate.html)** 命令會建立由 Amazon 根憑證授權機構簽署的用戶端憑證。此憑證用來驗證虛擬裝置的身分。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，建立目錄以存放您的憑證和金鑰檔案。

   ```
   mkdir ~/certs
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令下載 Amazon 憑證授權機構 (CA) 憑證的副本。

   ```
   curl -o ~/certs/Amazon-root-CA-1.pem \
       https://www.amazontrust.com/repository/AmazonRootCA1.pem
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，執行下列命令來建立您的私有金鑰、公有金鑰，以及 X.509 憑證檔案。此命令也會向 註冊和啟用憑證 AWS IoT。

   ```
   aws iot create-keys-and-certificate \
       --set-as-active \
       --certificate-pem-outfile "~/certs/device.pem.crt" \
       --public-key-outfile "~/certs/public.pem.key" \
       --private-key-outfile "~/certs/private.pem.key"
   ```

   回傳的結果如下所示。儲存 `certificateArn`，以便您可以在後續命令中使用它。您需要它，將您的憑證連接到您的物件，並在稍後的步驟中將政策連接到憑證。

   ```
   {
       "certificateArn": "arn:aws:iot:us-west-2:123456789012:cert/9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
       "certificateId": "9894ba17925e663f1d29c23af4582b8e3b7619c31f3fbd93adcb51ae54b83dc2",
       "certificatePem": "
   -----BEGIN CERTIFICATE-----
   MIICiTCCEXAMPLE6m7oRw0uXOjANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMC
   VVMxCzAJBgNVBAgEXAMPLEAwDgYDVQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6
   b24xFDASBgNVBAsTC0lBTSEXAMPLE2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAd
   BgkqhkiG9w0BCQEWEG5vb25lQGFtYEXAMPLEb20wHhcNMTEwNDI1MjA0NTIxWhcN
   MTIwNDI0MjA0NTIxWjCBiDELMAkGA1UEBhMCEXAMPLEJBgNVBAgTAldBMRAwDgYD
   VQQHEwdTZWF0dGxlMQ8wDQYDVQQKEwZBbWF6b24xFDAEXAMPLEsTC0lBTSBDb25z
   b2xlMRIwEAYDVQQDEwlUZXN0Q2lsYWMxHzAdBgkqhkiG9w0BCQEXAMPLE25lQGFt
   YXpvbi5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMaK0dn+aEXAMPLE
   EXAMPLEfEvySWtC2XADZ4nB+BLYgVIk60CpiwsZ3G93vUEIO3IyNoH/f0wYK8m9T
   rDHudUZEXAMPLELG5M43q7Wgc/MbQITxOUSQv7c7ugFFDzQGBzZswY6786m86gpE
   Ibb3OhjZnzcvQAEXAMPLEWIMm2nrAgMBAAEwDQYJKoZIhvcNAQEFBQADgYEAtCu4
   nUhVVxYUntneD9+h8Mg9qEXAMPLEyExzyLwaxlAoo7TJHidbtS4J5iNmZgXL0Fkb
   FFBjvSfpJIlJ00zbhNYS5f6GuoEDEXAMPLEBHjJnyp378OD8uTs7fLvjx79LjSTb
   NYiytVbZPQUQ5Yaxu2jXnimvw3rrszlaEXAMPLE=
   -----END CERTIFICATE-----\n",
       "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"
       }
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，將您的物件連接到您剛建立的憑證，方法是使用下列命令，以及來自前一個命令之回應中的 *certificateArn*。

   ```
   aws iot attach-thing-principal \
       --thing-name "MyIotThing" \
       --principal "certificateArn"
   ```

   如果成功，此命令不會顯示任何輸出。

**建立並連接政策**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，複製此策略文件並將其貼到名為 **\$1/policy.json** 的檔案來建立政策檔案。

   如果您沒有最愛的 Linux 編輯器，則可以使用此命令開啟 **nano**。

   ```
   nano ~/policy.json
   ```

   將 `policy.json` 的政策文件貼入其中。輸入 ctrl-x 以結束 **nano** 編輯器並儲存檔案。

   `policy.json` 的政策文件內容  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "iot:Publish",
                   "iot:Subscribe",
                   "iot:Receive",
                   "iot:Connect"
               ],
               "Resource": [
                   "*"
               ]
           }
       ]
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令建立您的政策。

   ```
   aws iot create-policy \
       --policy-name "MyIotThingPolicy" \
       --policy-document "file://~/policy.json"
   ```

   輸出：  
****  

   ```
   {
       "policyName": "MyIotThingPolicy",
       "policyArn": "arn:aws:iot:us-east-1:your-aws-account:policy/MyIotThingPolicy",
       "policyDocument": "{
           \"Version\": \"2012-10-17\",
           \"Statement\": [
               {
                   \"Effect\": \"Allow\",
                   \"Action\": [
                       \"iot:Publish\",
                       \"iot:Receive\",
                       \"iot:Subscribe\",
                       \"iot:Connect\"
                   ],
                   \"Resource\": [
                       \"*\"
                   ]
           }
           ]
       }",
       "policyVersionId": "1"
   }
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用下列命令將政策連接至虛擬裝置的憑證。

   ```
   aws iot attach-policy \
       --policy-name "MyIotThingPolicy" \
       --target "certificateArn"
   ```

   如果成功，此命令不會顯示任何輸出。

## 安裝適用於 JavaScript 的 AWS IoT 裝置 SDK
<a name="ec2-sdk"></a>

在本節中，您將安裝適用於 JavaScript 的 AWS IoT 裝置開發套件，其中包含應用程式可用來與 AWS IoT 和範例程式通訊的程式碼。如需詳細資訊，請參閱[適用於 JavaScript GitHub 儲存庫的AWS IoT SDK](https://github.com/aws/aws-iot-device-sdk-js-v2)。

**在 Linux 執行個體上安裝適用於 JavaScript 的 AWS IoT 裝置 SDK**

1. 在 **Amazon EC2 Instance Connect** 視窗中，使用此命令將適用於 JavaScript 的 AWS IoT 裝置 SDK 儲存庫複製到主目錄的 `aws-iot-device-sdk-js-v2` 目錄中。

   ```
   cd ~
   git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
   ```

1. 導覽至您在上述步驟中建立的 `aws-iot-device-sdk-js-v2` 目錄。

   ```
   cd aws-iot-device-sdk-js-v2
   ```

1. 使用 npm 來安裝 SDK。

   ```
   npm install
   ```

## 執行範例應用程式
<a name="ec2-run-app"></a>

 以下各節命令假設您的金鑰和憑證檔案存放在虛擬裝置上，如下表所示。


**憑證檔案名稱**  

|  檔案  |  檔案路徑  | 
| --- | --- | 
|  私有金鑰  |  `~/certs/private.pem.key`  | 
|  裝置憑證  |  `~/certs/device.pem.crt`  | 
|  根 CA 憑證  |  `~/certs/Amazon-root-CA-1.pem`  | 

在本節中，您將安裝並執行可在適用於 JavaScript 的 AWS IoT 裝置 SDK `aws-iot-device-sdk-js-v2/samples/node`目錄中找到`pub-sub.js`的範例應用程式。此應用程式顯示裝置 (您的 Amazon EC2 執行個體) 如何使用 MQTT 程式庫來發佈和訂閱 MQTT 訊息。`pub-sub.js` 範例應用程式會訂閱主題 `topic_1`、將 10 則訊息發佈至該主題，以及在從訊息代理程式接收訊息時顯示這些訊息。

**安裝並執行範例應用程式**

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，導覽至 SDK 已建立的 `aws-iot-device-sdk-js-v2/samples/node/pub_sub` 目錄，並使用這些命令安裝範例應用程式。

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   npm install
   ```

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，使用此命令 AWS IoT 從 取得*your-iot-endpoint*。

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

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，依指示插入 *your-iot-endpoint* 並執行此命令。

   ```
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

範例應用程式：

1. 連線至 AWS IoT Core 您帳戶的 。

1. 訂閱訊息主題 **topic\$11**，並顯示其收到關於該主題的訊息。

1. 將 10 則訊息發佈至主題 **topic\$11**。

1. 顯示類似下列內容的輸出：

   ```
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":1}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":2}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":3}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":4}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":5}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":6}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":7}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":8}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":9}
   Publish received. topic:"topic_1" dup:false qos:1 retain:false
   {"message":"Hello world!","sequence":10}
   ```

若在執行範例應用程式時發生問題，請檢閱 [對範例應用程式的問題進行故障診斷](gs-device-troubleshoot.md)。

您也可以將 `--verbosity debug` 參數新增至命令列，以便範例應用程式顯示有關其正在做什麼的詳細訊息。這些資訊可能會提供您更正問題所需的協助。

## 在 AWS IoT 主控台中檢視來自範例應用程式的訊息
<a name="ec2-view-msg"></a>

您可以在範例應用程式的訊息透過訊息代理程式傳遞時看到這些訊臮，方法為使用 **AWS IoT 主控台**中的 **MQTT test client** (MQTT 測試用戶端)。

**檢視範例應用程式所發佈的 MQTT 訊息**

1. 檢閱 [使用 MQTT 用戶端檢視 AWS IoT MQTT 訊息](view-mqtt-messages.md)。這有助於您了解如何使用 **AWS IoT 主控台**中的 **MQTT 測試用戶端**，在 MQTT 訊息通過訊息代理程式時，檢視訊息。

1. 在 **AWS IoT 主控台**中開啟 **MQTT 測試用戶端**。

1. 在**Subscribe to a topic** (訂閱主題)中，訂閱主題，**topic\$11**。

1. 在您的 **Amazon EC2 Instance Connect** 視窗中，再次執行範例應用程式，並在 **AWS IoT 主控台**的 **MQTT test client** (MQTT 測試用戶端) 中觀看訊息。

   ```
   cd ~/aws-iot-device-sdk-js-v2/samples/node/pub_sub
   node dist/index.js --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
   ```

如需 MQTT 和 如何 AWS IoT Core 支援通訊協定的詳細資訊，請參閱 [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html)。