📝

Cognito ユーザープール作成時の InvalidSmsRoleAccessPolicyException というエラーについて

に公開

Cognito のサービスロールのアクセス権限を確認しましょう

経緯

Cognito ユーザープール作成時のサインイン識別子のオプションで電話番号を選択した場合、ユーザープール作成時に以下エラーが発生しました。

[InvalidSmsRoleAccessPolicyException] ユーザープールの作成に失敗しました
InvalidSmsRoleAccessPolicyException (Request ID: 21256862-ff2a-4011-ba6c-ba07f2218c98)

サインイン識別子のオプションがメールアドレスの場合には発生しませんでしたので、SMS に関連していると思われました。
そこで、CloudTrail で CreateUserPool の記録を確認したところ、リクエストパラメーターに snsCallerArn という IAM ロールが含まれていました。

"smsConfiguration": {
    "snsCallerArn": "arn:aws:iam::012345678901:role/service-role/role-name",
    "externalId": "xxx"
},

上記 IAM ロールの権限を確認したところ、何も権限が付与されていませんでした。
試しに AdministratorAccess ポリシーを付与したところ、ユーザープールの作成に成功したため、上記ロールの権限不足が原因でした。

サービスロールについて

SMS message settings for Amazon Cognito user pools - Amazon Cognito

When you create an IAM role during the process of user pool creation in the Amazon Cognito console, Amazon Cognito configures the external ID for you in the role and in the user pool settings.

上記ドキュメントをもとに実際に検証したところ、ユーザープールの作成中に自動的に作成されるリソースでした。
当該サービスロールが存在しない状態で電話番号を選択してユーザープールを作成した場合、自動的に上記 CognitoIdpSNSServiceRole という IAM ロールが作成されました。

ただし、CloudTrail の CreateRole の記録上は Cognito ではなくユーザープールを作成した IAM プリンシパルが IAM ロールを作成したことになっていました。

ちなみに当該ロールを削除したり、当該ロールの権限をすべてはく奪した場合でも冒頭のエラーが発生しました。
デフォルトでは sns:publish の権限のみ付与されていますが、私の環境では誤ってこの権限を削除したことで冒頭のエラーが発生していました。

もしロールを削除してしまった場合は同名のロールを再作成するか、ユーザープールの認証 > SMS で新しいロールを作成すればエラーの回避が可能です。

まとめ

今回は Cognito ユーザープール作成時の InvalidSmsRoleAccessPolicyException というエラーについて紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion