Amplify Gen2でLambdaトリガーを設定して特定のメールドメインにのみサインアップを許可する方法

こんにちは、新入社員の西村です。

今回は、Amplify Gen2を使って、特定のメールドメイン(今回は @example.com)のみサインアップを許可する方法についてお話しします。
これを実現するために、Amplifyのpre sign-up Lambdaトリガーを活用します。
公式ドキュメントやコミュニティの質問を参考にしながら、実際の設定を行いましたので、その手順を紹介します。

サインアップ制限の背景

プロジェクトにおいて、ユーザーのサインアップ時に特定のメールドメインのみ許可したいという要件がありました。一般的に、企業やサービスの利用者を特定のドメインのメールアドレスに制限したい場合、AWS AmplifyでLambda トリガーを使用することで柔軟に対応できます。

今回は、@example.com というドメインのメールアドレスのみサインアップを許可する設定を行いました。

実装手順

以下に、Amplify Gen2で特定のドメインのメールアドレスに基づいてサインアップを制限する方法を説明します。

1. Lambda 関数を定義

まず、Amplifyで提供されているLambda関数を使用して、サインアップの前にメールドメインをチェックします。以下のコードで、@example.com のみ許可する設定をします。

amplify/auth/pre-sign-up/resource.ts
まず、Lambda関数リソースの定義ファイルを作成します。

import { defineFunction } from '@aws-amplify/backend';

export const preSignUp = defineFunction({
  name: 'pre-sign-up',
  environment: {
    ALLOW_DOMAIN: 'example.com'  // 許可するドメインを指定
  }
});

2. Lambda ハンドラーの実装

次に、実際のLambdaハンドラーを実装します。このハンドラーは、サインアップ時にメールアドレスが @example.com ドメインかどうかを確認します。

amplify/auth/pre-sign-up/handler.ts

import type { PreSignUpTriggerHandler } from 'aws-lambda';
import { env } from '$amplify/env/pre-sign-up';

export const handler: PreSignUpTriggerHandler = async (event) => {
  const email = event.request.userAttributes['email'];

  // メールアドレスが @example.com ドメインで終わるか確認
  if (!email.endsWith('@' + env.ALLOW_DOMAIN)) {
    throw new Error('Invalid email domain');
  }

  return event;
};

3. Authリソースの設定

次に、Authリソースに先ほど作成した preSignUp トリガーを追加します。

amplify/auth/resource.ts

import { defineAuth } from '@aws-amplify/backend';
import { preSignUp } from './pre-sign-up/resource';  // preSignUp トリガーをインポート

export const auth = defineAuth({
  loginWith: {
    email: true,
  },
  triggers: {
    preSignUp,  // preSignUp トリガーを追加
  },
});

これで、サインアップ時に @example.com ドメインでないメールアドレスが入力されると、エラーが発生し、登録できなくなります。

動作確認

サインアップ画面で、@example.com ドメインのメールアドレスを使ってユーザー登録を行い、問題なく登録できることを確認しました。それ以外のメールドメインで試すと、エラーが表示され、サインアップできないことが確認できました。

注意点

  • ドメイン名の管理: この方法では、ドメインをハードコーディングしていますが、運用環境で複数ドメインを管理したい場合は、ドメイン名を環境変数などで設定できるようにすると柔軟性が増します。
  • セキュリティ: ドメインによるフィルタリングは有効ですが、メールアドレスの偽装などに対して完璧ではないため、他の認証手段と併用することをお勧めします。

まとめ

今回は、AWS Amplify Gen2を使用して、特定のメールドメインのみサインアップを許可する方法を紹介しました。AmplifyのLambdaトリガーを使うことで、柔軟にサインアップ条件を変更できることが分かりました。

このように、公式ドキュメントを参考にしながら、自分のプロジェクトに合わせて設定をカスタマイズすることで、セキュアで効率的なユーザー管理が可能になります。

今後も、Amplify Gen2を活用した開発の中で得た知見を共有していきたいと思います!

ちなみに。。。

PreSignUp failed with error Invalid email domain. というエラーメッセージを日本語に変更したい場合、App.tsx に以下のように辞書を追加することで、該当箇所を好きな文章に置き換えることができます。

※ 他の文章も、日本語化前の文章をコピーして、好きな文章を以下のように追加すると置き換え可能です。

import { I18n } from "@aws-amplify/core";
import { translations } from "@aws-amplify/ui-react";

// 日本語の翻訳を設定
I18n.putVocabularies(translations);
I18n.setLanguage("ja");
I18n.putVocabulariesForLanguage("ja", {
  "PreSignUp failed with error Invalid email domain.":
    "無効なメールドメインです。",
});

私は、src/components/translations/i18nConfig.tsx というファイルにすべて記述して、App.tsx にインポートしています。

参考資料