【AWS】LambdaとSNSでスマホにSMSを送る


概要

  • 電話番号でメッセージを送るSMSを使いたいなと思って調べてみたらAmazonSNSで実現できると分かったので試してみました
  • API Gateway - Lambda - SNS を連携させてAPI化させてみました
  • 当然ですが指定した電話番号に本当にSMSを送れてしまうので、悪用しない/されないようにご注意ください
  • ちなみに日本の場合は一通辺り$0.07451のようです

構成

  • 今回作る構成です

雛形生成

  • 今回はServerlessFrameworkを使います
  • Lambdaのコードだけ見たい人はスキップしてください
mkdir sms-sample
cd sms-sample
sls create -t aws-nodejs-typescript
npm i
  • 一式作成できました
tree -I node_modules
.
├── handler.ts
├── package-lock.json
├── package.json
├── serverless.yml
├── tsconfig.json
├── vscode
│   └── launch.json
└── webpack.config.js

Lambda関数の作成

  • AWS SDKを使うのでインストールしておきます
npm i -D aws-sdk
  • handler.tsを修正します
    • Lambda関数の中でSNSのpublishを呼んでSMSを送信します
    • 電話番号とメッセージはパラメータとして受け取ります
handler.ts
import { SNS } from 'aws-sdk';
import { APIGatewayProxyHandler } from 'aws-lambda';

const sns = new SNS();

export const sendSMS: APIGatewayProxyHandler = async event => {
  const body = JSON.parse(event.body);
  const { message, phoneNumber } = body;
  try {
    // 電話番号とメッセージを設定
    const params: SNS.Types.PublishInput = {
      // 先頭の0を削って+81をつける
      PhoneNumber: phoneNumber.replace(/^0*/, '+81'),
      Message: message,
    };
    // メッセージを送信
    await sns.publish(params).promise();
    return { statusCode: 200, body: 'success' };
  } catch (e) {
    console.log(e);
    return { statusCode: 500, body: JSON.stringify(e) };
  }
};

Serverless.ymlの設定

  • API Gatewayの設定やiamの設定などしていきます
serverless.yml
service:
  name: sms-sample
custom:
  webpack:
    webpackConfig: ./webpack.config.js
    includeModules: true
plugins:
  - serverless-webpack
provider:
  name: aws
  runtime: nodejs12.x
  region: ap-northeast-1
  apiGateway:
    minimumCompressionSize: 1024
  environment:
    AWS_NODEJS_CONNECTION_REUSE_ENABLED: 1
  # iamの設定
  iamRoleStatements:
    - Effect: Allow
      Action:
        - 'sns:Publish' # SNSのPublishの権限を付与
      Resource: '*'
functions:
  sendSMS:
    handler: handler.sendSMS
    # API Gatewayの設定(POST:/sendSMS)
    events:
      - http:
          method: post
          path: sendSMS

動作確認

  • デプロイします
sls deploy
  • エンドポイントにアクセスしてみます

  • ちゃんと届きました!

まとめ

  • 思ったよりも簡単にSMS送信を実現できました
  • ServerlessFrameworkでどこでもすぐに再現できるのがいいですね