Lambda + EventBridgeのバッチ構成をAWS CDKで実装する

AWS

はじめに

AWS CDKのオープンソース拡張機能である、AWS Solutions Constructsなるものが提供されているので、それを利用します。これを使えば0→1で自分で記述しなくても、一般的なクラウドアーキテクチャパターンをすばやく実装できます。今回の場合、aws-eventbridge-lambdaがSTABLEで提供されているので、これを使います。

AWS Solutions Constructs - AWS Solutions Constructs
Overview

デプロイまでの流れ

Node.js・npm・TypeScript等はインストール済みの前提で進めます。

ステップ1:AWS CDKのインストール(必要に応じて)
npm install -g aws-cdk
ステップ2:環境のブーストラップ(必要に応じて)

以下を実行しないと、デプロイできません。以前に実行したことがある場合、この工程は割愛できます。

cdk bootstrap aws://{ACCOUNT-NUMBER}/{REGION}
ステップ3:アプリケーション構築

アプリケーションのディレクトリは既に構築済みの前提で進めます。ルートディレクトリで、以下のコマンドを実行します。

cdk init app --language typescript
ステップ4:AWS Solutions Constructs aws-eventbridge-lambdaモジュールのインストール
npm install @aws-solutions-constructs/aws-eventbridge-lambda
ステップ5:Lambda関数の作成

まず、ルートフォルダにlambdaフォルダを作成します(命名は任意)。そして、次のようなlambda/index.jsを作成します。

exports.handler = async function (event) {
  console.log("request:", JSON.stringify(event, null, 2));
  return {
    statusCode: 200,
    headers: { "Content-Type": "text/plain" },
    body: `Hello, AWS Solutions Constructs! You've hit ${event.path}\n`,
  };
};
ステップ6:AppとStackのコード実装

bin・lib配下にある、AppとStackのコードを記述します。デフォルトだとファイル名が、それぞれ、
・{ルートディレクトリ名}.ts
・{ルートディレクトリ名}-stack.tsとなっているかと思います。

bin/xxx.ts
#!/usr/bin/env node
import "source-map-support/register";
import * as cdk from "aws-cdk-lib";
import { EventbridgeLambdaStack } from "../lib/eventbridge-lambda-stack";

const app = new cdk.App();
new EventbridgeLambdaStack(app, "EventbridgeLambdaStack", {});
lib/xxx-stack.ts
import * as cdk from "aws-cdk-lib";
import { Construct } from "constructs";
import { Stack, StackProps, Duration } from "aws-cdk-lib";
import { EventbridgeToLambdaProps, EventbridgeToLambda } from "@aws-solutions-constructs/aws-eventbridge-lambda";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as events from "aws-cdk-lib/aws-events";

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

    const constructProps: EventbridgeToLambdaProps = {
      lambdaFunctionProps: {
        code: lambda.Code.fromAsset(`lambda`),
        runtime: lambda.Runtime.NODEJS_16_X,
        handler: "index.handler",
      },
      eventRuleProps: {
        schedule: events.Schedule.rate(Duration.minutes(5)),
      },
    };

    new EventbridgeToLambda(this, "test-eventbridge-lambda", constructProps);
  }
}
ステップ7:生成されるCloudFormationテンプレートの確認

以下のコマンドで、生成されるCloudFormationテンプレートの確認をします。

npm run build
cdk synth
ステップ8:スタックのデプロイ

デプロイ時に、IAMステートメントに関する変更内容の確認があります。

Do you wish to deploy these changes (y/n)?

例えば、「EventBridgeからLambdaを呼び出すためのアクセス許可が付与されたりするけどいい?」といったようなものです。この警告で、最小権限の原則から逸脱していないか確認し問題なければデプロイします。

cdk deploy

CloudFormationのコンソールでもデプロイが完了したことが確認できました。また、5分おきにLambda関数が実行されていることもログから確認できました。

今回は時間間隔指定で実行させていますが、cron形式でも指定可能です。Stackのコード内のeventRuleProps.scheduleに指定する値を以下のようにすればcron形式でトリガーされるEventBridgeルールになります。

events.Schedule.expression('cron(0 9 * * ? *)')

おわりに

応用として、この記事で作成した最低構成を活用してOpenAI APIのBatch APIに投げて、レスポンスをDynamoDBに保存して…といったようなことができないか模索中です。上手く実装できそうであれば、また記事にします。ここまで読んでいただき、ありがとうございました。

コメント

タイトルとURLをコピーしました