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形式の文字列を入力しています。
入力したらオレンジ色の「メッセージを送信」ボタンをクリックしてSQSにメッセージを送信します。 成功すると以下のようになります。
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のメッセージが入っています。