[アップデート] Amazon Cognito ユーザープールの SMS 送信で AWS End User Messaging SMS への直接パスを利用できるようになりました
いわさです。
Amazon Cognito ユーザープールでは、MFA コードや検証コードの送信に SMS を利用できます。
従来、Cognito からの SMS 送信は Amazon SNS の Publish API を呼び出す形で行われていました。
しかし、2024年に Amazon SNS の SMS メッセージング機能は AWS End User Messaging SMS に置き換えられています。
公式ドキュメントによると、現在の SNS パスは、Cognito → SNS(Publish)→ End User Messaging SMS という経路で SMS が送信されており、SNS が End User Messaging SMS へのパススルーとして介在している状態です。
そして、Cognito が必要なアクションは sns:Publish になっています。
日本語版ドキュメントではこの注記のみが記載されています。

Amazon Cognito ユーザープール用の SMS メッセージ設定 - Amazon Cognito より引用
先日のアップデートで、この中間の Amazon SNS を介さず Cognito から AWS End User Messaging SMS の SendTextMessage API を直接呼び出すパスが追加されました。これにともなって必要なアクションも sms-voice:SendTextMessage になっています。
英語版ドキュメントでは直接パスの設定手順や比較情報が追加されています。

SMS message settings for Amazon Cognito user pools - Amazon Cognito より引用
設定方法なのですが、明示的な設定が必要で本日時点ではまだマネジメントコンソールからは設定はできなさそうでした。
ただし、AWS API 経由では設定ができるようになっていました。AWS CLI では v2.36.2 で対応しています。
今回こちらを確認してみたので紹介します。
実際に確認してみる
では早速 AWS CLI で EumsSms(直接パス)を設定してみましょう。
具体的には、SMS 設定の EumsSms オブジェクトに IAM ロールや Origination Identity を指定します。
従来の Amazon SNS パス(SnsCallerArn)とは排他で、どちらか一方のみを設定する形です。
前提:AWS End User Messaging SMS の Sender ID
今回の検証では、AWS End User Messaging SMS に登録済みの Sender ID を使用します。
対象アカウントの東京リージョンに HOGE という Sender ID が存在することを確認しました。
$ aws pinpoint-sms-voice-v2 describe-sender-ids --region ap-northeast-1
{
"SenderIds": [
{
"SenderIdArn": "arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP",
"SenderId": "HOGE",
"IsoCountryCode": "JP",
"MessageTypes": [
"Promotional",
"Transactional"
],
"MonthlyLeasingPrice": "0.00",
"DeletionProtectionEnabled": false,
"Registered": false
}
]
}
IAM ロールの作成
Cognito が AWS End User Messaging SMS を直接呼び出すには、sms-voice:SendTextMessage の実行権限を持つ IAM ロールが必要です。
従来の SNS パスでは sns:Publish 権限でしたが、直接パスではアクションが変わります。
信頼ポリシーで cognito-idp.amazonaws.com からの引き受けを許可し、権限を付与したロールを作成しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "cognito-idp.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sms-voice:SendTextMessage",
"Resource": "*"
}
]
}
$ aws iam create-role --role-name hoge-cognito-eums-sms-role \
--assume-role-policy-document file://eums-trust-policy.json
$ aws iam put-role-policy --role-name hoge-cognito-eums-sms-role \
--policy-name eums-sms-send \
--policy-document file://eums-permission-policy.json
なお、公式ドキュメントでは Resource を Origination Identity の ARN にスコープすることが推奨されています。
今回は検証なので * にしていますが、本番利用では絞った方が良いです。
EumsSms を指定してユーザープールを作成
--sms-configuration に EumsSms オブジェクトを指定してユーザープールを作成します。
CallerArn に先ほど作成した IAM ロール、OriginationIdentity に Sender ID の ARN を指定します。
{
"EumsSms": {
"CallerArn": "arn:aws:iam::123456789012:role/hoge-cognito-eums-sms-role",
"ExternalId": "hoge-cognito-eums-test",
"OriginationIdentity": "arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP",
"Region": "ap-northeast-1"
}
}
$ aws cognito-idp create-user-pool \
--pool-name hoge-eums-sms-test \
--auto-verified-attributes phone_number \
--sms-configuration file://sms-config.json \
--region ap-northeast-1
{
"UserPool": {
"Id": "ap-northeast-1_OnuXM2gZE",
"Name": "hoge-eums-sms-test",
"Policies": {
"PasswordPolicy": {
"MinimumLength": 8,
"RequireUppercase": true,
"RequireLowercase": true,
"RequireNumbers": true,
"RequireSymbols": true,
"TemporaryPasswordValidityDays": 7
},
"SignInPolicy": {
"AllowedFirstAuthFactors": [
"PASSWORD"
]
}
},
"DeletionProtection": "INACTIVE",
"AutoVerifiedAttributes": [
"phone_number"
],
"MfaConfiguration": "OFF",
"SmsConfiguration": {
"EumsSms": {
"CallerArn": "arn:aws:iam::123456789012:role/hoge-cognito-eums-sms-role",
"ExternalId": "hoge-cognito-eums-test",
"OriginationIdentity": "arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP",
"Region": "ap-northeast-1"
}
},
"UserPoolTier": "ESSENTIALS"
}
}
レスポンスの SmsConfiguration に EumsSms が含まれています。
従来の SnsCallerArn ではなく、End User Messaging SMS 直接パスが適用されたことがわかります。
なお、describe-user-pool でも同様に SmsConfiguration.EumsSms として設定内容を確認できます。
set-user-pool-mfa-config での SMS MFA 設定
SMS MFA の設定でも EumsSms を使えます。
set-user-pool-mfa-config の SmsMfaConfiguration 内の SmsConfiguration に EumsSms を指定して MFA を有効化してみました。
{
"SmsAuthenticationMessage": "Your verification code is {####}",
"SmsConfiguration": {
"EumsSms": {
"CallerArn": "arn:aws:iam::123456789012:role/hoge-cognito-eums-sms-role",
"ExternalId": "hoge-cognito-eums-test",
"OriginationIdentity": "arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP",
"Region": "ap-northeast-1"
}
}
}
$ aws cognito-idp set-user-pool-mfa-config \
--user-pool-id ap-northeast-1_OnuXM2gZE \
--sms-mfa-configuration file://mfa-config.json \
--mfa-configuration OPTIONAL \
--region ap-northeast-1
{
"SmsMfaConfiguration": {
"SmsAuthenticationMessage": "Your verification code is {####}",
"SmsConfiguration": {
"EumsSms": {
"CallerArn": "arn:aws:iam::123456789012:role/hoge-cognito-eums-sms-role",
"ExternalId": "hoge-cognito-eums-test",
"OriginationIdentity": "arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP",
"Region": "ap-northeast-1"
}
}
},
"MfaConfiguration": "OPTIONAL"
}
SMS MFA の設定でも EumsSms が正常に反映されていることが確認できます。
マネジメントコンソールでの表示
EumsSms を設定したユーザープールをマネジメントコンソールで確認してみましたが、SMS の送信パスが SNS なのか直接パスなのかはコンソール上に表示されませんでした。


本日時点では EumsSms の設定状況はコンソール上では確認できないようなので、CLI や API で確認する必要がありそうです。
SNS パスと直接パスの同時指定はエラーになる
SnsCallerArn(SNS パス)と EumsSms(直接パス)を同時に指定するとエラーになります。
$ aws cognito-idp create-user-pool \
--pool-name hoge-eums-both-test \
--sms-configuration '{"SnsCallerArn":"arn:aws:iam::123456789012:role/some-role","EumsSms":{"CallerArn":"arn:aws:iam::123456789012:role/hoge-cognito-eums-sms-role","OriginationIdentity":"arn:aws:sms-voice:ap-northeast-1:123456789012:sender-id/HOGE/JP","Region":"ap-northeast-1"}}' \
--region ap-northeast-1
An error occurred (InvalidParameterException) when calling the CreateUserPool operation: Invalid SMS configuration given, cannot specify both SNS and EUMS parameters.
どちらか一方のみを指定する排他的な構成になっています。
なお、一方を設定すると他方の設定は自動的にクリアされるとのこと。
さいごに
本日は Amazon Cognito ユーザープールの SMS 送信で、Amazon SNS を介さず AWS End User Messaging SMS を直接呼び出すパスが追加されたアップデートを確認してみました。
2024年に Amazon SNS の SMS メッセージング機能が AWS End User Messaging SMS に置き換えられて以降、SNS パスは内部的に End User Messaging SMS へのパススルーになっていました。
今回のアップデートでその中間を飛ばして直接呼び出せるようになった形です。
直接パスでは Configuration Set や Origination Identity を Cognito 側から明示的に指定できるので、送信イベントの追跡や送信元 ID の管理を End User Messaging 側に一元化したいケースで使い勝手が良さそうです。
既存の SNS パスも引き続き利用可能なので即座の移行は不要ですが、公式ドキュメントでは新規ユーザープールには直接パスが推奨されています。







