こうこく
作 ▸

AWS Cognitoユーザープールで「Cannot perform specific action because there does not exist a valid use pool domain associated with the user pool」エラー

AWS AmplifyでやってるけどCognitoのエラーのはず

aws-amplify 1.2.2

AWS Amplifyの Auth.signUp() を使って、事前に自分で作っておいたユーザープールにユーザーを追加しようとしたら、CognitoのAPIのレスポンス時に以下のエラーが発生した。

{
  code: 'InvalidParameterException',
  name: 'InvalidParameterException',
  message: 'Cannot perform specific action because there does not exist a valid use pool domain associated with the user pool'
}

エラーが出ていても、コンソールで見るとユーザーはちゃんと追加されていた。一瞬何がおかしいのかと思ったが、よく見たら登録したメアドに確認メールが届いてないような。

原因は、 ユーザープールの設定で「Eメールの検証タイプを『リンク』にしていた」かつ「Cognitoのドメイン名を設定していなかった」 ことだった。

ドメイン名は左メニュー『アプリの統合』→『ドメイン名』から設定できる。独自ドメインじゃなくて、Cognitoのドメインのプレフィックスの方で大丈夫。

Cognitoのドメイン名
Cognitoのドメイン名

ドメイン名を設定したらこのエラーは出なくなったし、確認メールも届いた。


Eメールの検証タイプは、左メニュー『全般設定』→『メッセージのカスタマイズ』から変更できる。

検証タイプ
検証タイプ

検証タイプ『リンク』だと、ユーザー登録後に確認メールが届いて、そこに書かれてるリンクをクリックすることでメールアドレスが正しいことを確認する。よくあるやつ。

なんだけど、そのメールに書かれてるリンク先にCognitoのドメイン名が使用されるので、ドメイン名を設定してないとメールを送信できなくてエラーになるらしい。Cannot perform specific action っていうのは、そのことを指してるっぽい。

検証タイプ『コード』だとこのエラーは発生しなかった。だからドメインが必要なのはメールの送信とかじゃなくて、確認用リンクの生成時だと思う。

[備考] aws-amplifyのバグ

この記事を書いてる時に使ってた aws-amplify はバージョン1.2.2だったんだけど、Auth.signUp()InvalidParameterException 発生時に限り、エラーメッセージが特定の文言で上書きされておかしくなるという問題があった。

それのせいで、ずっと上記のエラーが出てたにもかかわらず、外から捕捉できるエラーメッセージが「Username could not be created. Please make sure that the username you have entered is between 1 and 128 characters.」になってしまっていた。

実際に出てたエラーは以下の通り。

{
  code: 'InvalidParameterException',
  name: 'InvalidParameterException',
  message: 'Username could not be created. Please make sure that the username you have entered is between 1 and 128 characters.'
}

なお、経緯はちゃんと読んでないけど、これはつい4日前のコミット (94b7181) で修正された模様。

まだリリースには反映されてない。

この記事に何かあればこちらまで (非公開)