カテゴリー
【AWS Lambda使い方ガイド】Lambdaのハンドラーに課金対象外の内部タイマーをひっそりと仕込んでみる
※ 当ページには【広告/PR】を含む場合があります。
2022/04/29
AWS Lambdaのハンドラ関数は受動的なイメージが持たれがちで、クライアント側から何かのリクエストをするまでは、アイドル状態のまま何も処理されずに待機したままだとと思われがちです。
実際には、
今回はあまり実用的な使い方ではないかも知れませんが、実験的な話としてAWS Lambdaに内部処理を行わせるためのハンドラの書き方を紹介します。
ちなみに今回の実行環境のターゲットは
AWS Lambdaへバックグラウンド処理を実装する
今回は再帰的なsetTimeout関数から定期的に実行されるタイマーをLambdaハンドラ内部に実装します。
以下がバックグラウンド処理を試す必要最低限のソースコードになります。
"use strict";
//👇タイマーIDインスタンスをグローバルで保持
let timerId;
exports.handler = async (event, context) => {
//👇最初のコール時にタイマー(10秒間隔)が処理を開始する
if (timerId == null) {
timerId = setTimeout(function tick() {
console.log('HELLO, TIMER');
timerId = setTimeout(tick, 10000);
}, 10000);
}
const response = { statusCode: 200, body: '' };
try {
response.body = 'HELLO, CLIENT';
return response;
} catch (error) {;
response.statusCode = 500;
response.body = `ERROR: ${error}`;
return response;
}
}
この関数をLambdaにデプロイすると、内部処理有りのLambdaハンドラが完成です。
なお、初回に何かリクエストすることで初期化され、タイマーが開始されます。
Lambdaの内部処理時間はホントに課金対象時間外?
AWS Lambdaの内部処理時間が料金体系上、どのように扱われるのか少しだけ掘り下げて考えてみましょう。
AWS Lambdaの利用でCPU処理時間で課金される料金体系ですので、クラウドを使う身として気になるのは、今回のようなAWS Lambdaで
結論からいうと、
公式のドキュメントの関連部分を抜粋すると、
...関数に対するリクエストの数とコードの実行時間に基づいて課金されます。
...呼び出しコールに応じて実行を開始するたびに、リクエストをカウントします。
実行時間は、コードの実行が開始された瞬間から、
その処理が返される、もしくは中止されるまでの時間で計算され、
値は 1 ミリ秒単位で切り上げられます。
料金は関数に割り当てたメモリ量により異なります。
AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定すると、
それに比例した CPU パワーとその他のリソースが割り当てられます。
メモリサイズが増えると、関数で利用可能な CPU にも同等の増加が発生します。
ということらしいので、クライアントからリクエストを受け、Lambdaからの処理結果を返すまでの時間に課金されることになります。
このため、クライアント側へレスポンスを返さないようなハンドラで閉じた内部処理には課金されることがないようです。
ただし、注意が必要なのは
結果、肝心のクライアントからのコールがリソース不足でコケてしまったり、課金される実行時間が無用に長くなってしまったりとするので、
例えば今回の定期タイマーを内部処理に挟んだ際のLambdaの実行ログですが、

見てのように、Lambdaで閉じたバックグラウンド処理は
Billed Duration(課金時間)
クライアントコールが開始されて、レスポンスが返し終わるまでの時間は全て課金されるようになっていることが分かります。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー