🔐

オープンなAmazon Cognitoエミュレーター "Magnito" のご紹介

2024/07/30に公開

はじめに

こんにちは。かる(@caru_ini)です!
大学生として勉強する傍ら、日々フロントエンドエンジニアを目指して活動しています。今回は、私がコミッターとして参加しているMagnitoというOSSプロジェクトについて紹介します。

皆さんは、AWSのCognitoというサービスを知っていますか? スマホアプリからWebアプリまで、多くのアプリケーションで認証・認可の機能は不可欠です。その中でも、Amazon Cognitoは多くの開発者に利用されている認証・認可サービスの一つです。この記事では、Cognitoを使う際の課題と、Magnitoがそれにどう対応するかを紹介します。

Amazon Cognitoとは

Amazon Cognito New Logo

Amazon Cognitoは、Amazon Web Serviceが提供するユーザー認証、認可、およびユーザー管理を簡単にするためのサービスです。これにより、アプリケーションにユーザーサインインやアクセス制御機能を統合できます。

ローカル開発の課題

しかし、ローカル環境での開発やテスト時には、以下のような課題があります。

  • ユーザープールやIDプールの設定が煩雑
  • ユーザーのサインアップや認証のテストが難しい
  • インターネット接続が必須

これらの課題を解決するために、Magnitoの開発が始まりました。

Magnitoの概要

Magnito

Magnitoは、AWSのCognitoサービスをローカルでエミュレートするためのツールです。これにより、開発者はインターネット接続なしでCognitoの操作を行うことができます。現時点では、ユーザープール機能を中心に、ユーザーのサインアップ、ログイン、ログアウト、パスワードリセットなどをサポートしています。ただし、GoogleログインやLambda連携などの機能はサポートされていません。

主な特徴

Magnitoの主な特徴は以下の通りです。

  • 🤝オープンソースで無料
  • 🔌インターネット接続なしでCognitoをエミュレート
  • 💻サポートしている機能範囲内での高い信頼性
  • 🔧煩雑な設定不要

特にDockerファーストで永続化に対応している点が特徴的で、Motoserverと比較して、ユーザー情報の管理が容易です。MotoserverはPythonのBoto3前提で動作することが多く、ユーザー情報の保持が非常に面倒ですが、Magnitoではその点が改善されています。

導入手順

インストール方法

MagnitoはDocker Hubからダウンロードして利用できます。docker-composeを利用した使用方法を紹介します。

compose.yml
services:
  magnito:
    image: frourio/magnito:latest
    ports:
      - 5050:5050 # Cognito API
      - 5051:5051 # web interface
    environment:
      COGNITO_USER_POOL_ID: ap-northeast-1_example
      COGNITO_USER_POOL_CLIENT_ID: example-client-name
      COGNITO_ACCESS_KEY: magnito-access-key
      COGNITO_SECRET_KEY: magnito-secret-key
      COGNITO_REGION: ap-northeast-1
      SMTP_HOST: inbucket
      SMTP_PORT: 2500
      SMTP_USER: fake_mail_user
      SMTP_PASS: fake_mail_password
    volumes:
      - magnito:/usr/src/app/data

  inbucket:
    image: inbucket/inbucket:3.0.3
    ports:
      - 2500:2500 # SMTP
      - 9000:9000 # web interface
    volumes:
      - inbucket:/storage

volumes:
  magnito:
    driver: local
  inbucket:
    driver: local

以下のコマンドで起動します。

docker-compose up -d

Magnitoが起動したら、http://localhost:5051にアクセスして、MagnitoのWebインターフェースにアクセスできます。

SMTPサーバーの使用方法

上のcompose.ymlでは、SMTPサーバーとしてInbucketを使用しています。Inbucketは、ローカルで動作するSMTPサーバーで、メールの送信や受信をエミュレートすることができます。Magnitoから送信されるすべてのメールはInbucketに保存され、Webインターフェース(http://localhost:9000)から確認することができます。

Amplify UIでの設定

Amplify UIを使用している場合、以下のようにエンドポイントを変更します。

import awsConfig from './aws-exports';
// other imports...

Amplify.configure({
  Auth: {
    Cognito: {
      userPoolId: 'ap-northeast-1_example',
      userPoolClientId: 'example-client-name',
      userPoolEndpoint: 'http://localhost:5050',
    },
  },
});

これで、ローカル環境でCognitoを利用する準備が整いました。

活用シナリオ

新規プロジェクトのプロトタイピング

MagnitoはDockerコンテナとして提供されているため、アプリケーションのプロトタイピングや開発環境の構築が簡単に行えます。実装のミスでユーザープールを破壊してしまった場合でも、コンテナを作成し直すだけでリセットできるため、安心して開発を進めることができます。

ローカルでの開発

ローカルで実行されるため、429(Too Many Requests)エラーやネットワーク遅延などの問題を気にせずに、テストやデバッグを行うことができます。

テストへの組み込み

テストにおいても、インターネット接続が不要なため、CI/CDパイプラインでのテストがスムーズに行えます。

まとめ

Magnitoは、Amazon Cognitoの機能をローカル環境でエミュレートするための強力なツールです。これにより、インターネット接続が不要となり、設定の煩雑さやテストの難しさを解消できます。オープンソースで無料提供されており、特にAmplify UIとの組み合わせで、簡単にローカル開発環境を構築できます。Magnitoを活用することで、開発効率の向上やテスト・デバッグの迅速化が期待できるでしょう。ぜひ一度試してみてください。

おわりに(お願い)

Magnitoはまだ発展途上のOSSプロジェクトです。GitHubリポジトリにスター⭐をつけていただけると、開発メンバーにとって大変励みになります。また、バグ報告や機能リクエスト、コードの改善提案などのコントリビューションも大歓迎です。詳しくは、以下のリンクをご覧ください!

https://github.com/frouriojs/magnito

以上、Magnitoの紹介でした!ご質問やフィードバックがありましたら、コメント欄または X までお気軽にお寄せください。最後まで読んでいただき、ありがとうございました!

GitHubで編集を提案

Discussion