Lambda
Overview
イベントの発生に応じてプログラムを実行する(AWSが提供するイベントドリブンなプログラム)環境を提供する、クラウドコンピューティングサービス。
マルチAZ構成もできる。
Lambdaを採用する方針
- 非同期な通信処理
- イベント駆動で処理をするサービスにはLambdaを採用する。
- 同期的な通信処理
- APIなどを提供するサービスにはECSを採用する。
Lambdaを採用する例文
すでにユーザー数が増加してアプリケーション全体のパフォーマンスが劣化していることに加えて、アプリケーションの運用業務の比率も高まっています。 また開発期間が長くなることも懸念しています。さらに、今後もユーザー数、そして購入数が増えることを考えたときに、領収書を作る機能をSampleBookStoreの中心的な機能から切り離すことにより、負荷の軽減ができると考えました。要件として購入と同期的に実行する必要がなく、「なるべく早く」で十分な点もポイントです。筆者自身の実体験としても、購入後にすぐ領収書が必要だとしても数分間は待てますし、場合によっては月末の経費精算時にまとめてダウンロードすることもあります。また、セール時期など、大量に購入が行われる時期には領収書を作る機能にもより負荷がかかります。こういった背景から、非同期処理として実装することが望ましいと考えました
Lambdaコスト
- functionに対する合計リクエスト数 リクエスト数は、Amazon SNSやAmazon EventBridgeなどのイベント通知ト リガーや、Amazon API Gateway、AWSコンソールからのテスト呼び出しを含むAWS SDKなどのAPIコールに応じて実行を開始するたびに、リクエストをカウントする。
- functionの合計実行時間 実行時間は、コードの実行が開始された瞬間からその処理が返される、もしくは中止されるまでの時間で計算され、値は1ミリ秒単位で切り上げられる。 また単位課金額はLambda関数に当てられたメモリー量により異なる。 Lambdaのリソースモデルでは、利用者が関数に必要なメモリー量を指定すると、それに比例したCPUパワー(x86とArm)とその他のリソースが割り当てられる。
毎月100万リクエストまで無料
Lambda パフォーマンスチューニング
-
コールドスタートの解決 Lambdaを定期実行する方法があるが、これは根本的に解決にならない。
メモリ量を上げてもコールドスタートの起動時間は解決されない。 -
依存ライブラリを減らす 外部モジュールの展開は非常にコストが高い。
依存ライブラリを減らすことでコールドスタート時のオーバーヘッドを改善できる。
Lambdaの制限
- 並行実行 1ユーザーが1000リクエストをほぼ同時に送った場合、AWS Lambdaは理論的には1000の異なるコンテナインスタンスを立ち上げることができる。 これにより、各リクエストが並行して高速に処理されることが保証される。
- 同時実行数の制限 AWS Lambdaには同時実行数の制限がある。 デフォルトのリージョンあたりのリミットは1000だが、これはリクエストすることで増やすことができる。
- スロットリング 上記の同時実行数の制限に達した場合、Lambdaは新しい関数の実行リクエストをスロットル(一時制限)する可能性がある
- Lambda容量制限 zip圧縮後50MB zip圧縮前250MB また、Lambda deployに関してコンテナイメージのサポートが導入されておりその場合は10GBで良いとのこと。
Lambda コールドスタート
これまでの常識は間違っていた?!Lambdaのコールドスタート対策にはメモリ割り当てを減らすという選択肢が有効に働く場面も
参考URL
- コールドスタート 最初のリクエストや、長時間アイドル状態だった後のリクエストでは、新しいコンテナを立ち上げるためレイテンシが少し高くなる。 この状態を「コールドスタート」と呼ぶ。
- ウォームスタート 関数が続けて呼び出される場合、前回の実行のためにすでに起動しているコンテナを再利用される可能性がある。
グローバルな環境で変数を設定すると再利用される可能性がある。 これはAWS Lambdaには関数実行時に実行環境として起動したコンテナをある程度の期間再利用する動作仕様(ウォームスタート)があり、それに伴い/tmpディレクトリ上のデータも次回の処理で再利用される動作となる。
// 以下で始まるところに変数を宣言した方が良い得策
// グローバルに変数を定義するとウォームスタートで利用される可能性がある。
// 再利用される時間と可能性はブラックボックス
const global = new Date();
exports.handler = async (event) => {}
const local = new Date();
console.log(global); // global は再利用されるため時間が更新されない
console.log(local); // localは逐一時間が更新される
Lambdaに合わないアーキテクチャー
コスト効率の悪いLambdaアプリケーションの性質に関する考察
Lambda関数の呼び出しパターン
Lambda関数には同期呼び出し・非同期呼び出し・イベントソースマッピングの3つの呼び出しパターンがある。
同期呼び出し
Lambdaが呼び出されたら、コードが実行されすぐにレスポンスが戻ってくる呼び出し方法。
実行するクライアントサイドとLambda処理するサーバーサイドが同じタイミングで同期している。
以下のパターンが同期呼び出しとなる。
- AWS SDK
- AWS CLI
- ALB
- API Gateway
- テストイベントを使用した方法
非同期呼び出し
呼び出してもすぐにはLambda関数を実行せずに実行結果もすぐには返ってこない呼び出し方法。
実行するタイミングと、Lambda処理するタイミングが異なるものは非同期呼び出しになる。
同期呼び出しと比べれば並列処理ができるという特徴があり、1回の実行ごとにレスポンスを待つ必要がないため、一度にたくさんの画像処理が行える。
Lambdaと連携して非同期実行が行えるサービスは以下の通り。
- S3
- Amazon SNS
- Amazon SES
- CloudFormation
- CloudWatch Logs
- EventBridge
- CodeCommit
- AWS Config
イベントソースマッピング
イベントソースのマッピングは、イベントソースからデータを読み取り、Lambda関数を呼び出すLambdaリソースのことを指します。イベントソースマッピングは、直接Lambda関数を呼び出さないサービスのキューまたはストリームから項目を処理するときに使用できます。
Lambda 並列起動(同期・非同期)・再利用の動作検証
AWS Lambda+Node.jsのコンテナ並列起動(同期・非同期)・コンテナ再利用の動作検証
- Lambdaは1実行で1プロセスを占有する。
- 同期処理を実行しても他のLambda(プロセス)実行に影響しない。
- 非同期処理を実行しても実行中のLambda(プロセス)で他のLambda実行が処理されることはない。
- コンテナ同時実行数の上限に達すると実行中のコンテナが終了されるまで特定回数リトライされる。
- コンテナ実行後、一定時間内に同じ関数を再実行するとコンテナが再利用される。
- Lambda実行毎にプロセスが完全に分離しているため、コンテナ再利用+グローバル変数を変化させるコードを書いても問題なし。
Lambda Function URLs
2022年4月にLambda Function URLsの機能がサポートされた。
Lambda関数を他のAWSサービスと連携せずに、単純にHTTP(S)リクエストで使用したいケースがある。
その場合、従来はAPI Gateway経由でLambda関数を実行する必要があった。
Lambda Function URLsを利用することで、API Gatewayを経由せずに、専用のエンドポイントURLにHTTPリクエストするだけでLambda関数を実行できるようになった。
Lambdaをパブリックに公開したり、シンプルな認証でも問題ない場合は、Lambda関数URLは便利。
Lambdaのセキュリティ
Lambdaの落とし穴 - 脆弱なライブラリによる危険性とセキュリティ対策
LambdaにはEIP(Elastic IP)を割り当てられない
Lambdaが実行されるところ
Lambda関数は常にLambdaサービスが所有するVPC内で実行される
LambdaはこのVPCにネットワークアクセスとセキュリティルールを適用し、VPCを自動的に維持および監視します。