はじめに
Amazon Cognito user poolsではユーザー登録時の招待メールやパスワードリセット時など、いくつかのタイミングでユーザーに対してメールを発出します。 このメールの送信機能は「Cognitoのデフォルト機能による送信」と「Amazon SESによる送信」のいずれかを選ぶことができます。
この2つの違いは以下のとおりです。
機能 | Fromアドレス | 1日あたり送信数の制限 |
デフォルト | no-reply@verificationemail.com | 50通 |
SES | 任意(※1) | (※2) |
※1 自分が受信できるメールアドレスであることが必要
※2 SESの制限による。送信クォータを引き上げるリクエストが可能
Cognitoからのメールは「招待」「自己登録」「Eメール検証」「パスワード忘れ」のタイミングで発出されるので、商用環境では50通/日の制限がないSESの利用が必須になると思います。 また、ビジネス上の要件でFromアドレスを企業のドメインに変えたい場合もSESを使う必要があります。
この記事ではSESとCognitoの一連の設定方法を説明します。
この記事のゴール
Cognitoから送信されるメールをSESで設定する
前提条件
Userpoolは作成済み
Fromに使うメールアドレスは受信可能であること
設定時にCognitoからの検証メールを受信する必要があります
SES上で受信可能なメールアドレスを作ることもできますがこの記事では対象外です
DNSにレコードを登録する権限
Route53が同じAWSアカウントにある場合は自動で設定できます
Route53が別アカウントまたは異なるDNSサーバーを使っている場合は、手動でレコードを登録します
この記事では no-reply@optarc.net をFromアドレスに設定するため、optarc.net にレコードを追加します
設定方法
CognitoでSESを使用するには、SESで「検証済みEメールID」を登録して、それをUser poolのFromアドレスに設定する必要があります。
Amazon SES
SESを設定するには、まずは「本稼働アクセスのリクエスト」をする必要があります。 SESでは意図せず迷惑メールを大量発出してしまうことなどの対策として、デフォルトでは「サンドボックス」内で機能が制限されているので、これを解除するリクエストが必要になります。
検証済みID(ドメイン)の登録
SESのコンソールから[ID] -> [IDの作成]を選びます。
IDの詳細フォームで以下を入力します。
IDタイプ:ドメイン
ドメイン:メールのFromアドレスのドメイン
デフォルト設定セットの割り当て:OFF
カスタムMAIL FROMドメインの使用:OFF
ドメインの検証フォームで「DKIMの詳細設定」を開き以下を入力します。
IDタイプ:Easy DKIM
DKIM署名キーの長さ:RSA_2048_BIT
DNSレコードのRoute53への発行:OFF
DKIM署名:ON
登録が完了すると3つのCNAMEレコードが発行されるのでこれをDNSサーバーに登録します。
DNSにレコードを登録してからしばらくするとIDの一覧のIDステータスが「検証済み」に変わります。
本稼働アクセスのリクエスト
ドメインが検証済みになるとメニューの [設定を始める] -> [本稼働アクセスのリクエスト]が使用可能になるので[本稼働アクセスのリクエスト]ボタンをクリックします。
申請フォームでは以下のように内容を入力します。バウンスの処理方法とユーザーのオプトアウト方法の記載が必要なようです。
メールタイプ:トランザクション
ウェブサイトのURL:User poolを使うアプリケーションのURLを入力します。
ユースケースの説明 CognitoUserpoolからのトランザクションメール送信専用で使用する。 バウンス・苦情はSESからSNS経由で管理者がメール受信して対処する。 ユーザーからのオプトアウトはユーザーが管理者に連絡することで対処する。
その他の連絡先:この申請に関する連絡先なので、自分のメールアドレスを入力します。申請が受理されるとこのアドレスに通知がきます。
連絡する際の希望言語:Japanese
※ 申請内容は一例です。実際のユースケースに従って申請内容を設定してください。
この申請が受理されて完了メールが来るまで待ちます。ドキュメントによると最大24時間かかるようですが私の場合は1時間以内に通知がきました。 裏ではサポートケースが発行されているようなので、AWSリセラーを利用している場合はリセラーが提供するサポートから返信メールが来ると思います。
メール送信確認
SESからメールが送れることを確認します。
SESのコンソールから[ID] -> 検証済みID(ドメイン)で設定したドメインを選択します。
メッセージの詳細フォームで以下のように入力します。
Eメール形式:フォーマット済み
From-address:test-from (このアドレスはなんでも良いです)
シナリオ:カスタム
カスタム受信者: 自分のメールアドレス
件名:Test
本文:Test-Body
カスタム受信者に設定した自分のメールアドレスにメールが届いていればOKです。
検証済みEメールIDの作成
SESのコンソールから[ID] -> [IDの作成]を選びます。
IDの詳細フォームで以下を入力します。
IDタイプ:Eメールアドレス
Eメールアドレス: no-reply@optarc.net ← 検証済みドメインで受信可能なメールアドレス
登録が完了すると設定したメールアドレスに Subjectに "Email Address Verification Request"が含まれるメールが届きます。このメール本文のリンク(https://email-verification.us-east-1.amazonaws.comで始まる)をクリックします。
「おめでとうございます。メールアドレスの検証に成功しました。このアドレスからのメール送信を開始できます。」のページが表示されることを確認します
SESのコンソールから[ID]のリストを表示し、登録したEメールアドレスのIDステータスが「検証済み」になっていることを確認します。
これで、Cognitoへの設定準備が完了しました。
Amazon Cognito (User pool)
CognitoではUser poolのメッセージング設定をSESを使用するように変更します。
User poolの設定
Cognitoのコンソールから目的のUser poolを選択します。
[メッセージング]タブの[Eメール]フォームの[編集]ボタンをクリックします。
[Eメール]フォームで以下を設定して[変更を保存]をクリックします。 Eメールプロバイダ: Amazon SESでEメールを送信 SESリージョン:SESを設定したリージョン 送信元Eメールアドレス:SESで設定したEメールIDを選択 送信者の名前:"表示名<送信元Eメールアドレス>"の形式
確認
User poolにユーザーを登録して、設定したFromアドレスでメールが届くことを確認します。 ユーザー登録時には「Eメールで招待を送信」を選択するとメールが送信されます。
User poolに登録したアドレスが間違っていたらどうなるか
CognitoもSESも基本的にはメール送信のAPIの成功までしか見てくれず、メールアドレスの間違いはAPIで検知することができません。 メールアドレスに間違いがあった場合、送信先のメールサーバーが返すエラーかメールサーバーが不明で返ってきたメールで判断する必要があります。
では、メールはどこに返ってくるかというと送信元のメールアドレスまたはReply-Toに設定したアドレスに返ってくるので、このアドレスにメールが来ていないかを確認すれば良いということになります。
google groupsを使っている場合の注意
企業でGoogleを導入している場合、メーリングリスト的に使用できるgoogle groupsをFromアドレスに使用できます。 google groupsを使うと個人に直接紐づかないメールアドレスをCognitoに設定できるので便利ではあるのですが、前述のエラーの扱いでハマる場合があります(ハマりました)
google groupの仕様として、エラーで返ってきたメールは破棄されてしまいます。
「返送メッセージ」とも呼ばれる配信不能レポート(NDR)をグループに送信または転送することはできません。NDR に似ているメッセージも、送信や転送はできません。
そのため、エラーメールがFromアドレスに返ってくることを期待していると検知できないという事態になります。
この場合は、SESで「フィードバック通知」という設定をしてSNS Topicにエラーメールが来たことを通知するようにしなければなりません。 この設定については次の記事で書こうと思います。
Opmerkingen