AWS LambdaとAmazon SNSで引数に指定した電話番号にSMSを送信する(AWS CDK)後編

2021.10.23

こんにちは、CX事業本部 IoT事業部の若槻です。

前回のエントリでは、あらかじめ作成されたAmazon SNSトピックに対してLambda関数から下記の処理を行うことにより、指定の電話番号にSMSを送信しました。

  1. SNSサブスクリプション(送信先電話番号のSMS)の作成
  2. SNSトピックへのイベントの発行
  3. SNSサブスクリプション(送信先電話番号のSMS)の削除

しかし調べてみると、Amaozn SNSを使用してSMSを送信するためにSNSトピックとサブスクリプションの作成は不要ということが分かりました。

とりあえずAWS CLIで試してみます。

$ message="test"
$ phoneNumber="+8180XXXXXXXX"
$ aws sns publish --message ${message} --phone-number ${phoneNumber}

指定した番号にSMSがちゃんと届いちゃいますね!とんだ勘違いをしていました。

そこで「AWS LambdaとAmazon SNSで引数に指定した電話番号にSMSを送信する(AWS CDK)」の後編である本エントリでは、SNSトピックとサブスクリプションを作成せずに、SMS送信をする仕組みを作ってみます。

やってみた

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);
  }
}
  • 前回と異なりSNSトピックの作成は行っていません。
  • Lambdaに付与するIAMポリシーのアクションはsns:Publishを指定します。

Lambdaコード

src/lambda/handlers/send-sms-handler.ts

import * as AWS from 'aws-sdk';

const sns = new AWS.SNS({ apiVersion: '2010-03-31' });

interface Event {
  phoneNumber: string;
}

export const handler = async (event: Event) => {
  const publischParams = {
    Message: 'message',
    PhoneNumber: event.phoneNumber,
  };
  await sns.publish(publischParams).promise();
};
  • Amazon SNSのPublishのパラメータにはメッセージ内容と電話番号のみ指定しています。

動作確認

作成したLambdaをイベントを指定して実行します。

{
  "phoneNumber": "+81XXXXXXXXXX"
}

指定した番号にSMSがちゃんと届きました。

まとめ

  • AWSで指定の電話番号にSMSを送信したい場合は、Amazon SNSのpublishを使用してメッセージ内容と電話番号を指定すればOK。
  • Lambda関数でSDKを使用してSMS送信する場合は、関数にsns:Publishアクションの権限を付与すればOK。

以上