AWS Amplify と Eclipse Mosquitto を連携させた MQTT メッセージング
AWS Amplify の PubSub モジュールを AWS IoT Core に接続する前に、ローカルの Eclipse Mosquitto ブローカーでテストする方法。
Eclipse Mosquitto は、AWS Amplify の PubSub モジュールを AWS IoT Core のようなマネージドエンドポイントに接続する前に、ローカルの MQTT ブローカーとしてテストに利用できます。
Eclipse Mosquitto のセットアップ
以下の内容で 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 1883listener 9001protocol websocketsMosquitto コンテナを起動します。
docker-compose up -dAngular アプリケーションの構築
新しい Angular アプリケーションを作成し、必要な依存関係をインストールします。
ng new angular-mosquitto-samplesrc/polyfills.ts を更新します。
/** * ... */
/*************************************************************************************************** * APPLICATION IMPORTS */
// Add the following:(window as any).global = window;src/app/app.component.html を編集します。
<h1>Received messages</h1><hr/><div *ngFor="let message of messages"> {{ message }}</div>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 をインストールします。
npm i --save-dev mqttローカルの Mosquitto ブローカーに MQTT メッセージを送信します。
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 です。その名前自体が、本番構成には存在してはならないものだという、かなり直接的な警告になっています。
Related posts
Azure Entra IDとAmplifyによるCognito SAMLサインイン
AWS Amplify、Cognitoユーザープール、Azure Entra IDを使ったSAML認証について解説します。
モジュール性と再利用性を高める Angular のプロジェクト構成
core、features、shared の各モジュールに依存の方向を定め、機能を独立させつつ再利用可能なコードを一箇所に集約する Angular のフォルダ構成。
Jasmine でモックオブジェクトのプロパティをスパイする
モックオブジェクトのプロパティをスパイする際に発生する Jasmine の "already been spied upon" エラーを、Object.getOwnPropertyDescriptor で回避する方法。
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
