2
1

More than 3 years have passed since last update.

serverlessでsqs+lambdaの構成

Last updated at Posted at 2021-01-13

ServerlessFrameworkでsqsとlambdaの構成を説明します。
sqsもServerlessの管理下に含めたい人におすすめな方法です。
serverlessのインストールは済んでいるものとします。

環境

serverless -v

Framework Core: 2.1.1
Plugin: 4.0.4
SDK: 2.3.2
Components: 3.1.3

node -v

v14.7.0

1. serverless create

今回はtypescriptを使用します。

serverless create -t aws-nodejs-typescript -n {プロジェクト名} -p {パス}

-tオプションはtemplateで使用する言語を選択します。
-nオプションはnameでプロジェクト名を指定します。
-pオプションはpathで作成するプロジェクトをどこにおくか指定します。

serverless create -t aws-nodejs-typescript -n sample -p ./sample

これでカレントディレクトリ直下にsampleというtypescriptプロジェクトを作成することができます。
僕は作成したいディレクトリまで移動してこの書き方をすることが多いです。

ls sample

すると

handler.ts        package.json      serverless.ts     tsconfig.json     webpack.config.js

こんな感じになっていたら成功です。

2. sqsからメッセージを受けれるよう変更

デフォルトではapiの仕様になっているため、lambda関数がsqsからのメッセージを受け取るように変更します。
変更前にnpmでもyarnでもいいですがライブラリのインストールも忘れずに。。

handler.tsの変更

handler.ts
import { SQSHandler } from 'aws-lambda';
import 'source-map-support/register';

export const hello: SQSHandler = async (event, _context) => {
  for (const record of event.Records) {
    console.log(record)
  }
}

sqsに複数同時にメッセージが送信された場合に処理ができるよう、for ofを使用して配列の処理ができるようにしています。

serverless.tsの変更

serverless.tsのresourceにsqsのもろもろの設定を書くことでsqsを作成することができます。

functionsの下に以下を追記します。

serverless.ts
resources: {
    Resources: {
      MyQueue: {
        Type: "AWS::SQS::Queue",
        Properties: {
          QueueName: "forQiitaQueue",
          DelaySeconds: 10,
          MessageRetentionPeriod: 300,
          ReceiveMessageWaitTimeSeconds: 5,
          VisibilityTimeout: 60,
        }
      }
    }
  }

propertiesの中身について順を追って説明します。
DelaySeconds:配信遅延
MessageRetentionPeriod:メッセージ保持期間
ReceiveMessageWaitTimeSeconds:メッセージ受信待機時間
VisibilityTimeout:デフォルトの可視性タイムアウト

いずれも秒数指定です。

functionのeventがapiの仕様のままなので消しておきましょう。

serverless.ts
functions: {
    hello: {
      handler: 'handler.hello',
      events: [
        {

        }
      ]
    }
  },

一旦これでdeployしてみましょう。

serverless deploy --profile {プロファイル名}

デプロイしたい環境のプロファイルを指定してください。

3. 確認・arnの指定

awsのコンソールでsqsの管理ページにアクセスして、sqsスクリーンショット 2021-01-13 11.21.10.png
を作成できたか確認しましょう。
作成できていたら、ARNをコピーしてください。
先程、消したfuctionのeventsの部分に必要です。
以下のようにeventsの部分を編集してください。

serverless.ts
functions: {
    hello: {
      handler: 'handler.hello',
      events: [
        {
          sqs: {
            arn: "コピーしたarn"
          }
        }
      ]
    }
  },

一旦これでokですが、本来であればarnをハードコードするのはよくないので環境変数などで参照するのがいいでしょう。
僕はclassmethodさんが解説しているこのやり方でいつもやっています。
https://dev.classmethod.jp/articles/serverless-framework-conf-change/

一旦はこれでokなのでまたデプロイしてみましょう。

4.確認!

sqsにメッセージを送信して、ログに出力されるか試してみましょう。
awsのコンソールから、sqsにメッセージを送信してみてください。

スクリーンショット 2021-01-13 11.21.10.png

awsのcloudwatchのログにbodyに"test"と入ったオブジェクトが出力されていれば成功です。

2
1
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
1