AWS Amplify と Eclipse Mosquitto を連携した MQTT メッセージング
AWS Amplify の PubSub モジュールを AWS IoT Core に接続する前に、ローカルの Eclipse Mosquitto ブローカーでテストする方法を紹介します。
Eclipse Mosquitto をローカルの MQTT ブローカーとして使うと、AWS Amplify の PubSub モジュールを AWS IoT Core へ接続する前に動作を確認できます。
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 メッセージの送受信を確認できます。MqttOverWSProvider は MQTT over WebSocket に対応するブローカーで利用できるため、接続先が localhost:9001 の Mosquitto でも AWS IoT Core でも、window.global のポリフィルと PubSub.subscribe('test-topic') の呼び出しは変わりません。
ローカルテストを終えたら、aws_appsync_dangerously_connect_to_http_endpoint_for_testing を削除してください。このオプションは例で使用する非セキュアな接続を許可するものであり、本番環境では有効にしないでください。
Related posts
Microsoft Entra ID と Amplify による Cognito SAML サインイン
Amazon Cognito ユーザープールと Microsoft Entra ID の間に SAML サインインを設定し、Amplify を使った Next.js アプリから利用します。
モジュール性と再利用性を高める Angular のプロジェクト構成
Angular アプリケーションを core、features、shared に分け、依存関係の境界を明確にするフォルダ構成を紹介します。
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 にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
