aws-sdkを用いてAWS SNSにメッセージを送信する方法を解説します。
1. create
serverless create -t aws-nodejs-typescript -n send-sns-sample -p ./send-sns-sample
2. ymlファイルを作成
デフォルトのtsファイルではなく、ymlファイルに変更します。
理由は公式やその他serverlessに関する記事がymlを採用しているためです。
完成型を以下です。
要点のみ解説していきます。
serverless.yml
service: send-sns-sample
frameworkVersion: '2'
provider:
name: aws
runtime: nodejs14.x
region: ap-northeast-1
stage: ${opt:stage, self:custom.defaultStage}
deploymentBucket:
name: ${self:provider.stage}-serverless-deployment
profile: ${self:custom.profiles.${self:provider.stage}}
versionFunctions: false
logRetentionInDays: 60
plugins:
- serverless-webpack
custom:
defaultStage: dev
webpack:
webpackConfig: "./webpack.config.js"
includeModules: true
profiles:
dev: k.ikeura
stg: k.ikeura-staging
prd: k.ikeura-production
otherfile:
environment:
dev: ${file(./conf/dev.yml)}
stg: ${file(./conf/stg.yml)}
prd: ${file(./conf/prd.yml)}
functions:
index:
handler: src/handler.index
environment:
Topic_Arn: "${self:custom.otherfile.environment.${self:provider.stage}.Topic_Arn}"
resources:
Resources:
SNSTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: SNS Topic
TopicName: ${self:service}_topic
解説
- resources以下にSNSトピックの作成を定義しています。
- functions.index.environment.Topic_Arnに環境変数Topic_ArnにトピックのARNの値を持たせています。後述するコード部分で参照します。
- serverlessでの環境変数設定のベストプラクティスはクラスメソッドさんのこちらの記事が非常にわかりやすいです。
3. ソースコード
まずは完成したソースコードを載せ、要点を解説していきます。
sendMessage.ts
import * as AWS from 'aws-sdk'
import type { params, order } from 'types'
export const sendMessage = async (order:order) => {
const env = process.env
const SNS = new AWS.SNS({apiVersion: '2010-03-31', region: 'ap-northeast-1'});
const vendorCode: string = order.vendor_code
const stringOrder:string = JSON.stringify(order)
try {
const params: params = {
Message: stringOrder,
MessageAttributes: {
'vendor_code': {
DataType: 'String',
StringValue: vendorCode,
}
},
TopicArn: env.Topic_Arn
}
await SNS.publish(params).promise()
} catch (err) {
console.log(err)
}
}
解説の前にこの関数の仕様をざっくり説明します。
ショップの受注情報であるorderオブジェクトを受け取り、メッセージ属性vendor_codeにorder.vendorCodeを設定し、snsトピックにstringOrderを送信しています。
解説
-
const SNS = new AWS.SNS({apiVersion: '2010-03-31', region: 'ap-northeast-1'});
でaws-sdk.SNSを定義。- requireではなく、importすることをお勧めします。型やメソッドをエディタが参照してくれます。
- paramsを設定します。
- Message: 送信するメッセージの内容
- MessageAttributes: 今回はvendor_codeプロパティにorder.vendorCodeを設定している。
- Topic_Arn: 送信先のトピックARN
-
await SNS.publish(params).promise()
- publishメソッドを用いてトピックにメッセージを送信
3. テスト
確認する方法のみ記載します。
AWS CloudWatchのメトリクスからメッセージ受信件数を確認して、送信されたかどうか確認できます。
送信したメッセージを閲覧する方法はないのだろうか。。??🤔🤔🤔