AWS Amplify と Eclipse Mosquitto を連携させた MQTT メッセージング

AWS Amplify と Eclipse Mosquitto を連携させた MQTT メッセージング

AWS Amplify の PubSub モジュールを AWS IoT Core に接続する前に、ローカルの Eclipse Mosquitto ブローカーでテストする方法。

Takahiro Iwasa
3 min read

Eclipse Mosquitto は、AWS Amplify の PubSub モジュールを AWS IoT Core のようなマネージドエンドポイントに接続する前に、ローカルの MQTT ブローカーとしてテストに利用できます。

Eclipse Mosquitto のセットアップ

以下の内容で docker/docker-compose.yml ファイルを作成します。

docker/docker-compose.yml
version: '3.4'
services:
mosquitto:
image: eclipse-mosquitto:1.6.9
ports:
- 1883:1883 # MQTT
- 9001:9001 # WebSocket
volumes:
- ./mosquitto:/mosquitto/config

以下の内容で docker/mosquitto/mosquitto.conf ファイルを作成します。

listener 1883
listener 9001
protocol websockets

Mosquitto コンテナを起動します。

Terminal window
docker-compose up -d

Angular アプリケーションの構築

新しい Angular アプリケーションを作成し、必要な依存関係をインストールします。

Terminal window
ng new angular-mosquitto-sample

src/polyfills.ts を更新します。

src/polyfills.ts
/**
* ...
*/
/***************************************************************************************************
* APPLICATION IMPORTS
*/
// Add the following:
(window as any).global = window;

src/app/app.component.html を編集します。

src/app/app.component.html
<h1>Received messages</h1>
<hr/>
<div *ngFor="let message of messages">
{{ message }}
</div>

src/app/app.component.ts を編集します。

src/app/app.component.ts
import { Component, OnInit } from '@angular/core';
import { PubSub } from 'aws-amplify';
import { MqttOverWSProvider } from '@aws-amplify/pubsub/lib/Providers';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
messages = [];
ngOnInit() {
PubSub.addPluggable(new MqttOverWSProvider({
aws_pubsub_endpoint: 'ws://localhost:9001/',
// Do not use SSL
aws_appsync_dangerously_connect_to_http_endpoint_for_testing: true,
}));
PubSub.subscribe('test-topic').subscribe(payload => {
console.log(payload);
this.messages.push(payload.value.message);
});
}
}

アプリケーションのテスト

以下のコマンドで mqtt をインストールします。

Terminal window
npm i --save-dev mqtt

ローカルの Mosquitto ブローカーに MQTT メッセージを送信します。

Terminal window
mqtt pub \
-t 'test-topic' \
-h localhost \
-p 1883 \
-m '{"message": "Hello World"}'

Angular アプリケーションには、受信したメッセージがリアルタイムに表示されるはずです。

まとめ

docker-compose でローカルの Mosquitto ブローカーを起動し、Amplify の PubSub モジュールを介して Angular アプリに組み込むことで、AWS IoT Core のリソースを一切作らずに MQTT メッセージの送受信をエンドツーエンドで確認できました。PubSub は同じ MqttOverWSProvider インターフェースを通じて MQTT over WebSocket に対応する任意のブローカーと通信できるため、Angular 側はブローカーの違いをほとんど意識する必要がありません。window.global の polyfill も PubSub.subscribe('test-topic') の呼び出しも、ブローカーが localhost:9001 の Mosquitto であっても IoT Core であっても変わりません。ローカルテストから先に進む前に必ず確認しておくべきフラグが aws_appsync_dangerously_connect_to_http_endpoint_for_testing です。その名前自体が、本番構成には存在してはならないものだという、かなり直接的な警告になっています。

About the author

Takahiro Iwasa

Takahiro Iwasa

Software Developer

This blog shares technical notes from hands-on projects—architecture, implementation, and AWS service integrations.