Lambdaってどんな時に使うの？利用シーンをいくつか紹介　～AWS100本ノック～ 4/100

# はじめに

本記事ではLambdaをどんな利用シーンで使うか、ケース毎にいくつか紹介します。
※具体的に作ったり、詳細な機能の説明はしませんがご了承ください

Lambdaの機能については、[こちら](https://qiita.com/namasa/items/3a0d703565643f364133)で紹介しています。

# サーバーレスAPIを作りたい

これが一番Lambdaのユースケースとして多いと思っています。
APIのバックエンドとして、EC2やECSも候補にあがると思いますがこれらは常時稼働することになります。

なので、リクエスト数がそこまで多くない場合などは無駄にコストがかかってしまいます。
そこで、利用した時間だけ課金されるLambdaを利用することによって、コスト効率が高まります。
Well-Architected Frameworkの`コスト最適化`ですかね:thinking: 

DBの候補として3つ書いてありますが、RDBである必要性やリクエスト数などによって、いずれかを選択することになると思います

![学ぶべきこと-サーバーレスAPI.drawio (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/e80e3d79-7ef6-1180-829f-d7af5e16c7be.png)

# アップロードした画像ファイルのサムネイルを作りたい

アップロードした画像のサイズ変更などを行い、サムナイル画像を作りたい場合です。

S3へのアップロードをトリガーにLambda関数を実行し、作成したサムネイル画像をS3に保存するやり方です

![学ぶべきこと-ファイル加工.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/829431ae-a2a8-9ee0-0aa5-fb3a87c5a146.png)


# ユーザに近い場所（ロケーション）で処理を実行し、パフォーマンスを向上したい

Lambda@Edgeを利用します。`Lambda@Edge = CloudFront + Lambdaのセット`になります。

通常のLambdaは、関数を作成する際に指定したリージョンで実行されますが、Lambda@Edgeを利用することによって、ユーザに近い場所でコードを実行できます。


ユースケースは公式で紹介されていますが、以下のようにオリジン(ECSやEC2など)の負荷を減らすために使われたりします
なお、Lambda関数は必ず`バージニア北部リージョン`に作成する必要があります。

- リクエスト/レスポンスのヘッダーの変更、カスタムヘッダーの追加
- リダイレクト
- JWTなどによる認証
- A/Bテスト

![学ぶべきこと-Lambda＠Edge.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/33cee395-0958-0eb6-33fa-b50a5450b0e0.png)

Lambda関数は、以下の4つのタイミングで実行するように設定できます。(公式より)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/aad7546d-d573-7afd-353a-357add4d899f.png)

:::note warn
普通のLambda関数は15分まで実行できますが、Lambda@Edgeの場合は、Viewerの処理で5秒、Originの処理で30秒と短いです
:::

:::note info
高速に関数を実行できるCloudFront FunctionsというCloudFrontの機能もあります。違いについてはクラスメソッドさんの[こちら](https://dev.classmethod.jp/articles/amazon-cloudfront-functions-release/)の記事がわかりやすいです
:::


# バッチ処理を行いたい

バッチ処理を行いたいとなった場合、EC2やECSが候補にあがると思いますが、Lambda関数でもバッチを作成することが可能です。

EventBridge Schedulerで設定した時間にLambda処理を実行する形です。
![学ぶべきこと-バッチ.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/a166cf7e-caa3-f395-463d-f986380533d0.png)

:::note info
Lambdaの制約上、15分までしか処理できないのでそれ以上かかる処理を行う場合は、EC2やEC2の検討が必要です。

また、1つの操作だけで済む簡単な処理(例：EC2を決まった時間に起動/停止)であれば、`EventBridge Scheduler`だけで実現可能です
:::


# WebSocketでPush通知を行いたい

チャットのような相互にメッセージを送信するWebSocket APIをAPI Gateway + Lambdaで実現できます。
EC2ではなく、バックエンドにLambdaを利用することでスケールやコストの面で優れています。

いくつかLambda関数を作る必要がありますが、詳細は[公式のチュートリアル](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/websocket-api-chat-app.html)をご確認ください

![学ぶべきこと-Push通知(WebSocket).drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/4edbd74f-bee8-77c0-7857-d36e4ed2430e.png)


# リクエストの流入制御を行いたい

最初は利用者が少ないため問題なかったが、利用者が多くなると、Lambda関数だけでは捌ききれなくなる可能性があります。
そうした場合に、SQSなどを挟むことで以下のようなことが行えます

- 一度、SQSにため込んで順次処理していくことでリクエストのスロットリングエラーを回避できる
- 一度、SQSやKinesis Streamを挟みLambdaから取りに行く(ポーリング)ことで、今までは1リクエストで1つの関を実行だったが、複数のリクエストで1つの関数実行にすることができ、処理効率が上がる

![学ぶべきこと-流入制御.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/bd01f28d-84a8-115e-fbbb-9480413d9860.png)


# 何かしらのイベントで処理を実行したい

任意のAWSリソースやパートナーのイベントをトリガーにLambdaを実行できます

![学ぶべきこと-AWSイベントトリガー.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7682c503-d8e2-371a-8a4b-2fb459251508.png)


# ワークフローを構築したい

一連の処理のワークフロー(例：決済処理)を作る際にStepFunctionsでワークフローを作成し、そのバックエンドにLambdaを利用することで簡単に構築できます

![学ぶべきこと-ワークフロー.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/a401e49b-dd17-86d2-cadb-e66d8557fd5d.png)

# IoT機器から送信されるデータのバックエンドを作りたい

IoT機器から上がってくる位置情報やセンサーデータなどのバックエンドに、Lambdaを利用できます

![学ぶべきこと-IoTバックエンド.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/7a4ea234-6564-814b-a721-f40f5831b26a.png)



# ログを集約し、検索できるようにしたい

ログを出漁くする場所としてCloudWatchLogsを使うことになると思いますが、複数のログを検索・分析したい場合にCloudWatchLogsだと不便なケースがありす。

そこで、Kinesis Fireshoseにログを流し、一定量(一定時間 or 一定サイズ)溜まったらS3にファイルを吐き出し、Athenaなどでクエリ検索することで簡単に分析が可能です。

Lambdaはこの場合だと作成しなくてもいいのですが、Kinesis Firehoseにため込んでいる際に実行でき、任意の形式に加工することが出来ます

![学ぶべきこと-ログ集約.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/f02f5b9a-3274-353b-9265-18f46dfc01e0.png)



# 認証処理をバックエンドから切り離したい

認証処理をバックエンドのEC2、ECS、Lambdaなどで行うことも多いですが、バックエンドの負荷軽減のため認証処理を切り離したいことがあると思います。

その際に、API GatewayにLambdaオーソライーザーとしてLambda関数を設定し、任意の認証処理を実装することで認証が必要なAPIリクエスト時に実行出来ます。
それによって、認証エラーの場合はバックエンドにリクエストが行かないようにすることが出来ます

![学ぶべきこと-Lambdaオーソライザー.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/cbc46872-ad2e-0ad0-026d-ed10a663238c.png)



# 新しいAWSサービスがCloudFormationサポートされていない...

新規のAWSサービスや、既存のAWSサービスの新機能に関しては、CloudFormationでサポートされるまでに時間がかかる場合や、サポートされない場合があります。

そういった場合に、CloudFormationのスタック作成/更新/削除時に、任意のLambda関数を実行するように設定できます。

![学ぶべきこと-カスタムリソース.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87924/09c13f6b-7c6c-10a2-e73a-0c5a2fe0839d.png)




# おわりに

今回はLambdaの利用シーンについて紹介しました。
これからLambdaを使ったアプリケーションを構築する参考になれば幸いです:bow: