AWS ローカル開発エミュレータ比較 — floci / cognito-local / MiniStack / LocalStack / moto

Cognito を使った認証サービスのローカル開発で、floci (LocalStack) の制限にぶつかった。cognito-local、MiniStack、LocalStack 有料版、moto を含む5つのエミュレータを Cognito の機能対応で比較する。

はじめに

AWS Cognito を使った認証サービスをローカルで開発するとき、エミュレータの選択は開発体験を大きく左右します。

実際に floci(LocalStack ベース)で開発を進めた結果、以下の機能が動かないことがわかりました。

これは floci に限った話ではなく、多くの無料エミュレータで同様の制限があります。この記事では、Cognito を中心に 5 つのエミュレータを比較します。

何が問題だったか

認証サービス(rellf-auth)では、以下の機能をローカルで検証する必要がありました。

機能本番floci
基本操作(SignUp, Login, AdminGetUser)動く動く
cognito:groups in JWT含まれる含まれない
PreSignUp Lambda トリガー発火する発火しない
CustomMessage Lambda トリガー発火する発火しない
SES メール送信送信される送信されない
Google OAuth / 外部 IdP動く動かない
client_secretCognito が生成ダミー値
メール確認コード実コード000000 固定

cognito:groups が含まれないのが地味に一番痛い問題でした。ロールベースの認可テストがローカルでできず、コード内で回避策を入れる羽目になります。

// 本来は不要なローカルモード分岐
if !m.local {
    groupsRaw, ok := token.Get("cognito:groups")
    if !ok || !containsAdmin(groupsRaw) {
        // 403
    }
}

エミュレータ一覧

1. cognito-local

GitHub: jagregory/cognito-local | TypeScript | 無料

Cognito に特化したエミュレータ。最も多くの Cognito 固有機能を再現しています。

機能対応
基本操作対応
cognito:groups in JWT対応
PreSignUp トリガー対応
CustomMessage トリガー対応
PreTokenGeneration トリガー対応
SES非対応(CustomEmailSender で代替可)
外部 IdP非対応
JWKS対応

Docker または npm でセットアップ可能。Cognito の機能に特化しているため、S3 や DynamoDB 等の他の AWS サービスには対応していません。

2. MiniStack

GitHub: ministackorg/ministack | Python | 無料

2026 年 3 月に LocalStack の Community Edition 廃止を受けて登場した新しいプロジェクト。40+ の AWS サービスに対応していますが、Cognito の対応はまだ基本的です。

機能対応
基本操作対応
cognito:groups in JWT不明(stub JWT)
Lambda トリガー不明
SES対応
外部 IdP未対応
対応サービス数40+

JWT が「structurally valid だが暗号署名なし」の stub 実装とのこと。groups の挙動は未確認です。成長が速いので今後に期待。

3. LocalStack(有料版)

Website: localstack.cloud | Python | $39+/月

最も包括的なエミュレータ。2026 年 3 月に Community Edition が廃止され、商用利用には有料ライセンスが必要になりました。

機能対応
基本操作対応
cognito:groups in JWT対応
PreSignUp トリガー対応(バグ報告あり)
CustomMessage トリガー対応(バグ報告あり)
SES対応
外部 IdP有料プランで対応
対応サービス数80+

Lambda トリガーは対応していますが、「claims が間違ったトークンに注入される」「PostConfirmation が発火しない」等のバグが GitHub Issues で報告されています。

料金体系の変更(2026年):

4. moto

GitHub: getmoto/moto | Python | 無料

AWS の API をモックするライブラリ。Python のデコレータとして使うのが主流ですが、Server モードで Docker 起動すれば任意の言語から HTTP 経由で利用可能です。

機能対応
基本操作対応
cognito:groups in JWT対応
Lambda トリガー非対応(設定は保存されるが発火しない)
SES対応(モック、実送信なし)
外部 IdP非対応
対応サービス数150+
Server モードdocker run motoserver/moto:latest

cognito:groups が JWT に含まれることはテストスイートで確認されています。ただし Lambda トリガーは「設定は受け付けるが実際には発火しない」モック実装です。

テスト用途に特化しており、エミュレータではなくモックとして捉えるのが正しいです。

5. cognitox

GitHub: unvalley/cognitox | Rust | 無料

2026 年に登場した Rust 製の Cognito エミュレータ。119 の API オペレーションに対応を謳っていますが、Lambda トリガーは未対応。

機能対応
基本操作対応
cognito:groups in JWTおそらく対応
Lambda トリガー非対応
SES非対応
外部 IdP不明
管理 UIWeb UI あり

Rust 製で起動が高速。管理 UI(ブラウザで Pool/User/Group を閲覧)が便利ですが、Lambda トリガー未対応は認証サービスの開発では致命的です。

比較表

機能cognito-localMiniStackLocalStack (有料)motocognitox
料金無料無料$39+/月無料無料
groups in JWT✅?
PreSignUp✅ (⚠️)
CustomMessage✅ (⚠️)
PreTokenGeneration✅ (⚠️)
SES
外部 IdP
Cognito 以外40+80+150+
成熟度
セットアップ簡単簡単簡単簡単

✅ = 対応 ❌ = 非対応 ❓ = 未確認 ⚠️ = バグ報告あり

どれを選ぶか

Cognito の機能テストが最優先なら → cognito-local

groups in JWT、Lambda トリガー(PreSignUp / CustomMessage / PreTokenGeneration)が全て動く唯一の無料選択肢。SES は非対応ですが、CustomEmailSender トリガーで代替可能。

Cognito 以外の AWS サービス(S3、DynamoDB 等)が必要なら、moto の Server モードと併用するのが現実的です。

単一ツールで全部やりたいなら → LocalStack(有料)

最も包括的ですが、$39/月のコストと Lambda トリガーのバグリスクがあります。チーム開発で全員が同じ環境を使うなら投資する価値はあります。

テスト(ユニット/結合)が目的なら → moto

groups in JWT が動くので、ロールベースの認可テストは書けます。Lambda トリガーの統合テストは別の方法で。Server モードなら Go からも使えます。

将来に期待するなら → MiniStack / cognitox

どちらも 2026 年に登場した新しいプロジェクト。MiniStack は 40+ サービス対応で急成長中。cognitox は Rust 製で高速。ただし、現時点では Cognito の高度な機能(トリガー、groups in JWT)の対応が不十分です。

第 4 の選択肢: 実 AWS を叩く

エミュレータの制限に悩むなら、開発環境でも実 AWS を叩くという選択肢もあります。

エミュレータ実 AWS
コスト無料Cognito 無料枠あり(MAU 50,000)
セットアップDocker 起動Terraform apply
機能の完全性制限あり完全
オフライン開発可能不可
テスト速度速いネットワークレイテンシあり
CIDocker-in-DockerAWS クレデンシャル必要

開発用の AWS アカウントを用意し、Terraform でリソースを管理すれば、「エミュレータで動くのに本番で動かない」問題がゼロになります。認可サービス(rellf-authz)では AVP が非対応なため、この方式を採用しています。

おすすめの構成

ローカル開発:
  cognito-local(Cognito + トリガー)
  + moto Server モード(S3、DynamoDB 等)

CI/CD:
  cognito-local(Docker で起動)
  or 実 AWS(開発用アカウント)

統合テスト:
  実 AWS(本番と同じ構成で検証)

段階を分けて使い分けるのが現実的です。ローカルでは cognito-local で高速に回し、CI と統合テストでは実 AWS で本番同等の検証を行う。

まとめ

← Back to all posts