皆さんこんにちは!
Japan AWS Top Engineer 2025のアドベントカレンダーです!
まさか自分がこんな立場で記事を書くことになるとは思いもしませんでした。
しかもQiitaって何年振り何回目?
過去の記事はGIS系のネタだったのですが今回はAWSネタということで
GISマスター目指した結果AWSトップエンジニアになっちゃった てへぺろ
という感じでございます。
さて、本日はけーてんがお送りする、
FlutterでAWS IoTにSigV4で接続しようとしたらハマりにハマった話
でございます。
はじめに
今回はけーてんが担当している案件で苦しみながらなんとか動くようにした
FlutterとAWS IoTをつなぐお話です。
Qiitaなんで、解法をもとめてたどり着く方もいらっしゃると思いますので、
うまくいった結果、から紹介しつつ
あくまで本編のハマった話をしていきます。
結論から書けって習った
FlutterでAWS IoTにMQTT接続するにあたり
証明書を用いたMQTT(s)で接続していたが、
アプリを公開する場合に証明書が含まれたアプリなんてありえない!
証明書すぐに抜かれるじゃん!
ということでCognito認証してMQTTに接続する方法を模索した。
CognitoとAWS IoTのマリアージュが必要だった!
ちゃんとExampleがあった。
https://github.com/shamblett/mqtt_client/blob/master/example/aws_iot_cognito_amplify.dart
わかりにくいのは
attachPolicy
するところ。
コメントを翻訳すると・・・
よくお読みください
これは、IoT Core へのアクセスを許可するために、アイデンティティ ID に IoT ポリシーをアタッチします。
Cognito フェデレーション ID プールを使用する場合、認証済み ID と認証されていない(ゲスト)ID があります (https://docs.aws.amazon.com/cognito/latest/developerguide/identity-pools.html)。
IoT Core(通常の Cognito ID またはフェデレーション ID)へのアクセスを許可するには、認証済みユーザーにポリシーをアタッチする必要があります。
制御のために認証されていないユーザーにポリシーをアタッチすることは可能ですが、必須ではありません。
この API を呼び出す認証情報に、AttachPolicy に必要な IAM 権限があることを確認してください
けーてんはCognito全然わかってない芸人なのでふいんきでしかわかってないのですが、
アイデンティティIDってのは
Cognitoにログインすると(いろいろ説明を端折ってますが)IDプールの方に
登録されていくやつですね。
一応、1ユーザごとに一意につくられるようです。

で、これをIoTのポリシーにアタッチする必要がある!ということです。
まじ?
全ログインユーザをポリシーアタッチするってこと?
先駆者の方も書かれておるです。。。
https://qiita.com/ufoo68/items/88e81898859e699eeb09
ユーザー作成を行うとアイデンティティIDとうものがIDプールで作成されたことが確認できるので、それをIoT Coreのポリシーに紐付けます。以下のコマンドを実行します。
aws iot attach-policy --policy-name {{policy name}} --target {{cognito identity id}}
実際に設定してみるとポリシーのターゲットにアイデンティティIDが登録され、

SigV4を使いつつWebSocketURLを発行して無事IoTとの接続ができました。
ただ、Exampleのソースだと毎回AttachPolicyしにいっており無駄だったので
FlutterアプリでCognitoに初回ログイン時にAttachPolicyする流れにしたく、
APIGateway + LambdaでアイデンティティIDを所定のポリシーにアタッチするAPIを作成しました。
流れをまとめると。
- [アプリ]Cognitoにログイン
- [アプリ]ログインしたユーザのトークンを使いつつポリシーアタッチAPIを呼び出す。
- [バックエンド]ポリシーアタッチAPIはIDプールからアイデンティティIDを取得し、IoTCoreの所定のポリシーにアタッチする。
- [アプリ]Cognitoの認証情報をつかってSigV4,WebSocketURLを発行する。
- [アプリ]発行したWebSocketURLで接続する
- [アプリ]以下、pub/subする
そんな事前準備が必要なのね?ということに全然気が付かず、
いやExampleよく見ろって話しなのですが、そもそも見ず、
なんで見なかったかというと・・・というのが以降のお話。
余談(本体)としてハマりにハマった話をば。
結果、うまくいっているのですが、行きつくまでの苦悩がありました。
そもそも。
けーてんはもはや中間管理職的な立場でして、もはや実装などほとんどしておらぬのです。
でもチームメンバーがどうにも解決できーん、ってなって早数日。
最終兵器俺、発動。
ズシーン、ズシーン、ふらふら・・・
重厚感ある足取りなのにふらつきつつもトップエンジニアの肩書が真実であることの証明をする旅に出たのでした。
FlutterとAWS
AWSさん、Flutter用のSDK、中途半端にしてないっすか?
もうちょっと何とかなりませんかね。
と言いたくなるような情報量ですが、
ライブラリ類は割と充実しているのでなんとかなるのがFlutter。
Flutterって
iOSアプリもAndroidアプリも、なんならWebアプリも
1つのコードで全部作れる、いわゆるクロスプラットフォームなフレームワークです。
言語はDart。
Dart自体はそこまで難しいものではないですが、
Flutterのお作法は結構クセがある気がします。
GUI部の書きっぷりもあの入れ子の構造といいますか、まぁ、クセはあるというか
唯一無二?(誉めてはいない)
でもクロスプラットフォームなのでiOS,Androidの両方を一度に作れるという恩恵はとても大きい。
そしてIoT
けーてんが一番好きなAWSサービスと常々言っているやつです。
めちゃ手軽にメッセージのpublish/subscribeができて、
デバイスシャドウとかいう唯一無二の機能(これは誉めてる)がある。
使い方次第でいかようにも活躍できるサービスなんです。
簡単につながる
AWS IoTへつなぐにあたり、x.509の証明書をAWS IoTのコンソールから発行でき、
これを使うと簡単にクライアント側も作れます。
別件でC++とかpythonとかでクライアント作ってAWS IoTにつないでまして、
Flutterでも同じようにできるじゃん!採用!ってなったわけです。
スマホのセンサーデータをクラウドにバンバンアップするようなアプリを作ってたんで、
まさにIoT感のあるアプリのためばっちりだなと思ったのです。
まんまとNGパターン
ある日、それなりの予算に背負ったけーてんという会社員は
楽しかった開発者時代を思い返しながらこう思ったのです。
「そういえば、昔、Androidのapkファイルってただの圧縮ファイルなんだよね」
って先輩に言われたことあったなーって。
あれ?やばくね?
ということで我々によるIoTにつないでキャッキャウフフするapkファイルを解凍!
あった!証明書!いえーい!!
ぅぅぅおおぉいっ!あかんやろ!
あれ?ほんまに?
チャッピー激おこぷんぷん丸
注:チャッピー = ChatGPT
けーてん「↑の感じなんだけど、あかんよね?」
チャッピー「あかんに決まっとるやろ。証明書駄々もれやで!」
やばい・・・このままではリリースできない。
ということでチームメンバーに相談。
アプリ自体がCognitoでのログイン機能があったため、
その認証情報でAWS IoTと接続できないのか?
というところから調査をメンバーに依頼しました。
でも、いまいちうまくいかない。
接続できない。403が返ってくる。
などなんだかうまくいかない状況が続き、
冒頭の最終兵器俺発動となるわけです。
チャッピーならサクッとやってくれる!?
けーてん「Cognito認証結果をつかってうまくIoTにつなげたいんだけど、うまくいかない。」
チャッピー「ええやん。ソース書いたるわ」
けーてん「やっぴー」
チャッピーに騙されて激おこぷんぷん丸
チャッピー「できたが」
けーてん「やっぴー」
・・・
けーてん「うごかないよ・・・?」
チャッピー「え?じゃあこれならどう?」
けーてん「うごきません。」
チャッピー「え?じゃあこれならどう?これなら動くはずだよ」
けーてん「だから、うごきません」
チャッピー「え?じゃあこれならどう?確実に動くソースにしたよ」
けーてん「うごかねーっていってんだよ!」
自分でググったほうが早い。と思い検索開始。
そもそもFlutterのMQTT Clientライブラリをちゃんと理解せねば。
と思ったらExampleにCognito連携するサンプルあるやん!これやん!
チャッピー、最初っからこのExample見てよ。教えてよ。
で、上記の解決策に至るわけです。。。。
颯爽と俺天才ムーブを決める
やっぱ、自分、AWS様も認めるトップエンジニアっすから。
こんくらいやれて当然っす。
いっそチャッピーより優秀っす。
壁にぶち当たる
↓
蜿蜒と悩む
↓
乗り越えて解決する
↓
俺、天才!
というこのエンジニアの醍醐味ともいえる感情のジェットコースターを
数年ぶりに味わい、
やっぱりモノ作ってる方が楽しいなぁ、と思う中間管理職なのでした。
おわり
ということで無駄なハマりかたをしつつFlutterでCognit認証を利用してAWS IoTにアクセスすることができました。
アイデンティティIDとIoTのポリシーを紐づける、というのが全然気が付かなくてはまってました。
さて、AWSトップエンジニアとしては社内では若者の背中を押して
次のトップエンジニアを輩出できないかと模索しております。
いろいろなイベントに参加できたり、世間にアピールできたり、
恩恵もありますので後輩たちにもとらせたいなぁと思う日々でございます。
駄文、失礼いたしました。
ありがとうございます。
追伸、アマQとチャッピーのセカンドオピニオン構成が熱い。
チャッピーには騙された話をしましたが、もちろんそういうときもありますが
基本は優秀です。
作ってほしいものを作ってくれます。
最近はAmazonQ DeveloperがVSCodeに入れ込めてとても便利なので
アマQもよく使います。
本当に楽になりました。
やりたいことを言うだけでソース書いてくれて、
直してほしくても修正をすぐにしてくれます。
でも、やっぱりいまいちうまくいかねー、って時はあり
そういう時はチャッピーにも聞いてみます。
生成AIは手の早いベテランエンジニア、くらいに思っているので
当然全部が本当じゃないし、使い方次第。
状況次第では皆さんの方が正しいし早いことも。
バイアスもかかりがちなのでその辺も考慮してうまく付き合うと
とても大きな武器になりますね!