CDKを使ってSQSとそのメッセージを受信するLambdaを作成する方法

サンプル

参考

例 SQSと受信用Lambda

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as Lambda from "aws-cdk-lib/aws-lambda";
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
import { SqsEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';

export class SqsTestStack extends cdk.Stack {
  private sqs: sqs.Queue;

  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    this.sqs = this.createSqs();
    this.createLambda(this.sqs);
  }

  private createSqs() {
    return new sqs.Queue(this, 'SqsTestQueue', {
      visibilityTimeout: cdk.Duration.seconds(300)
    });
  }

  private createLambda(sqs: sqs.Queue) {
    const lambda = new NodejsFunction(this, 'ReceiverHandler', {
      functionName: 'ReceiverFunction',
      runtime: Lambda.Runtime.NODEJS_20_X,
      entry: 'src/lambda/receiver.ts',
      handler: 'handler',
      timeout: cdk.Duration.seconds(30),
    });
    lambda.addEventSource(
      new SqsEventSource(sqs, {
        batchSize: 1,
        maxConcurrency: 2,
      })
    )
  }
}
Lambdaの設定で赤色のところがSQSによる起動設定になります。

受信用Lambdaのソース

import { Handler,Context, SQSEvent } from 'aws-lambda';

export const handler: Handler = async (event: SQSEvent, context: Context) => {
  console.log('EVENT: \n' + JSON.stringify(event, null, 2));
  for (const record of event.Records) {
    try {
      const { body } = event.Records[0];
      if (!body) {
        console.log("Invalid body: %o", body);
        continue;
      }
      const json = JSON.parse(body);
      console.log("Received: %o", json);
        
    } catch (err) {
      console.log('Error: %o', err);
    }
  }
  console.log("Receiver finish");
};
この例では、SQSのメッセージがJSON形式の文字列である前提になっています。

テスト

サンプルをデプロイしたら、SQSのコンソール画面を開き作成したキューを選びます。 キューの画面の上部に「メッセージを送受信」ボタンありますので、そこをクリックします。 すると、以下のような画面が開くので、「メッセージ本文」にSQSに送る文字列を入力します。 この例ではLambdaがJSON形式の文字列を受け取るようになっているので、JSON形式の文字列を入力しています。 sql before sending

入力したらオレンジ色の「メッセージを送信」ボタンをクリックしてSQSにメッセージを送信します。 成功すると以下のようになります。 sql sent

SQSのメッセージでLambdaが正常に動作したかを確認するため、CloudWatchでログを確認します。

例 Lambdaの第一引数event

{
    "Records": [
        {
            "messageId": "abcd1234-ef56-gh78-ij90-klmnop123456",
            "receiptHandle": "XXXXXXXXXXXXXXXXXXXXXX.......................XXXXX",
            "body": "{ \"abc\": \"def\",\"status\":\"99\"}",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1721740107342",
                "SenderId": "ABCDEFGHIJKLMOPQ1234",
                "ApproximateFirstReceiveTimestamp": "1721740107350"
            },
            "messageAttributes": {},
            "md5OfBody": "7c12abe7789c8436962ffe05547ace8a",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:ap-northeast-1:123456789012:SqsTestStack-SqsTestQueue1A111B22-abcdef123456",
            "awsRegion": "ap-northeast-1"
        }
    ]
}
上記の例では、event.Records[0].bodyにSQSのメッセージが入っています。