概要
- 電話番号でメッセージを送る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でどこでもすぐに再現できるのがいいですね