[CDK]TypeScriptを使って、SNS+SQS+Lambda構成を実装してみた

2023.09.27

こんにちは、稲葉です。

本記事では最近触る機会があった、SNS+SQS+Lambdaの3つのサービスを使用して、SNSメッセージを発行したら、SQSを経由してLambda関数を実行する構成をTypeScriptを使用してcdkで実装したいと思います。

Preparation

初めにTypeScriptを使用するためのcdkの開発環境を用意します。

以下のコマンドをターミナルで実行することで、TypeScriptで記述されたcdkのテンプレート環境が作成されます。

cdk init app --language typescript

以上で準備は完了です。

Stack

次にスタックの構成を変更していきたいと思います。

デフォルトではスタックの名前は、先ほどのコマンドを実行したディレクトリの名前になります。(本記事ではCdkSnsStack

import * as cdk from "aws-cdk-lib";
import { Runtime } from "aws-cdk-lib/aws-lambda";
import { SqsEventSource } from "aws-cdk-lib/aws-lambda-event-sources";
import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
import { Topic } from "aws-cdk-lib/aws-sns";
import { SqsSubscription } from "aws-cdk-lib/aws-sns-subscriptions";
import { Queue } from "aws-cdk-lib/aws-sqs";
import { Construct } from "constructs";

export class CdkSnsStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const topic = new Topic(this, "topic", {
      topicName: "testTopic",
    });

    const queue = new Queue(this, "queue", {
      queueName: "testQueue",
    });

    topic.addSubscription(new SqsSubscription(queue));

    const lambda = new NodejsFunction(this, "lambda", {
      entry: "handlers/test.ts",
      handler: "testHandler",
      runtime: Runtime.NODEJS_18_X,
    });

    lambda.addEventSource(new SqsEventSource(queue));
  }
}

Lambda Function

続いて、Lambda関数を定義していきます。

rootディレクトリhandlersフォルダーを作成して、その中にtest.tsを作成します。

import { SQSEvent, SQSHandler, SQSRecord } from "aws-lambda";

export const testHandler: SQSHandler = async (
  event: SQSEvent
): Promise<void> => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message: SQSRecord): Promise<any> {
  try {
    console.log(`Processed message ${message.body}`);
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}

練習なので、SQSをポーリングしているか、SNSメッセージが届いているかを確認する簡単なコードを書きました。

ここまでで、cdkの実装は終わりです。cdk deployして、実際に動くか確かめていきたいと思います。

cdk deploy

Test

設定がしっかりされているか確認します。

はじめにSNSのページに行き、先ほど作成したtestTopicを選択します。そうすると以下のようにサブスクリプションSQSが設定されているのが確認できると思います。

次にSQSに移動して、testQueueを選択します。こちらの方でもSNSサブスクリプションに設定されていることが確認できます。また、Lambda関数も設定されていることがわかります。

設定が確認できたので、SNSのtestTopicに戻り、「メッセージの発行」を押します。以下の内容でメッセージを発行します。

メッセージ発行が完了したら、CloudWatchに移動して、ロググループの中のスタック名-lambdaを選択します。(本記事ではCdkSnsStack-lambda

ログストリームの中にログがあると思うので、一番新しいものを選び中身を確認します。STARTの次のINFO Processed messageと書かれているメッセージを開きます。

 

SubjectにTestが入っており、MessageにはTEST sns messageが書かれていることから、SNSメッセージを受け取りLambda関数がしっかり実行されたことがわかります。

Summary

本記事ではSNSメッセージを発行、SQSを経由してLambda関数を実行する構成TypeScriptを使用してcdkで実装しました!

cdkやAWSサービス、TypeScriptはまだまだ初心者なので、これからも学習を続けていき、その過程で学んだことをこのように記事にしてアウトプットできればと思います。

最後まで、読んでくださり有難うございました。