2026.06.02[Tue]

CognitoのメールOTPを独自ドメインから送信するためのSES設定とSandbox解除

    目次

    はじめに

    こんにちは、エンジニアチームのこむたです。

    社内ツール向けのログイン機能として、AWS Cognitoを使ったパスワードレス認証を導入しました。

    パスワードレス認証にはSMSや認証アプリなど複数の選択肢がありますが、今回はPCだけでも認証を完結でき、特定のデバイスに依存しないメールOTP(ワンタイムパスワード)を採用しました。

    Cognitoでは標準でメールによるOTP認証を利用できますが、そのまま利用すると送信元メールアドレスを自由に設定できません。

    実運用では独自ドメインのメールアドレスから送信したいケースも多く、その場合はAmazon SESとの連携が必要になります。

    しかし実際に設定を進めてみると、

    • SESのIdentity設定
    • Sandbox環境による送信制限
    • 本番利用申請

    など、事前に知っておきたいポイントがいくつかありました。

    本記事では、CognitoのメールOTPを独自ドメインから送信するために行った設定と、その過程で確認した仕様や注意点をまとめます。

    メールによるOTP認証について

    Cognitoでは、パスワードレス認証としてOTPを利用することができます。
    認証方法としては、SMS、認証アプリ、そしてメールによる手段が用意されています。

    今回は、デバイスへの依存が少ないメールによる認証方法を採用しました。
    これにより、ユーザーはメールアドレスを入力し、送信された認証コードを入力するだけでログインできます。

    メールによるOTPには以下のような制約があります。

    • パスワードの桁数は8桁固定
    • 有効期限は認証フローのセッション時間に依存(3〜15分で設定可能)
    • メールの件名および本文はカスタマイズ不可

    しかし今回は社内ツールでの利用ということもあり、これらの制約は許容できる範囲でした。

    メール送信元の制約

    Cognitoにはデフォルトのメール送信機能がありますが、そのまま利用すると送信元は固定アドレス(no-reply@verificationemail.com)になります。

    このままでも動作はしますが、運用する上ではいくつかの制約があります。

    • サービスのメールとして不自然
    • メールの到達性(迷惑メールの回避など)をコントロールできない
    • メールの配信状況を確認する手段が提供されていない

    そのため、実運用では送信元や配信状況を自分で管理できるように、Amazon SESを利用します。

    SESの利用とIdentityの設定

    SESを利用する場合、なりすましメールの送信を防止するため、送信元として使うメールアドレスまたはドメインを事前に検証(Identity登録)する必要があります。

    検証の方法には、メールアドレス単位とドメイン単位の2種類があります。

    特定のメールアドレスだけを使いたい場合は、個別に検証します(例: no-reply@example.com)。
    利用できるアドレスが限定されますが、設定が簡単で、すぐに使い始めたい場合に向いています。

    ドメイン単位で検証する場合は、DNSの設定などが必要になりますが、そのドメイン配下のメールアドレスを自由に送信元として利用できます(例: example.com)。実運用ではドメイン単位での検証が一般的です。

    Sandbox環境の制限

    SESは初期状態ではSandbox環境になっており、不正利用やスパム送信を防ぐため、メール送信に制限がかかった状態になります。

    主な制限は以下の通りです。

    • 検証済みのメールアドレスにしか送信できない
    • 1日200通、1秒1通までの制限がある

    開発や動作確認の用途ではそのまま利用できますが、実運用では、このSandboxを解除する必要があります。

    Sandboxの解除方法

    手順は以下の通りです。

    1. SESのコンソールを開く
    2. 「Account dashboard」に移動
    3. 「Request production access」から申請

    申請時には、AWS側に利用用途を説明するメッセージが必要です。
    以下の内容が伝わるように記載するのがポイントです。

    • メールの用途(認証・通知など)
    • 誰に送るのか(ユーザー入力か、リスト配信か)
    • スパムやマーケティング用途ではないこと
    • 想定される送信量

    以下はSandbox解除申請時のメッセージ例となります。

    Webサービスのログイン機能として、Amazon Cognito を利用したメールOTP認証を実装しています。
    ユーザーが入力したメールアドレス宛に、認証コードを送信する用途で利用します。
    1日あたりの送信量は、数百件程度を見込んでいます。
    送信はユーザーのログイン操作に応じて行われるものであり、マーケティング用途や一括配信は行いません。
    送信内容は、認証コードのみのシンプルなメールです。
    

    実際に申請したところ、我々の環境では約3日ほどで解除されました。
    即座に反映されるわけではないため、早めに申請しておくことをおすすめします。

    Sandbox解除後の状態

    Sandboxを解除すると、以下のように制限が緩和されます。

    • 任意のメールアドレスに送信可能
    • 送信数の制限が 1日50,000通、1秒14通 までに緩和

    これにより、想定していた形でOTP認証を利用できるようになりました。

    なお、ユーザー数の増加などに応じて、AWSサポートに申請することで送信数の上限を拡張することもできます。

    まとめ

    CognitoのメールOTPは簡単に導入できますが、実運用するにはいくつかのポイントがありました。

    • OTPの仕様(桁数・有効期限の範囲・メール内容)は固定
    • 独自ドメインでメールを送信するにはSESが必要
    • Sandboxの解除が必須

    少しハマりどころはありますが、一度理解してしまえばシンプルに運用できる仕組みです。

    これから導入する方の参考になれば幸いです。

    参考文献

    Share

    S3→EventBridge→Step Functions→GlueでCSV取り込みを自動化した話