LambdaとAPI Gatewayを連携してみる。
・パラメータ付きのリクエストをAPI Gatewayが受け取り、Lambdaで受け取ったパラメータを処理し、結果を返すAPIのサンプルを作成してみた。
・今回はyear,month,dayの3つのパラメータを受け取って、「平日」か「祝日」かを判定する処理を作る。
・API Gatewayの種類は「Rest API」とする。
要件
入力:year, month, day(例えば 2025, 4, 4)
処理:指定された日付が 土日 or 日本の祝日 なら「休日」、それ以外は「平日」
出力:date:${year-month-day}、isHoliday(土日かどうか?): true | false
Lambdaで関数を作成
1. AWSコンソール画面でLambdaに遷移
2. 「関数の作成」を押下
3. 「一から作成」を選択し、関数名を記入。ここではNode.js 22.xを選択
4. 関数の作成ボタンを押下
5. コードの作成
コードはローカルPC上で作成したものを、zip形式でアップロードするやり方をとる。
※ローカルPCはmacを想定
npm init -y
npm install japanese-holidays
※平日か土日かを判定するライブラリに「japanese-holidays」を使ってみる。
上記ライブラリと同一階層に「index.js」を作成
const Holidays = require('japanese-holidays');
exports.handler = async (event) => {
const params = event.queryStringParameters || {};
const year = params.year;
const month = params.month;
const day = params.day;
if (!year || !month || !day) {
return {
statusCode: 400,
body: JSON.stringify({ error: "year, month, day パラメータが必要です。" })
};
}
const date = new Date(year, month - 1, day); // JSの月は0始まり
const dayOfWeek = date.getDay();
const isWeekend = (dayOfWeek === 0 || dayOfWeek === 6);
const holidayName = Holidays.isHoliday(date);
const isHoliday = isWeekend || holidayName !== undefined;
return {
statusCode: 200,
body: JSON.stringify({
date: `${year}-${month}-${day}`,
isHoliday: isHoliday,
reason: isWeekend ? "土日" : (holidayName || "平日")
})
};
};
上記一式をzipで固めて、Lambdaにアップロードする。
API Gateway側
1. AWSコンソール画面でAPI Gatewayに遷移。
2. 「APIを作成」ボタンを押下
3. APIタイプは「REST API」を選択し、構築ボタンを押下
APIの詳細画面に遷移するので、「新しいAPI」「任意のAPI名」を設定。その他はデフォルト設定で「APIを作成」ボタンを押下する。
4. 続いて「メソッドを作成」ボタンを押下。メソッドタイプをGETにし、「Lambda関数」を選択、Lambda関数は事前に作成していたLambda関数を選択する。その他はデフォルト設定で「メソッドを作成」ボタンを押下する。
6. 「APIをデプロイ」ボタンを押下
7. ステージを「新しいステージ」、ステージ名を「dev」に選択し、デプロイボタンを押下する。
動作確認
{"date":"2025-4-7","isHoliday":false,"reason":"平日"}
{"date":"2025-4-6","isHoliday":true,"reason":"土日"}
その他
リクエストがLambda関数には到達しているが、パラメータが受け取れずに原因が分からず、少しハマった。原因はAPI Gatewayの統合リクエスト設定の「Lambda プロキシ統合」をtrueにする必要があることだった。