AWS IoTゲートウェイでのcMQTT認証
この記事では、cMQTTとcMQConnectionFactoryを使ってAWS IoTのMQTT Topicと通信する方法を説明します。
cMQConnectionFactoryと併用することによって、cMQTTコンポーネントは、通常のMQTTサーバー(MQTTトランスポートを有効にしたApache ActiveMQなど)への接続だけでなく、SSLを使ってAWS IoTに作成されたMQTT Topicとの通信にも使用できます。
この記事は、ESB機能を持つ全Talend製品が対象です。
AWS IoTでリソース(モノ、ポリシー、証明書)を作成AWS IoTリソース(モノ、ポリシー、証明書)は、AWS IoTコンソール、またはAWS CLIコマンドから作成できます。AWS IoTコンソールを使ってリソースを作成する方法は次のとおりです。
リソースを作成する前に、AWS IoTへのアクセスが許可されているAWSアカウントがあることをご確認ください。そのアカウントでAWSコンソールにログインし、[AWS Services] (AWSサービス)> [AWS IoT]ページに移動してリソースを作成します。
モノを作成-
[AWS IoT]ページで、 とクリックします。
- [Create a Thing] (モノを作成)エリアの[Name] (名前)フィールドで、モノに名前を付けます。
- [Create] (作成)をクリックしてモノを作成します。
右パネルにホスト名とMQTT Topicの情報がありますが、これは後でcMQTTとcMQConnectionFactoryコンポーネントを設定する際に使います。
- [AWS IoT]ページで、 とクリックします。
- [Create a Policy] (ポリシーを作成)エリアで:
- [Name] (名前)フィールドでポリシーに名前を付けます
- iot:*アクションと*リソースと共にステートメントを追加します
- [Allow] (許可)チェックボックスを選択し、あらゆるiotモノであらゆるiot操作ができるようにします。
- [Create] (作成)をクリックしてポリシーを作成します。
- [AWS IoT]ページで、 とクリックします。
- [Create a Certificate] (証明書を作成)エリアで[1-Click certificate create] (1クリックで証明書を作成)をクリックし、プライベートキー(xxxx-private.pem.key)と証明書(xxxx-certificate.pem.crt)をダウンロードします。
- 証明書を選択して とクリックし、証明を有効化します。
- とクリックし、作成されたばかりのモノの名前を入力して、そのモノを証明書に添付します。
- とクリックし、新しく作成されたポリシーの名前を入力して、そのポリシーも証明書に添付します。
JKSキーストアを作成する前に、システムにOpenSSLがインストールされていることを確認します。
JKSキーストアは次の手順で作成します。
- https://docs.aws.amazon.com/iot/latest/developerguide/x509-client-certs.htmlからATS証明書をダウンロードし、rootCA.pemに保存します。
- 次のコマンドでAWS IoTの証明書、プライベートキー、rootCAを入力として使い、pkcs12ファイルをエクスポートします。
openssl pkcs12 -export -in e11ef15bb1-certificate.pem.crt -inkey e11ef15bb1-private.pem.key -out server.p12 -name awsiotkey
pkcs12にパスワードを入力するよう求められたら、abcdのように入力します。
- 次のコマンドを使ってpkcs12をJKSキーストアに変換します。
keytool -importkeystore -deststorepass password -destkeypass password -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass abcd
また、-deststorepassと-destkeypassには必ず同じパスワードを入力してください。
- 次のコマンドを使ってAWSのrootCAをJKSのキーストアにインポートします。
keytool -import -trustcacerts -keystore keystore.jks -storepass importkey -alias rootCA -file rootCA.pem -noprompt
AWS IoTのMQTT Topicからメッセージを消費するよう、次のようにcMQTT、cMQConnectionFactory、cLogを持つルートを作成します。ルートを作成する方法の詳細は、ルートを作成をご覧ください。
- cMQConnectionFactoryコンポーネントの[Basic settings] (基本設定)ビューで:
- MQ ServerリストでMQTTを選択します。
- [Host Name] (ホスト名)フィールドに、AWS IoTにあるMQTT Topicのホスト名を入力します。
- [Port] (ポート)フィールドに、デフォルトのMQTTポート番号である8883を入力します。
- [Use SSL] (SSLを使用)チェックボックスをオンにし、関連するフィールドにJKSキーストアとパスワードを入力します。
必要であれば、ネットワークの接続状況に応じて[Connection Wait In Seconds] (接続待機時間(秒))の値を増やします。
- cMQTTコンポーネントの[Basic settings] (基本設定)ビューで:
- [Connection Factory] (接続ファクトリー)フィールドで、cMQConnectionFactoryコンポーネントを選択します。
- [Topic Name] (トピック名)フィールドに、AWS IoTにあるMQTT Topicの名前を入力します。
- メッセージ交換を監視し、ルートを実行するcLogコンポーネントはデフォルト設定のままにしておきます。今回はメッセージ交換はありません。
- AWS IoTコンソールに移動して[MQTT Client] (MQTTクライアント)をクリックします。
- [MQTT Client Actions] (MQTTクライアントアクション)エリアで[Device Gateway connection] (デバイスゲートウェイ接続)を選択し、[Generate client ID] (クライアントIDを生成) > [Connect] (接続)とクリックします。
- [Publish to topic] (トピックに公開)をクリックします。[Publish topic] (トピックを公開)フィールドにMQTT Topicの名前を入力し、[Payload] (ペイロード)エリアにメッセージのペイロード("Hello message"など)を入力します。
- [Publish] (公開)をクリックします。
このメッセージは特定のトピックに公開されます。
AWS IoTのMQTT Topicにメッセージを公開する方法は他にもあります。たとえばhttp://mosquitto.org/からMosquittoをダウンロードしてインストールし、次のコマンドを使って"Hello message"というメッセージを公開できます。
mosquitto_pub --cert e11ef15bb1-certificate.pem.crt --key e11ef15bb1-private.pem.key --cafile rootCA.pem -h <YourHostName>.iot.us-east-1.amazonaws.com -p 8883 -q 1 -d -t $aws/things/MyTestThing/shadow/update -m "Hello message"
Talend Studioでは、メッセージが受信され、ルート実行コンソールに表示されます。