使用 Amazon EC2 创建虚拟设备
在本教程中,您将创建一个 Amazon EC2 实例,用作云中的虚拟设备。
要完成此教程,您需要一个AWS 账户。如果您没有账户,请完成 设置 AWS 账户 中介绍的步骤然后继续操作。
在本教程中,您将:
设置 Amazon EC2 实例
以下步骤介绍了如何创建一个 Amazon EC2 实例,以作为您的虚拟设备代替物理设备。
如果这是您首次创建 Amazon EC2 实例,您可能会发现开始使用 Amazon EC2 Linux 实例中的说明更有用。
启动实例
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在左侧的控制台菜单中,展开 Instances(实例)部分并选择 Instances(实例)。在 Instances(实例)控制面板中,选择右侧的 Launch instances(启动实例)以显示基本配置列表。
-
在 Name and tags(名称和标签)部分中,输入实例的名称并可选添加标签。
-
在应用程序和操作系统映像(Amazon 机器映像)下,为您的实例选择一个 AMI 模板,例如 Amazon Linux 2 AMI(HVM)。请注意,此 AMI 标记为“符合条件的免费套餐”。
-
在 Instance type(实例类型)部分中,您可以选择实例的硬件配置。选择
t2.micro类型(默认情况下的选择)。请注意,此实例类型适用免费套餐。 -
在 Key pair (login) [密钥对(登录)] 部分中,从下拉列表中选择密钥对名称,或选择 Create a new key pair(创建新的密钥对)以创建新的密钥对。创建新的密钥对时,确保您下载私钥文件并将其保存在安全的地方,因为这是您下载和保存它的唯一机会。当您启动实例时,您将需要提供密钥对的名称;当您每次连接到实例时,您将需要提供相应的私有密钥。
警告
请勿选择 Proceed without a key pair(在没有密钥对的情况下继续)选项。如果您启动的实例没有密钥对,就不能连接到该实例。
-
在 Network settings(网络设置)部分和 Configure storage(配置存储)部分中,您可以保留默认设置。准备就绪后,选择 Launch instances(启动实例)。
-
确认页面会让您知道自己的实例已启动。选择 View Instances 以关闭确认页面并返回控制台。
-
在实例屏幕上,您可以查看启动状态。启动实例只需很短的时间。启动实例时,其初始状态为
pending。实例启动后,其状态变为running,并且会收到一个公有 DNS 名称。(如果 公共 DNS (IPv4) 列已隐藏,请选择页面右上角的显示/隐藏列(齿轮状图标),然后选择 公共 DNS (IPv4)。) -
需要几分钟准备好实例,以便您能连接到实例。检查您的实例是否通过了状态检查;您可以在 Status Checks 列中查看此信息。
在您的新实例通过其状态检查后,继续执行下一个流程并连接到此实例。
连接到您的实例
您可以通过从 Amazon EC2 控制台中选择实例,然后选择使用 Amazon EC2 Instance Connect 进行连接,以使用基于浏览器的客户端连接到实例。Instance Connect 处理权限并提供成功的连接。
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
在左侧菜单上,选择 Instances(实例)。
-
选择实例,然后选择连接。
-
依次选择 Amazon EC2 Instance Connect(Amazon EC2 实例连接)和 Connect(连接)。
您现在应该有一个 Amazon EC2 Instance Connect 窗口,该窗口将登录您的新 Amazon EC2 实例。
安装 Git、Node.js 并配置 AWS CLI
在本部分中,您将在 Linux 实例上安装 Git 和 Node.js。
要安装 Git
-
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令更新实例。
sudo yum update -y -
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令安装 Git。
sudo yum install git -y -
要检查 Git 是否已安装以及 Git 的当前版本,请运行以下命令:
git --version
要安装 Node.js
-
在您的 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。
-
在您的 Amazon EC2 Instance Connect 窗口中,使用此命令激活 nvm。
. ~/.nvm/nvm.sh -
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令借助 nvm 安装最新版本的 Node.js。
nvm install 16注意
这将安装最新 LTS 版本的 Node.js。
安装 Node.js 还会安装节点程序包管理器(npm),以便您根据需要安装其它模块。
-
在您的 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(教程:设置 Amazon EC2 实例上的 Node.js)。
配置 AWS CLI
您的 Amazon EC2 实例预加载了 AWS CLI。但您必须完成您的 AWS CLI 配置文件。有关如何配置 CLI 的更多信息,请参阅 配置 AWS CLI。
-
以下示例显示了示例值。将它们替换为您自己的值:您可以在 AWS 控制台的 My Security Credentials
(我的安全凭证)项下的账户信息中找到这些值。 在您的 Amazon EC2 Instance Connect 窗口中,输入以下命令:
aws configure然后在显示的提示处输入您账户中的值。
AWS Access Key ID [None]:AKIAIOSFODNN7EXAMPLEAWS Secret Access Key [None]:wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEYDefault region name [None]:us-west-2Default output format [None]:json -
您可以使用此命令测试您的 AWS CLI 配置:
aws iot describe-endpoint --endpoint-type iot:Data-ATS如果您的 AWS CLI 配置正确,则该命令应该从您的 AWS 账户 返回端点地址。
为您的虚拟设备创建 AWS IoT 资源
此部分描述如何在虚拟设备上使用 AWS CLI 直接创建事物对象及其证书文件。这是直接在设备上执行的,以避免将它们从另一台电脑复制到设备时可能出现的潜在复杂问题。在本节中,您将为虚拟设备创建以下资源:
-
用于在 AWS IoT 中表示您的虚拟设备的事物对象。
-
用于验证虚拟设备身份的证书。
-
授权虚拟设备连接到 AWS IoT 以及发布、接收和订阅消息的策略文档。
要在您的 Linux 实例中创建 AWS IoT 事物对象
连接到 AWS IoT 的设备在 AWS IoT 注册表中由事物对象表示。事物对象表示特定设备或逻辑实体。在这种情况下,事物对象代表您的虚拟设备,即 Amazon EC2 实例。
-
在您的 Amazon EC2 Instance Connect 窗口中,运行以下命令以创建事物对象。
aws iot create-thing --thing-name "MyIotThing" -
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
-
在您的 Amazon EC2 Instance Connect 窗口中,创建用于存储证书和密钥文件的目录。
mkdir ~/certs -
在您的 Amazon EC2 Instance Connect 窗口中,使用此命令下载 Amazon 证书颁发机构(CA)证书的副本。
curl -o ~/certs/Amazon-root-CA-1.pem \ https://www.amazontrust.com/repository/AmazonRootCA1.pem -
在您的 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" } } -
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令和之前命令响应中的
certificateArn将您的事物对象附加到您刚刚创建的证书上。aws iot attach-thing-principal \ --thing-name "MyIotThing" \ --principal "certificateArn"如果成功,此命令将不会显示任何输出。
要创建并附加策略
-
在您的 Amazon EC2 Instance Connect 窗口中,复制此策略文档并粘贴到名为
~/policy.json的文件中,以创建策略文件。如果您没有惯用的 Linux 编辑器,则可以使用此命令打开 nano。
nano ~/policy.json将
policy.json的策略文档粘贴到其中。输入 ctrl-x 退出 nano 编辑器并保存文件。policy.json策略文档的内容。 -
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令创建策略。
aws iot create-policy \ --policy-name "MyIotThingPolicy" \ --policy-document "file://~/policy.json"输出:
-
在您的 Amazon EC2 Instance Connect 窗口中,使用以下命令将策略附加到虚拟设备的证书。
aws iot attach-policy \ --policy-name "MyIotThingPolicy" \ --target "certificateArn"如果成功,此命令将不会显示任何输出。
安装 AWS IoT Device SDK for JavaScript
在本部分中,您将安装 AWS IoT Device SDK for JavaScript,其中包含可使应用程序用于与 AWS IoT 通信的代码和示例程序。有关更多信息,请参阅适用于 JavaScript 的 AWS IoT Device SDK GitHub 存储库
要在您的 Linux 实例上安装 AWS IoT Device SDK for JavaScript
-
在您的 Amazon EC2 Instance Connect 窗口中,使用此命令将 AWS IoT Device SDK for JavaScript 存储库克隆到您的主目录中的
aws-iot-device-sdk-js-v2目录。cd ~ git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git -
导航到您在上一步中创建的
aws-iot-device-sdk-js-v2目录。cd aws-iot-device-sdk-js-v2 -
使用 npm 安装 SDK。
npm install
运行示例应用程序
下一部分中的命令假定您的密钥和证书文件均已存储在设备上,如下表中所示。
|
文件 |
文件路径 |
|---|---|
|
私有密钥 |
|
|
设备证书 |
|
|
根 CA 证书 |
|
在本部分中,您将安装并运行在 AWS IoT Device SDK for JavaScript aws-iot-device-sdk-js-v2/samples/node 目录中找到的 pub-sub.js 示例应用程序。此应用程序显示设备(即您的 Amazon EC2 实例)如何使用 MQTT 库发布和订阅 MQTT 消息。pub-sub.js 示例应用程序订阅主题 topic_1,将 10 条消息发布到该主题,并在从消息代理收到这些消息时予以显示。
要安装和运行示例应用程序
-
在您的 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 -
在您的 Amazon EC2 Instance Connect 窗口中,使用此命令从 AWS IoT 获取
your-iot-endpoint。aws iot describe-endpoint --endpoint-type iot:Data-ATS -
在您的 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 --endpointyour-iot-endpoint
示例应用程序:
-
连接到您账户的 AWS IoT Core。
-
订阅消息主题 topic_1,并显示它收到的有关该主题的消息。
-
向主题 topic_1 发布 10 条消息。
-
输出类似于以下内容:
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}
如果您在运行示例应用程序时遇到问题,请查看 借助示例应用程序排除问题。
您还可以将 --verbosity debug 参数添加到命令行,以便示例应用程序显示有关其正在执行的操作的详细消息。该信息可能会为您提供帮助以便您解决问题。
在 AWS IoT 控制台中查看来自示例应用程序的消息
您可以在 AWS IoT 控制台中使用 MQTT 测试客户端,在示例应用程序的消息通过消息代理时查看它们。
要查看示例应用程序发布的 MQTT 消息
-
审核 使用 AWS IoT MQTT 客户端查看 MQTT 消息。它可以帮助您了解如何使用 AWS IoT 控制台中的 MQTT 测试客户端来查看通过消息代理时的 MQTT 消息。
-
在 AWS IoT 控制台中打开 MQTT 测试客户端。
-
在 Subscribe to a topic(订阅主题)中,订阅主题 topic_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 --endpointyour-iot-endpoint
有关 MQTT 和 AWS IoT Core 如何支持此协议的更多信息,请参阅 MQTT。