
AWS Lambdaで定期実行処理してみる
こんにちは、お久しぶりです。
定期的な処理を実行する際には、Lambdaを使用することがあります。Lambdaでは、特定の間隔で定期的に実行するトリガーを設定することができます。
ただし、Lambdaは最大で15分までの実行時間制限がありますので、15分以上かかるような重い処理を行う場合はLambdaでは適していません。
そのような場合は別の手段を検討する必要があります。
今回は、Serverless Frameworkを使用してLambdaとCloudWatchスケジュールによる定期実行処理を構築する方法を紹介します。
Serverless Frameworkを使用すると、AWSコンソールからLambda関数を構築するよりも簡単にデプロイや管理が行えます。
それでは、Serverless Frameworkを使ってLambda関数を構築してみましょう。
1.Serverless Frameworkを使う
インストールとプロジェクト作成は適宜行ってください。
今回のサンプルでは、microCMSからデータをフェッチしてコンソールにログ出力するだけの定期実行処理を作成してみたいと思います。
まず、serverless.ymlファイルにLambda関数を定期実行する設定を追加します。
eventsセクションの中に、scheduleオブジェクトを追加し、実行間隔をrateプロパティに記述します。
# serverless.yml
functions:
# fetchするLambda関数
fetch:
handler: handler.fetch
name: fetch
events:
- schedule:
description: fetch scheduled job.
rate: rate(1 minute)
enabled: true
rateの記述では、1分ごと、10分ごと、1時間ごとなど、単数形と複数形で書き方が異なることに注意しましょう。
rateやcronを使用して実行間隔を指定する方法についての詳細な記述方法については、Serverless Frameworkのドキュメントを参照してください。
LambdaからCloudWatchイベントのスケジュール実行を行うためには、ロールにCloudWatchへのアクセス権限を与える必要があります。
provider:
name: aws
runtime: nodejs12.x
stage: ${opt:stage, self:custom.defaultStage}
region: ap-northeast-1
profile: ${self:custom.profiles.${self:provider.stage}}
iamRoleStatements:
- Effect: Allow
Action:
- lambda:*
- cloudwatch:*
- logs:*
Resource:
- '*'
次に、実際のLambda関数の処理を記述していきましょう。
import { Context, APIGatewayEvent, APIGatewayProxyResult } from "aws-lambda";
import { client } from "functions/microcms";
export async function fetch(event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> {
// SDKを使用していますがfetch処理しているだけです。
const contents = await client.get({
endpoint: "products",
queries: {
fields: "id,title,description",
}
});
console.log(contents);
console.log(event);
return {
statusCode: 200,
body: JSON.stringify({
message: "fetch done.",
event
}),
};
}
これでLambdaのCloudWatchスケジュール実行の構築は完了です。
AWSのコンソールからCloudWatchのログを確認すると、Lambda内の処理でconsole.logした内容がログに出力されていることが確認できます。
たったの5分で定期実行処理を作成し、デプロイまで完了しました。
それでは。