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-samplenpm i --save aws-amplify@3.0.9 aws-amplify-angular@5.0.9 mqtt@3.0.0src/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 を削除してください。このオプションは例で使用する非セキュアな接続を許可するものであり、本番環境では有効にしないでください。
関連記事
Microsoft Entra ID と Amplify による Cognito SAML サインイン
Amazon Cognito ユーザープールと Microsoft Entra ID の間に SAML サインインを設定し、Amplify を使った Next.js アプリから利用します。
AWS IoT Core における Kinesis Firehose のレコード区切り設定
IoT Core のトピックルールにある Firehose アクションで区切り文字を設定し、S3 にレコードを改行区切りで格納する方法を解説します。
AWS IoT のペイロード値で Kinesis レコードをパーティショニングする
IoT トピックのペイロードに含まれる顧客 ID を Kinesis のパーティションキーとして使い、顧客ごとのレコード順序を維持する方法を解説します。
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 関数へデプロイします。
