1 簡介html
AWS IoT解決方案是一個全託管的雲平臺,使互聯設備能夠輕鬆安全地與雲應用程序及其餘設備交互。AWS IoT能夠支持數十億太設備和數萬億條消息,而且能夠對這些消息進行處理並將其安全可靠地路由至AWS終端節點和其餘設備。AWS IoT平臺支持您將設備鏈接到AWS服務和其餘設備,保證數據和交互的安全,處理設備數據並對其執行操做,以及支持應用程序與即使處於離線狀態的設備進行交互。python
使用AWS IoT的第一步是將設備鏈接到AWS IoT Core服務。AWS IoT支持多種接入協議,身份認證方法和受權策略。linux
2 AWS IoT支持的協議web
設備要接入AWS IoT,首先要使用AWS IoT支持的協議來跟IoT平臺交互。算法
2.1 HTTP協議json
http協議是互聯網中最爲常見的協議。http協議支持後面提到的全部認證和受權方式。可是在物聯網的場景中,它也有協議開銷比較大等肯定,另外http只有請求響應的模式不支持物聯網場景中很是重要的訂閱模式,不能支持下行命令的下發。flask
2.2 MQTT協議安全
MQTT協議是物聯網場景中使用最爲普遍的協議,具備協議開銷小,支持發佈訂閱等全部模式的有點。bash
2.3 MQTT over WEBSOCKET服務器
MQTT over websocket是基於websocket上的MQTT協議,使用443端口,在網絡環境可達性上比MQTT更有優點,可是也相對複雜一些。
3 AWS IoT支持的認證和受權方式
設備接入AWS IoT的時候,必需要進行認證,確認設備的合法身份。經過認證後,還須要對設備的請求進行鑑權,只有通過受權的請求才會被AWS IoT接受。不一樣的設備認證方式,其受權方式也可能有所不一樣。
AWS IoT支持的認證方式有4種,分別是IAM身份、Cognito身份、X.509證書和自定義身份驗證。
AWS IoT支持的售前策略由2種,分別是IAM policy和IoT policy。
4 準備工做
4.1 建立操做環境
在aws上建立一臺EC2服務器,建立的過程當中,須要建立一個角色來訪問該ec2
點擊"建立新的IAM角色"
點擊"建立角色"
選擇"AWS產品"->"EC2",點擊"下一步"
選擇"AdministratorAccess",點擊"下一步",標籤部分能夠忽略,直接點擊"下一步"
輸入指定角色名稱,"建立角色",再回到以前建立EC2的界面,刷新角色
而後繼續ec2相關配置,直至建立成功(具體步驟略)。
4.2 配置操做環境
遠程登陸到建立的ec2服務器(具體過程略)
由於操做經過AWS CLI進行,而我建立是ec2中沒有安裝好CLI,因此須要本身安裝,安裝的步驟參見https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/install-linux.html#install-linux-awscli,具體安裝過程省略,可能會須要通過屢次嘗試,不一樣的操做系統版本會有微笑差別,本身體會吧。最終CLI安裝成功,以下圖:
配置AWS CLI,其中的區域我選擇的是美東-弗吉尼亞,因此填us-east-1,輸出格式一般爲json。
準備操做目錄,如今建立一個新的操做目錄 awsiotaccessdemo。
而後下載aws iot的Root CA證書。設備鏈接應該優先選擇ATS端點,使用ATS的CA文件,由於後面的自定義身份驗證暫時不支持ATS端點,因此也須要下載VeriSign端點的CA證書。
執行命令 wgethttps://www.amazontrust.com/repository/AmazonRootCA1.pem
安裝依賴的軟件包,執行以下命令
sudo yum install python-pip jq -y
pip install boto3 --user
pip install AWSIoTPythonSDK --user
pip install flask --user
pip install paho-mqtt --user
而後獲取Account Id,執行命令account_id=`aws sts get-caller-identity | jq .Account|sed 's/"//g'`
獲取Account的IoT Endpoint前綴,執行命令endpoint_prefix=`aws iot describe-endpoint \
| jq .endpointAddress | sed 's/"//g'| awk -F . '{print $1}'`
再把剛剛獲取的Account Id和Endpoint前綴配置到環境變量中,執行以下命令:
echo "export account_id=$account_id" >> ~/.bashrc
echo "export endpoint_prefix=$endpoint_prefix" >> ~/.bashrc
4.3 配置IoT消息接收監控頁面
登陸AWS IoT控制檯,點擊「測試」條目,輸入訂閱主題「IoTDemo/#」
點擊「訂閱主題」,後續全部IoT Core收到的消息都會在下方顯示出來。
5 使用IAM身份認證接入
前面已經列出了aws支持的設備接入認證方式,本文將嘗試以不一樣的身份驗證方式接入。
用戶可使用IAM提供身份來認證設備。設備須要預置或者經過其餘方式獲取security
credential,在使用SigV4的簽名算法對請求進行簽名。AWS
IoT服務則經過簽名來認證設備的身份,經過身份認證後,IoT再根據身份擁有的IAM Policy來對請求進行鑑權。
IAM身份認證方式示意圖以下:
5.1 建立一個IAM用戶,IoTDeviceUser
輸入命令aws iam create-user --user-name IoTDeviceUser
爲IoTDeviceUser用戶建立AccessKey
輸入命令aws iam create-access-key \
--user-name IoTDeviceUser > /tmp/IoT_demo_access_key
記錄下AccessKeyId和SecretAccessKey,輸入如下命令:
AccessKeyId=`cat /tmp/IoT_demo_access_key| jq .AccessKey.AccessKeyId| sed 's/"//g'`
SecretAccessKey=`cat /tmp/IoT_demo_access_key| jq .AccessKey.SecretAccessKey| sed 's/"//g'`
登陸到IAM控制檯,查看剛剛建立的IAM 用戶
從上圖可見成功建立了IoTDeviceUser用戶,可是尚未指定策略。其實IAM用戶的建立及策略操做等均可以在控制檯進行,並且更方便,前面採用CLI只是爲了體驗一下操做。
5.2 設備使用HTTP協議接入
1)爲設備建立IAM Policy,輸入命令:
device_IAM_http_policy_arn=`aws iam create-policy \
--policy-name IoTDeviceIAMHttpPolicy \
--policy-document "{
\"Version\": \"2012-10-17\",
\"Statement\": [
{
\"Sid\": \"VisualEditor0\",
\"Effect\": \"Allow\",
\"Action\": \"iot:Publish\",
\"Resource\": [
\"arn:aws:iot:us-east-1:${account_id}:topic/IoTDemo/device_IAM_http\"
]
}
]
}" | jq .Policy.Arn | sed 's/"//g'`
2)將IAM Policy綁定到IAM用戶,執行命令
aws iam attach-user-policy --user-name IoTDeviceUser \
--policy-arn ${device_IAM_http_policy_arn}
把IAM Policy綁定到IAM用戶,執行命令aws iam attach-user-policy --user-name IoTDeviceUser \
--policy-arn ${device_IAM_http_policy_arn}
3)生成模擬設備程序
執行以下命令:
cat <<-EOF > ~/awsIoTAccessDemo/device_IAM_http.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import boto3
import argparse
import json
#獲取參數
parser = argparse.ArgumentParser(description='Send data to IoT Core')
parser.add_argument('--data', default="data from device_IAM_http",
help='data to IoT core topic')
parser.add_argument('--AccessKeyId', required=True,
help='AccessKeyId')
parser.add_argument('--SecretAccessKey', required=True,
help='SecretAccessKey')
args = parser.parse_args()
data = args.data
access_key_id = args.AccessKeyId
secret_access_key = args.SecretAccessKey
device_name = 'device_IAM_http'
region = 'us-east-1'
topic = "IoTDemo/"+device_name
iot_data_client = boto3.client('iot-data',region_name=region,aws_access_key_id=access_key_id,aws_secret_access_key=secret_access_key)
response = iot_data_client.publish(
topic=topic,
qos=0,
payload=json.dumps({"source":device_name, "data":data})
)
EOF
注意:代碼中的區域要填寫正確。
4)運行模擬設備程序
python device_IAM_http.py --data "data from device IAM http." \
--AccessKeyId ${AccessKeyId} --SecretAccessKey ${SecretAccessKey}
5)再去IoT控制檯查看收到的消息
由上圖可見消息來自剛剛建立的.py文件,消息內容也正是文件中的字段,由此證實設備發送消息成功。
後續我將繼續嘗試用不一樣的身份認證和不一樣的協議接入。
參考文檔:
https://amazonaws-china.com/cn/blogs/china/connect-your-devices-to-aws-iot-securely-1/?nc1=b_rp