2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-02

概要

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

構成

  • 今回作る構成です
スクリーンショット 2020-06-03 0.02.25.png

雛形生成

  • 今回は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
  • エンドポイントにアクセスしてみます
スクリーンショット 2020-06-03 0.24.26.png
  • ちゃんと届きました!

Screenshot_20200603-002459.png

まとめ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?