Amazon Cognito でサンドボックス制限中の Amazon SES をメールプロバイダーとして設定していると CodeDeliveryFailureException が発生します

2023.04.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon Cognito のユーザープールでは、ユーザーに対して E メールを送信するシーンがいくつかあります。
例えばサインアップ時の検証コード送信、管理者によって作成された際の仮パスワード送信、メールアドレス変更時などです。

そして、そのメール送信には Cognito の機能を使うことも出来るのですが送信数の制限などがあって開発用途に本当に簡単な確認用途にでのみ利用が出来ます。
実際には Amazon SES で ID を用意して、Cognito から Amazon SES を使ってメール送信することになります。

先日次のようなエラーメッセージが表示され、メール送信を伴う Cognito API の操作に失敗しました。

An error occurred (CodeDeliveryFailureException) when calling the UpdateUserAttributes operation: Cognito received the following error from Amazon SES when attempting to send email: Email address is not verified. The following identities failed the check in region US-WEST-2: after@example.com

初めて見たエラーだったのですが、結論としては Amazon SES がサンドボックス制限されていることが原因でした。
今回サンドボックス解除の前後で API の挙動などを比較してみましたので紹介します。

サンドボックス制限中の様子

私の検証環境の東京リージョンでは既にサンドボックスが解除されていましたが、サンドボックス設定はリージョンごとに解除申請が必要なので、まだ解除されていなかったオレゴンリージョンで試してみます。
次のようにサンドボックス制限中であることを確認済みです。

ID タイプは簡易的に E メールアドレスを使っています。
サンドボックス制限中ですが、ID ステータスは検証済みになっているので、この時点で Cognito のユーザープールへ設定は可能です。

Cognito ユーザープールのメッセージングタブの「E メール」でメール送信プロバイダーを設定します。

次の AWS CLI コマンドを使って、登録済みユーザーのメールアドレスを変更します。

% cat update.json
{
    "UserAttributes": [
        {
            "Name": "email",
            "Value": "after@example.com"
        }
    ],
    "AccessToken": "..."
}
% aws cognito-idp update-user-attributes --cli-input-json file://update.json --region us-west-2

An error occurred (CodeDeliveryFailureException) when calling the UpdateUserAttributes operation: Cognito received the following error from Amazon SES when attempting to send email: Email address is not verified. The following identities failed the check in region US-WEST-2: after@example.com

更新に失敗しました。
冒頭ご紹介したエラーメッセージが表示されていますね。

サンドボックス解除後の様子

次に、サンドボックスを解除して挙動を観察してみましょう。
次の記事を参考にサンドボックス解除申請を行います。

プロセスは省略しますが、解除されました。

先程と同様に送信してみましょう。

% cat update.json
{
    "UserAttributes": [
        {
            "Name": "email",
            "Value": "after@example.com"
        }
    ],
    "AccessToken": "..."
}
% aws cognito-idp update-user-attributes --cli-input-json file://update.json --region us-west-2
{
    "CodeDeliveryDetailsList": [
        {
            "Destination": "a***@e***",
            "DeliveryMedium": "EMAIL",
            "AttributeName": "email"
        }
    ]
}

おお、サンドボックス解除後は問題なく送信出来るようになりましたね。

さいごに

本日は Amazon Cognito でサンドボックス制限中の Amazon SES をメールプロバイダーとして設定した際の挙動を紹介しました。

次のドキュメントなどには「開発段階とテスト段階では、Amazon SES サンドボックス環境の使用で事足ります」と説明されていますが、前提条件として送信先メールアドレスも Amazon SES にて検証済みでサンドボックス内でも送信可能な場合に限ります。
サンドボックスを解除するか、送信予定のメールアドレスを全て事前に Amazon SES で検証済みとする必要があります。

同じエラー内容で困っている方は上記どちらかの対応後にもう一度試してみてください。