この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、Amazon SNSで送信するSMSのメッセージの送信者IDを指定してみました。
SMSの送信者IDは既定で"NOTICE"となる
AWSでSMSを送信できる機能であるAmazon SNSですが、送信したSMSの送信者IDは既定でNOTICE
となります。
しかし、ビジネスでの利用においてはブランディングのためにこの送信者IDは企業やサービスを表すIDとしたいです。また、SMSアプリ上でのメッセージの表示は送信者IDごとになるため、他企業と同じ画面にメッセージが表示されるのは避けたいです。
送信者IDを指定してみる
そこで今回は、送信者IDをclassmethod
として、以下の方法でSMSの送信を試してみます。
- マネジメントコンソール
- AWS CLI
- Node.js(Lambda関数)
マネジメントコンソールの場合
AWSマネジメントコンソールの場合は、[Mobile]-[テキストメッセージング(SMS)]-[テキストメッセージングの発行]で、[発信元ID]-[送信者ID]で指定することができます。
ちなみに記載の通り送信者IDに指定できる値には下記の制限があります。
少なくとも 1 つの文字を含み、スペースを含まない、最大 11 文字の英数字またはハイフン (-)。先頭と末尾は英数字である必要があります。
メッセージを発行すると、送信者IDがclassmethod
となったメッセージを受信できました。
AWS CLIの場合
AWS CLIのsns publish
を使用します。
sns publish
での送信者IDの指定は、message-attributes
パラメータを使用します。
$ message="message from aws cli."
$ phoneNumber="+8180XXXXXXXX"
$ senderId="classmethod"
$ aws sns publish \
--message ${message} \
--phone-number ${phoneNumber} \
--message-attributes \
'{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'
送信者IDがclassmethod
となったメッセージを受信できました。
制限に違反した値(英数字以外)を送信者IDに指定した場合はParameterValueInvalid
エラーとなりました。
$ senderId="クラスメソッド"
$ aws sns publish \
--message ${message} \
--phone-number ${phoneNumber} \
--message-attributes \
'{"AWS.SNS.SMS.SenderID":{"DataType":"String","StringValue":"'${senderId}'"}}'
An error occurred (ParameterValueInvalid) when calling the Publish operation: The senderID provided 'クラスメソッド' is not valid, it must be 1-11 alpha-numeric or hyphen (-) characters. It has to start and end with an alphanumeric character.
Node.js(Lambda関数)の場合
CDKコード
lib/aws-cdk-app-stack.ts
import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as lambdaNodejs from '@aws-cdk/aws-lambda-nodejs';
import * as iam from '@aws-cdk/aws-iam';
export class AwsCdkAppStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const sendSmsFunction = new lambdaNodejs.NodejsFunction(
this,
'sendSmsFunction',
{
functionName: 'send-sms-function',
entry: './src/lambda/handlers/send-sms-handler.ts',
handler: 'handler',
runtime: lambda.Runtime.NODEJS_14_X,
}
);
const snsTopicPolicy = new iam.PolicyStatement({
actions: ['sns:Publish'],
resources: ['*'],
});
sendSmsFunction.addToRolePolicy(snsTopicPolicy);
}
}
Lambdaコード
AWS CLIの場合と同様ですが、送信者IDの指定は、message-attributes
パラメータを使用します。
src/lambda/handlers/send-sms-handler.ts
import * as AWS from 'aws-sdk';
const MESSAGE = 'message from AWS SDK for JavaScript on lambda';
const SENDER_ID = 'classmethod';
const sns = new AWS.SNS({ apiVersion: '2010-03-31' });
interface Event {
phoneNumber: string;
}
export const handler = async (event: Event) => {
const publischParams: AWS.SNS.PublishInput = {
Message: MESSAGE,
PhoneNumber: event.phoneNumber,
MessageAttributes: {
'AWS.SNS.SMS.SenderID': {
DataType: 'String',
StringValue: SENDER_ID,
},
},
};
await sns.publish(publischParams).promise();
};
動作
作成したLambdaをイベントを指定して実行します。
{
"phoneNumber": "+81XXXXXXXXXX"
}
送信者IDがclassmethod
となったメッセージを受信できました。
まとめ
- Amazon SNSで送信するSMSでは送信者IDを指定可能
- 送信者IDを指定することにより、メッセージの送信者の区別やブランディングを行うことができる
- CLIやSDKでの送信者IDの指定は
MessageAttributes
を使って行う
参考
以上