Pub/Sub for IoT Ingestion
少数の集約ゲートウェイからRESTまたはgRPCでPub/Subへ送るIoT取り込み構成。大規模端末群には別途MQTT基盤と端末管理が必要。
- 少数の集約機なら、RESTやgRPCでPub/Subへ直接送れる。
- 標準は少なくとも1回配信で、順序・重複排除は明示設定する。
- 大規模端末群には、別途MQTT基盤と端末台帳を用意する。
解決する課題
Pub/Subへ直接つなぐ構成は、工場や拠点内の多数のセンサーを 数十〜数百台程度の集約ゲートウェイへまとめられる場合に向きます。各ゲートウェイが REST または gRPC でテレメトリを発行し、後段の分析・保存・通知へ疎結合に渡します。端末ごとのMQTT接続や台帳管理が必要な大規模フリートには、別途ブローカまたはIoTプラットフォームが必要です。
- デバイス台数や送信頻度が読めず、バックエンドが詰まる → サブスクリプションがバッファして処理側のペースで捌く
- 一斉に起動した端末からの バースト送信 を取りこぼさず受け止めたい
- 1 件のテレメトリを リアルタイム分析・長期保存・アラート など複数系統へ同報したい
- デバイスは MQTT や HTTP しか話せない → プロトコルブリッジで Pub/Sub に橋渡しする
- リージョンをまたぐ広域デバイス群でも 同一エンドポイント で受けたい(グローバルサービス)
主要概念と用語
- テレメトリ(Telemetry): デバイスが定期送信するセンサー値や状態などの計測データ
- 取り込み(Ingestion): デバイスからのデータをクラウド側の入口で受け止める工程。ここを Pub/Sub が担う
- トピック(Topic): テレメトリの発行先。デバイス種別や用途ごとに分けることが多い
- サブスクリプション(Subscription): トピックに紐づく受け取り口。1 トピックに複数付けるとファンアウトになり、分析・保存・通知へ同報できる
- プロトコルブリッジ(Protocol bridge): MQTT や HTTP で送るデバイスと Pub/Sub の間を仲介する層。パートナー製 IoT プラットフォームや自前のゲートウェイで構成する
- デバイス認証: 端末ごとの資格情報(証明書やトークン)で送信元を識別する仕組み。Pub/Sub 手前のブリッジ層で行うのが一般的
- 確認応答(ack)と ackDeadline: 取得したメッセージを処理し終えたら
ack。期限内にackしないと 再配信 される - デッドレタートピック(Dead-letter topic): 規定回数失敗したメッセージの退避先
- Pub/Sub サブスクリプション直送: サブスクライバーのコードを書かずに、BigQuery / Cloud Storage へメッセージを直接取り込む形式
仕様・制限・クォータ
- 少なくとも 1 回(at-least-once)配信 が基本。まれに重複 するため処理は 冪等 に作る
- 1 メッセージのデータは最大 10 MB、属性は最大 100 個。小さなメッセージでもスループットは 1 kB 単位で計測されるため、必要に応じてバッチ化する
- 未確認メッセージの保持は既定 7 日、設定範囲は 10 分〜31 日。31 日間利用されないサブスクリプションは既定で期限切れになる
ackDeadlineは既定 10 秒、設定範囲は 10〜600 秒。期限内に処理できなければ再配信されるため、クライアントライブラリで期限を延長する- 正確に 1 回は Pull / StreamingPull で明示的に有効化し、購読処理を単一リージョンへ固定した場合に限る。Push・BigQuery・Cloud Storage の各サブスクリプションは少なくとも 1 回配信
- グローバルサービス: トピック/サブスクリプションは単一エンドポイントを持ち、配信はメッセージストレージポリシーに従う
- 1 トピックに 多数のサブスクリプション を付けてファンアウトできる
- 属性(attribute) にデバイス ID やリージョンなどのメタデータを載せ、後段のルーティングに使える
GCP の旧 Cloud IoT Core は2023年8月16日に停止しました。Pub/Sub 単体には MQTT、端末台帳、端末単位の認証・設定配布がありません。少数の集約機はPub/Subへ直接接続し、大規模・双方向の端末群はGKE/Compute Engine上のMQTTブローカまたは外部IoTプラットフォームを選びます。
内部の仕組み
横にスクロール
現場のセンサーはローカルプロトコルで集約ゲートウェイへ送り、ゲートウェイが REST または gRPC で Pub/Sub トピックへ発行します。外部IdPが使える場合はWorkload Identity連携で短期資格情報を取得し、使えない場合だけサービスアカウント鍵を安全に保管します。受理されたメッセージは各サブスクリプションへ分岐し、後段が Pull、Push、BigQuery直送、Cloud Storage直送で処理します。
- 処理に成功して
ackすると、そのサブスクリプションからメッセージが削除される ackDeadline内にackできなければ 再配信(少なくとも 1 回配信。冪等処理が前提)- 規定回数失敗すると デッドレタートピック へ退避される。ただし試行回数は概算で、5〜100 回の範囲を設定しても転送はベストエフォート
- BigQuery / Cloud Storage サブスクリプションを使うと、サブスクライバーのコードなしで取り込み先へ直送される
Pub/Sub は基本「少なくとも 1 回」配信なので、同じテレメトリが まれに重複 します。 デバイス ID とタイムスタンプなどで一意化し、処理を 冪等 に作るのが鉄則です。
設計パターン / ベストプラクティス
- ブリッジ → Pub/Sub → 分岐: ブリッジで受けたテレメトリを 1 トピックに集約し、複数サブスクリプションで分析・保存・通知へファンアウト
- ストリーミング処理: リアルタイム集計や異常検知は Dataflow(Apache Beam) を Pub/Sub の後段に置く
- 長期保存: 生データは Cloud Storage サブスクリプション、構造化分析は BigQuery サブスクリプション で直送し、中継 ETL を省く
- コマンド送信(下り): デバイスへの制御指示は、別トピック経由でゲートウェイへ配り、ブリッジから端末へ届ける
- 属性でルーティング: デバイス種別やリージョンを属性に載せ、後段で振り分ける
- デッドレタートピックで取り込み失敗を退避し、形式不正や権限エラーを調査・再投入
運用・監視
- Cloud Monitoring のメトリクスで滞留を監視:
- 未配信メッセージ数(バックログの増加はサブスクライバー不足やダウンストリーム障害の兆候)
- 最古の未 ack メッセージの経過時間(処理遅延の指標)
- バックログ急増 → サブスクライバー不足や ダウンストリーム障害、
ack失敗を疑う - デッドレタートピックに溜まる → メッセージ形式 / 権限(IAM)/ 処理ロジック を確認
- デバイス側の 送信成功率やブリッジの可用性 も併せて監視し、入口での取りこぼしを防ぐ
- シーク(Seek) はスナップショットまたは保持範囲内の時刻を指定して巻き戻す。確認済みメッセージを時刻指定で再処理する場合は保持設定も有効にする
コスト
課金はおもに メッセージのスループット量(取り込み・配信・保持のデータ量) に対して発生します。IoT では小さなメッセージが高頻度で届くため、最小課金メッセージサイズの考え方と総件数が効いてきます。
| コスト要素 | 課金の考え方 | 節約のポイント |
|---|---|---|
| テレメトリ取り込み | 転送データ量で課金 | 送信頻度を最適化しバッチ化を検討 |
| ファンアウト | サブスクリプションごとに配信量が加算 | 本当に必要な購読者だけ接続する |
| メッセージ保持 | 保持データ量と期間で課金 | 必要な保持期間に絞る |
| BigQuery/GCS 直送 | Pub/Sub 配信料と取り込み先の料金 | 中継 ETL を省き運用コストも削減 |
| ブリッジ層 | ゲートウェイやパートナー基盤の費用 | デバイス規模に合う方式を選ぶ |
セキュリティ
- デバイス認証はブリッジ層で: 端末ごとの証明書やトークンで送信元を識別し、Pub/Sub には認証済みの経路だけ発行させる
- IAM でトピック/サブスクリプション単位の権限を最小化(発行はブリッジ、購読は後段サービスに限定)
- ブリッジや後段サービスには サービスアカウント を使い、鍵のハードコードを避ける
- 転送中は TLS、保存時は Google 管理鍵で既定暗号化。要件次第で CMEK(Cloud KMS の顧客管理鍵) を指定
- VPC Service Controls で境界を作り、データの持ち出しを防止
すべてのデバイスに 同一の資格情報 を配って Pub/Sub へ直接発行させるのは NG。 1 台漏えいすると全体が偽データを送れてしまいます。デバイスごとの認証情報をブリッジ層で検証し、Pub/Sub への発行権限はその経路だけに絞ってください。
関連サービス・比較
Pub/Sub Lite は廃止予定で、新規利用はできません。既存利用者も 2027 年 1 月 31 日までに通常の Pub/Sub または Google Cloud Managed Service for Apache Kafka へ移行します。新しい IoT 取り込みで事前確保型の Lite を選ばないでください。
| 観点 | Pub/Sub(取り込み) | Managed Service for Apache Kafka |
|---|---|---|
| 接続API | REST / gRPC | Apache Kafka互換API |
| 運用 | 自動スケールするサーバーレス | クラスタ容量とKafka設定を管理 |
| 配信モデル | トピックと購読 | パーティションと消費者グループ |
| 向く構成 | Google Cloud中心の疎結合配信 | Kafka互換性が必要な既存基盤 |
| 端末接続 | MQTT・端末台帳は別途 | MQTT・端末台帳は別途 |
Google Cloud の REST / gRPC と自動スケールを使うなら Pub/Sub を選びます。 Kafka のクライアント互換性が必須なら Managed Service for Apache Kafka を評価します。どちらにも MQTT と端末台帳は含まれません。
ハンズオン / CLI例
# テレメトリ用トピックを作成
gcloud pubsub topics create device-telemetry
# デッドレター転送先も先に作成
gcloud pubsub topics create telemetry-dlq
# 分析用サブスクリプション(Pull、ack 期限とデッドレターを設定)
# 実運用ではPub/Subサービスエージェントへ必要な転送権限も付与する
gcloud pubsub subscriptions create telemetry-analytics \
--topic=device-telemetry \
--ack-deadline=30 \
--dead-letter-topic=telemetry-dlq \
--max-delivery-attempts=5
# 長期保存はもう 1 本サブスクリプションを生やしてファンアウト
gcloud pubsub subscriptions create telemetry-archive --topic=device-telemetry
# デバイスからの 1 件を擬似的に発行(属性にデバイス ID を付与)
gcloud pubsub topics publish device-telemetry \
--message='{"temp":24.5}' \
--attribute=device_id=sensor-001,region=asia
# 取り込んだメッセージを取得して即 ack(確認)
gcloud pubsub subscriptions pull telemetry-analytics --auto-ack --limit=10
Google Cloud Service
Pub/Sub for IoT Ingestionを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
IoT
比較で見る軸
クラウド: Google Cloud / カテゴリ: IoT / 難易度: intermediate
導入後に効く点
標準は少なくとも1回配信で、順序・重複排除は明示設定する。
先に潰すリスク
サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。
- クラウド
- Google Cloud
- カテゴリ
- IoT
- 難易度
- intermediate
- 関連資格
- —
- 設計柱
- reliability / performance / operational / security
判断チェックリスト
- 自社の用途が「IoT / reliability」に近いか確認する。
- 強みである「少数の集約機なら、RESTやgRPCでPub/Subへ直接送れる。」が本当に評価軸になるか確認する。
- 注意点の「サービス単体ではなく、権限、ネットワーク、監視、課金、バックアップを含めて設計する必要がある。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。