![[Amazon SNS] SMSのメッセージの送信者IDを指定してみた](https://devio2023-media.developers.io/wp-content/uploads/2019/04/amazon-sns.png)
[Amazon SNS] SMSのメッセージの送信者IDを指定してみた
この記事は公開されてから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コード
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パラメータを使用します。
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を使って行う
参考
以上














