

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

# 使用 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)
+ [安装适用于的 AWS IoT 设备 SDK JavaScript](#ec2-sdk)
+ [运行示例应用程序](#ec2-run-app)
+ [在 AWS IoT 控制台中查看来自示例应用程序的消息](#ec2-view-msg)

## 设置 Amazon EC2 实例
<a name="set-up-ec2"></a>

以下步骤介绍了如何创建一个 Amazon EC2 实例，以作为您的虚拟设备代替物理设备。

如果这是您首次创建 Amazon EC2 实例，您可能会发现 A [mazon EC2 Linux 实例入门](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. 在**应用程序和操作系统映像（Amazon 机器映像）**下，为您的实例选择一个 AMI 模板，例如 *Amazon Linux 2 AMI（HVM）*。请注意，此 AMI 标记为“符合条件的免费套餐”。

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. 在**实例**屏幕上，您可以查看启动状态。启动实例只需很短的时间。启动实例时，其初始状态为 `pending`。实例启动后，其状态变为 `running`，并且会收到一个公有 DNS 名称。（如果**公用 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. 选择实例，然后选择**连接**。

1. 依次选择 **Amazon EC2 Instance Connect**（Amazon EC2 实例连接）和 **Connect**（连接）。

您现在应该有一个 **Amazon EC2 Instance Connect** 窗口，该窗口将登录您的新 Amazon EC2 实例。

## 安装 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** 窗口中，使用以下命令安装节点版本管理器（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
   ```
**注意**  
这将安装最新 LTS 版本的 Node.js。

   安装 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 Root 证书颁发机构签名的客户端证书。此证书用于验证虚拟设备的身份。

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 C** onnect 窗口中，使用以下命令和上一个命令的响应*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"
   ```

   如果成功，此命令将不会显示任何输出。

## 安装适用于的 AWS IoT 设备 SDK JavaScript
<a name="ec2-sdk"></a>

在本节中，您将安装适用于 Device SDK JavaScript，其中包含应用程序可以用来与之通信的代码 AWS IoT 和示例程序。 AWS IoT 有关更多信息，请参阅[ JavaScript GitHub 存储库的AWS IoT 设备 SDK](https://github.com/aws/aws-iot-device-sdk-js-v2)。

**在您的 Linux 实例 JavaScript 上安装适用于的 AWS IoT 设备软件开发工具包**

1. 在您**的 Amazon EC2 Instance Connect** 窗口中，使用此命令将 JavaScript 存储库的 AWS IoT 设备软件开发工具包克隆到您的主目录目录中。`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`  | 

在本节中，您将安装并运行位于 AWS IoT 设备软件开发工具包`aws-iot-device-sdk-js-v2/samples/node`目录中的`pub-sub.js`示例应用程序 JavaScript。此应用程序显示设备（即您的 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** 窗口中，使用此命令*your-iot-endpoint*从中 AWS IoT 获取。

   ```
   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. 向主题 **topic\$11** 发布 10 条消息。

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 测试客户端**，在示例应用程序的消息通过消息代理时查看它们。

**要查看示例应用程序发布的 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 实例连接**窗口中，再次运行示例应用程序，然后在 **AWS IoT 控制台**的 **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 支持该协议的更多信息，请参阅 [MQ](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) TT。