LoginSignup
0
0

More than 3 years have passed since last update.

[ServerlessFramework]aws-sdkを用いてAWS SNSにメッセージを送信する

Posted at

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のメトリクスからメッセージ受信件数を確認して、送信されたかどうか確認できます。
送信したメッセージを閲覧する方法はないのだろうか。。??🤔🤔🤔

参考リンク

0
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
0
0