Amazon Web Services ブログ

ローカルのMosquitto MQTT BrokerをブリッジにAWS IoTを使う

AWS SDKまたはAWS IoT Device SDKを使用して、数百万のオブジェクトをAWS IoTに安全に接続できます。
製造業におけるIoTの場合、オブジェクトは複数の理由でゲートウェイに接続されます。
センサーは非常に制約され、クラウドに直接接続できないことや、センサーはプロトコルとしてMQTTが使えないまたは、 ゲートウェイ上でローカルに分析と処理を実行する必要があります。

ローカルMQTTブローカーの1つの機能は「ブリッジ」と呼ばれ、MQTTメッセージを交換できるように、ローカルMQTTブローカーをAWS IoTに接続することができます。 これにより、オブジェクトがAWS IoTと双方向で通信し、AWSクラウドの恩恵を受けることができます。

この記事では、この機能が非常に便利で、実装方法を示すユースケースについて説明します。

 

MQTTブローカーをAWS IoTにブリッジする理由

IoTではセキュリティが最も重要であり、AWS IoTブローカーには、クライアント証明書付きのTLS 1.2などに基づいてデバイスを認証および認可する高度なセキュリティビルトインが組み込まれています。

従来のIoTデプロイメントを使用している場合は、MQTTブローカーにユーザー名やパスワードなどの他の認証メカニズムを使用してオブジェクトをすでに接続している可能性があります。 MQTTブローカーは、センサーがデプロイされる非常に近い場所(ローカルMQTTブローカー)もしくはクラウドの中に構築されています。

現在のセキュリティ標準をAWS IoTのものに合わせてアップグレードする予定で、AWS IoTのスケーラビリティとルールエンジンの恩恵を受けるには、従来のMQTTブローカーをAWS IoTにブリッジすることができます。これは、現在のシステムのアップグレードを待たずにすばやく導入できる簡単な一時的なソリューションです。単一のブローカーを超えるスケーリングはこの記事の範囲には含まれていませんが、Mosquitto MQTT Brokerのブリッジ機能に焦点を当てます。

MosquittoのようなオープンソースのMQTTブローカーは、Linuxのような多くのオペレーティングシステムにインストールすることができます。ローカルデバイスにMosquittoをインストールすると、Mosquitto bokerの機能(ローカルでのメッセージの永続化、ローカルでのログのアクティビティ)をローカルで有効にするだけでなく、ローカルデバイスにMosquittoをインストールすることで、AWS IoTにデータを送信するための特別なコードを開発する必要がありません。

Mosquitto MQTT Brokerのインストール方法

最初のステップは、あなたのデバイス/仮想マシンにMosquittoブローカーをインストールすることです、Mosquittoのダウンロードページはこちらです。

一般的には、ローカルゲートウェイにインストールすることになります。 Mosquittoは、多くのLinuxディストリビューションを含む幅広いプラットフォームをサポートしています。 したがって、低電力デバイスや本格的なサーバー/仮想マシンでローカルゲートウェイを実行することができます。

私たちの場合、MosquittoをEC2 Amazon Linuxインスタンスにインストールします。これは、Linuxディストリビューションを実行するローカルゲートウェイを持つことと同等です。

Amazon EC2インスタンスの使用を計画していない場合は、「AWS IoTへのブリッジ設定方法」のセクションをお読みください。

 

EC2インスタンスの起動と設定

Mosquitto Brokerとして利用するEC2インスタンスの起動の前に、IAM Roleを作成します。これは、AWS IoTとのブリッジをするためにCLIをインスタンスで利用するためにkeyなどの認証情報が必要となるためです。

AWS ウェブコンソールからIAM serviceへアクセスします。

 

2. Roleをクリックします。

3. Create New Roleをクリックします。

4. Roleに AWSIoTConfigAccessと名付けます

5. Next Stepをクリックします

6. Select Role TypeからAmazon EC2を選択します

7. FilterにAWSIoTConfigAccessを入力します

8. PolicyにAWSIoTConfigAccessを選択し、Next Stepをクリックします

9. Reviewを確認し、Create Roleをを実行します

10. これでRoleの作成は完了となりました、AmazonEC2のコンソールへ移動してください。選択するリージョンはAWS IoTが利用できるリージョンを選択します、本記事中はフランクフルトを利用しています。

11. Launch Instanceをクリックします

12. Amazon Linux AMIを選択します

13. t2.microインスタンスを選択します

14. Next:Cofigure Instance Detailsをクリックします

15. IAM Roleに先程作成した、AWSIoTCofingAccessを選択します

16. デフォルト設定のまま Next:Add Storage

17. デフォルトのまま、Next:Tag Instance

18. TagのNameに ‘MosquttoBroker’と設定

19. Next:Cofigure Security Groupsをクリック

20. 新しいSecurity Groupの作成をします。

Security group nameに ‘MosquttoBroker’

Add Ruleで
Custom TCP Rule / TCP /8883 / 0.0.0.0/0を追加

21. Review and Launchをクリックし、EC2 Instanceを作成します

22. EC2が起動したら、EC2に接続してください

23. ログイン後に以下のコマンドを実行してください

#リポジトリのリストをMosquittoを含むリポジトリに更新する
sudo wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-7/home:oojah:mqtt.repo -O /etc/yum.repos.d/mqtt.repo

#Mosqutto brokerとcliツールのインストールの実行
sudo yum install mosquitto mosquitto-clients

AWS IoTへのブリッジ設定方法

これでEC2(もしくはローカルゲートウェイ)へのMosquttoのインストールが完了しました、これよりMosqutto BrokerからAWS IoTへのブリッジの設定となります。
ここからAWS CLIを用いてAWS IoTの必要リソースの設定をしていきます。

# CLIのリージョンを設定してください。access/private keyはブランクのままで設定してください
aws configure

# ブリッジとしてのIAM Policyを作成します。
aws iot create-policy --policy-name bridge --policy-document '{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "iot:*","Resource": "*"}]}'

#あなたのMosquittoのディレクトリで作業してください
# 証明書と鍵を作成します。証明書のARNはメモしてください
cd /etc/mosquitto/certs/
sudo aws iot create-keys-and-certificate --set-as-active --certificate-pem-outfile cert.crt --private-key-outfile private.key --public-key-outfile public.key –region eu-central-1

# 証明書をリストし、ARNを以下の形式でコピーします。
# arn:aws:iot:eu-central-1:0123456789:cert/xyzxyz
aws iot list-certificates

#Policyと証明書を紐付けします
aws iot attach-principal-policy --policy-name bridge --principal <ARN_OF_CERTIFICATE>

#証明書のパーミッションを変更します
sudo chmod 644 private.key
sudo chmod 644 cert.crt

# root CA 証明書をダウンロードします
sudo wget https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -O rootCA.pem

ブリッジのクライアント証明書が取得できました。この証明書は、ブリッジにすべてのアクセス許可を与えるIAMポリシーに関連付けられています(このポリシーは、使用するために制限する必要があります)。 ブリッジには接続に必要なものすべてがありますので、Mosquittoの特定のパラメータで設定ファイルを編集するだけです。

# 設定ファイルを作成します
sudo nano /etc/mosquitto/conf.d/bridge.conf

以下のコンテンツをnanoエディターに貼り付け、保存をしてください。

AWS IoTのエンドポイントは自分の環境に合わせて変更してください。AWS IoTのエンドポイントはAWS CLIを用いてこのようなコマンドで取得できます。(aws iot describe-endpoint)
変更箇所は addressセクションの(XXXXXXXXXX.iot.region.amazonaws.com)になります。

#Copy paste the following in the nano editor:
# =================================================================
# Bridges to AWS IOT
# =================================================================

# AWS IoT endpoint, use AWS CLI 'aws iot describe-endpoint'
connection awsiot
address XXXXXXXXXX.iot.region.amazonaws.com:8883 

# Specifying which topics are bridged
topic awsiot_to_localgateway in 1
topic localgateway_to_awsiot out 1
topic both_directions both 1

# Setting protocol version explicitly
bridge_protocol_version mqttv311
bridge_insecure false

# Bridge connection name and MQTT client Id,
# enabling the connection automatically when the broker starts.
cleansession true
clientid bridgeawsiot
start_type automatic
notifications false
log_type all

# =================================================================
# Certificate based SSL/TLS support
# -----------------------------------------------------------------
#Path to the rootCA
bridge_cafile /etc/mosquitto/certs/rootCA.pem

# Path to the PEM encoded client certificate
bridge_certfile /etc/mosquitto/certs/cert.crt

# Path to the PEM encoded client private key
bridge_keyfile /etc/mosquitto/certs/private.key

 

これでMosquttoを新しい設定で起動する準備が整いました。

Moquttoをバックグラウンドで起動します。

sudo mosquitto -c /etc/mosquitto/conf.d/bridge.conf –d

OS起動時の自動設定は以下です。

sudo chkconfig --level 345 scriptname on

 

動作確認

ブローカーが開始され、すでにバックグラウンドでAWS IoTに接続しています。 この設定では、3つのトピックをブリッジしました:

  • awsiot_to_localgateway:このトピックからAWS IoTによって受信されたすべてのメッセージは、ローカルゲートウェイに転送されます
  • localgateway_to_awsiot:ローカルゲートウェイが受信したメッセージはすべてAWS IoTに転送されます
  • both_directions:1つのブローカがこのトピックで受信したメッセージは、他のブローカに転送されます

 

“localgateway_to_awsiot”の動作確認は簡単に確認出来ます。

  • AWS IoTのコンソールからTestを選択します
  • Subscribeに “localgateway_to_awsiot” を入力し、Subscribe to Topicをクリックします

subscribeするとメニューのsubscriptionsに”localgateway_to_awsiot”が表示されますので、そちらを選択します。

AWT IoT側でこのトピックをsubscribeしたので、端末から(ローカルゲートウェイから)以下のコマンドでMQTTメッセージを発行して、転送されるかどうかを確認できます。

mosquitto_pub -h localhost -p 1883 -q 1 -d -t localgateway_to_awsiot  -i clientid1 -m "{\"key\": \"helloFromLocalGateway\"}"

ブリッジにより、AWS IoTに配信されたメッセージが表示されるはずです。

Amazon EC2インスタンスでテストを行った場合は、ローカル/リモートのMQTTブローカでこれを行うことができます。

ネクストステップ

ローカルブローカーとAWS IoTの間のブリッジが稼働しているので、ブリッジ接続のいくつかのパラメータを微調整することが必要な場合があります。 追加の詳細が必要な場合は、公式のMosquittoのドキュメントのBridgeセクションを参照してください。

AWS IoTにデータが流れているので、機械学習分析リアルタイムダッシュボードなど他のAWSサービスを使用して新しいIoTアプリケーションを作成することができます。
これらについてはブログドキュメント開発用リソースをご活用ください

 

原文:How to Bridge Mosquitto MQTT Broker to AWS IoT (Michael Garcia)
翻訳はSA小梁川が担当しました。