SORACOM Funnel で AWS IoT Core にデータを送る

センサーデータ(温度・湿度)をトリガーにして動作するAI AgentシステムをAWS Lambdaで開発しています。 Wio BG770Aで取得したデータをAWS IoT Coreに送り、そこからLambdaへ転送する構成です。

デバイスからIoT Coreへのデータ転送をどう実装するか検討した結果、選んだのがSORACOM Funnelです。 デバイス側はHTTP POSTだけで済み、証明書の管理が不要でした。

この記事では、BG770AからSORACOM Funnelを経由してAWS IoT Coreのトピックにデータを届ける手順を紹介します。

全体構成

今回開発したシステムの全体構成はこちらです。 この記事では、Wio BG770AからAWS IoT Coreに送信するところまでを紹介します。

SORACOM Funnelを経由してAWS IoT Coreにセンサーデータを送信
SORACOM Funnelを経由してAWS IoT Coreにセンサーデータを送信

AWS側の設定

SORACOM FunnelがAWS IoT Coreにデータを送るために、2つのリソースを作成します。

  • IAM Role: SORACOM FunnelがIoT CoreにPublishする権限
  • IoT Core Domain: SORACOM Funnelがデータを送信するためのIoT Core側のエンドポイント

設定は、SORACOMの公式ガイドに沿って行えばOKです。

IAM Roleを作成する

SORACOM Funnelは指定したIAM Roleの権限でIoT Coreにパブリッシュします。

今回は、devices/bg770aというTopicへのメッセージ送信だけ許可しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "iot:Publish",
            "Resource": "arn:aws:iot:us-east-1:<AccountId>:topic/devices/bg770a",
            "Effect": "Allow"
        }
    ]
}

上記のIAM RoleをAssumeRoleできるアカウントとして、762707677580を指定します。 これはSORACOMの日本カバレッジ用のAWSアカウントのIDです。 ExternalIdは推測しにくい乱数にすることを推奨します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::762707677580:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "<External ID>"
                }
            }
        }
    ]
}

Domain Configurationを作成する

ここは、セキュリティポリシーでIoTSecurityPolicy_TLS13_1_2_2022_10を選ぶことだけ気をつければ問題ないです。

SORACOM Funnelを設定する

最初に認証情報ストアに今回作成したIAM Roleを追加します。

認証情報ストアにIAM Roleを追加
認証情報ストアにIAM Roleを追加

次に、SIMグループの画面でSORACOM Funnelを有効化します。 SIMグループに設定するので、複数のSIMに対してSORACOM Funnelを有効にすることが可能です。

SIMグループでSORACOM Funnelを有効化
SIMグループでSORACOM Funnelを有効化

Wio BG770Aのコード

最後にIoTデバイス(Wio BG770A)のコードを書き、SORACOM Funnelにメッセージを送信するようにします。

SORACOMのモバイルネットワークにAttachし、SORACOM FunnelのHTTPエンドポイントにメッセージを送ります。

ここでのポイントは、2つです。

  1. HTTPSではなくHTTPで送信する: SORACOMのモバイルネットワークは閉域として扱えるため、TLSが不要です。デバイス側でサーバー証明書を管理する必要がなく、TLSオーバーヘッドも削減できるため、電池駆動時の消費を抑えられます。
  2. MQTTの実装は不要: SORACOM FunnelがMQTT Publisherを代理するため、デバイス側はHTTP POSTを投げるだけです。

以下のようなコードでセンサーデータを送っています。 今回は、SORACOM FuunelとIoT Coreの接続がメインなので、センサー値はダミーを入れています。 実際には、これをSHT40などの温湿度センサーから取得した値に置き換えます。

  JsonDocument doc;
  doc["temperature"] = 15; // dummy
  doc["humidity"] = 50.0; // dummy
 
  char payload[128];
  serializeJson(doc, payload, sizeof(payload));
 
  httpClient.postJson("funnel.soracom.io", 80, "/", payload); // port8(HTTP)

HTTP POSTを行うクライアント側の実装(WioCellularHttpClient::postJson())は、TCPクライアントを開いてHTTP/1.1リクエストを組み立て、client.send() で送信するシンプルな構成です。

コード全文はGitHubで確認できます。

wio-bg770a-soracom-connect — iotbuilds-samples

BG770A + SORACOM Funnel → AWS IoT Core 送信サンプル(PlatformIO)

github.com

動作確認

まずは、IoTデバイス -> SORACOM Funnelへの送信が成功しているか見ていきます。 これは、HTTPメッセージを見てあげると、分かります。

以下のように204 No Contentが返ってこれば送信成功です。

POST funnel.soracom.io/
Payload: {"temperature":15,"humidity":50}
HTTP response:
HTTP/1.1 204 No Content
Date: Thu, 26 Mar 2026 02:28:59 GMT
Connection: close

次に、AWS IoT Core側に送れているか見ていきます。 IoT Coreには、MQTT テストクライアントがあり、AWSコンソール上でIoT Coreにメッセージが飛んでいるかを確認できます。

devices/bg770a をSubscribeします。 /devices/bg770aのようにTopic名には先頭の/が不要なことは地味に注意が必要です。私はこれで結構時間を溶かしました...

IoT CoreのMQTTクライアントでセンサーデータを確認
IoT CoreのMQTTクライアントでセンサーデータを確認

SORACOM Funnelの制約

SORACOM Funnelは便利なサービスですが、双方向通信ができない制約があります。

SORACOM Funnelを経由して通信している場合、IoT Core側からIoTデバイスにメッセージを送ることはできません。 今回のようなセンサーデータをクラウドに上げたいという一方向の通信であればこれは問題ありません。

双方通信がしたい場合には、SORACOM Beamというサービスがあります。 今度こちらも検証してみたいと思います。

まとめ

この記事では、Wio BG770AからSORACOM FunnelをブリッジとしてAWS IoT Coreにデータを届ける手順を紹介しました。

デバイス側の実装はHTTP POSTのみで、証明書管理とMQTTの実装が不要なのが非常に便利だなと思いました。

関連記事