Amazon Cognitoユーザープールの名前の変更失敗:SES設定が原因のエラー解決法
困っていること
Amazon Cognitoユーザープールのプール名を変更しようとコンソールで操作したところ、「ユーザープール名の更新に失敗しました。」というエラーが表示され、変更できない状況です。
Cognitoコンソールでプール名変更時に表示されるエラー画面
CloudTrailログを確認すると、以下のエラーが記録されていました。
{
"eventName": "UpdateUserPool",
"errorCode": "InvalidEmailRoleAccessPolicyException",
"errorMessage": "Cognito is not allowed to use your email identity",
"requestParameters": {
"userPoolId": "ap-northeast-1_pVWBQfMzJ",
"emailConfiguration": {
"sourceArn": "arn:aws:ses:ap-northeast-1:アカウントID:identity/example.com",
"emailSendingAccount": "DEVELOPER",
"from": "test <example@example.com>"
},
"poolName": "email-only"
}
}
名前を変更するだけなのに、なぜAmazon SES(Simple Email Service)に関連するエラーメッセージが表示されるのでしょうか。
原因
SESの送信承認ポリシーの設定不備が原因です。
Cognitoコンソールでプール名を変更する際、UpdateUserPool
APIが呼び出されていました。
このとき、名前変更だけでなく既存のメール設定(SES)についても権限チェックが行われ、SESの送信承認ポリシーの不備によりエラーが発生していました。
設定状況の確認
まず、Cognitoのメール設定を確認すると、送信元メールアドレスがexample@example.com
と設定されていました。
Cognitoユーザープールのメール設定画面
次に、SESの送信承認ポリシーを確認します。
SESアイデンティティの送信承認ポリシー設定画面
以下のポリシーが設定されていました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::アカウントID:root"
},
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "arn:aws:ses:ap-northeast-1:アカウントID:identity/example.com",
"Condition": {
"StringNotLike": {
"ses:FromAddress": "*@m.example.com"
}
}
}
]
}
このポリシーは、example.com
ドメインでのメール送信時に、Fromアドレスを*@m.example.com
の形式のみに制限する設定です。m.example.com
以外のFromアドレス(example@example.com
など)での送信は拒否されます。
問題の詳細
今回のケースでは、以下の設定の不整合が問題となっていました。
- Cognitoの送信者設定:
example@example.com
- SESの送信承認ポリシーの制限:
*@m.example.com
パターンのみ許可 - ポリシー評価の原則: Deny(拒否)がAllow(許可)より優先される
つまり、example@example.com
が *@m.example.com
パターンにマッチせず、SESの送信承認ポリシーによって拒否されていました。
設定の経緯
おそらく以下のような順序で設定が行われ、不整合が生じたと考えられます。
- 最初にCognitoでメール設定:
example@example.com
で構築 - 後からSESの送信承認ポリシーを追加: セキュリティ強化のため
*@m.example.com
制限を設定 - 設定の整合性チェック不足: 既存のCognito設定との整合性を確認せず
解決方法
この問題を解決するには、以下の2つの方法があります。
方法1: SESの送信承認ポリシーを修正(推奨)
SESの送信承認ポリシーを更新して、example@example.com
も許可するように修正します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::アカウントID:root"
},
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "arn:aws:ses:ap-northeast-1:アカウントID:identity/example.com",
"Condition": {
"StringNotLike": {
"ses:FromAddress": [
"*@m.example.com",
"example@example.com"
]
}
}
}
]
}
Amazon SESの送信承認ポリシーの詳細については、以下の記事を参考にしてください。
方法2: Cognitoの送信元メールアドレスを変更
Cognitoの設定で送信元メールアドレスをtest <example@m.example.com>
に変更し、SESの送信承認ポリシーの制限パターンに合わせます。
修正結果
修正後、再度Cognitoコンソールでプール名の変更を実行すると、正常に完了しました。
プール名変更成功後の画面
最後に
今回のトラブルは、CognitoとSESの設定間の不整合が原因でした。
同様のエラーが発生した場合は、CloudTrailログや関連するAWSサービスの設定をご確認ください。