[Amazon SNS] SMSのメッセージの送信者IDを指定してみた

2021.10.24

こんにちは、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を使って行う

参考

以上