さっくり解説するAWS Lambda

# はじめに
私自身、業務でかれこれ3年ほどAWS Lambdaを触っていますが、
自身の復習も兼ねて、
少し用語が多く難しいかもしれませんが、初心者にもなるべく分かりやすく解説してみようと思います。

# AWS Lambdaとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/a55bb5ac-40fb-d44b-a00d-506d8b8acd1b.png)


公式ドキュメントによると、

>Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。Lambda は可用性の高いコンピューティングインフラストラクチャでコードを実行し、コンピューティングリソースの管理をすべて担当します。これにはサーバーおよびオペレーティングシステムのメンテナンス、容量のプロビジョニングおよびオートスケーリング、コードのモニタリングおよびログ記録などが含まれます。Lambda を使用すると、実質どのようなタイプのアプリケーションやバックエンドサービスに対してもコードを実行できます。必要なのは、Lambda がサポートするいずれかの言語でコードを指定することだけです。

AWS Lambda（以下、Lambda）はサーバレスと言われています。
そう聞くと、あたかもサーバ自体が存在しないかの様に思えてしまいますが、
実際にサーバが無いというわけではなく、実行基盤はAWS側で管理されます。

例えば[Amazon EC2](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)は、起動直後はOSがインストールされているだけで、各種ミドルウェアなどの様々な環境構築が必要となりますが、
Lambdaの様なFaaSを利用すれば、サーバ構築せずともプログラムを作成しすぐに実行するということができます。


ちなみにFaaS（Function as a Service）とは、
サーバレスでアプリケーション開発ができるクラウドサービスのことです。

:::note info
Lambdaはサーバ構築せずとも、コーディングしたプログラムをすぐに実行することができる。
イベント駆動型のプログラム実行環境である。
:::


# Lambdaの特徴

## サポート言語

Lambdaは、ランタイムの使用によって複数の言語をサポートしており、
2022年1月現在は、Node.js、Python、Java、Ruby、C#、Go、PowerShellといった有名どころはサポートされています。

ただ、サポートされていない言語は使えないかというと実はそういうこともなく、
カスタムランタイムという機能を利用することで、どの言語でも利用できるようになっています。


[詳しい言語やバージョンはこちら](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html)

:::note info
カスタムランタイムで実質どんな言語でも利用可能。
:::


ただし参考文献などの兼ね合いもあったりするので、余程のことがなければ無難にサポート言語を使うで良いかと思います。


## Lambda Layers

共通のロジックやライブラリに関しては、[Lambda Layer](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)としてパッケージ化(zipファイルアーカイブ)して、複数のLambda関数で共有することができます。

![Layers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392337/d2043c8e-2ebc-8107-0183-4d32ebce942a.jpeg)

:::note warn
一つのLambda関数には最大5つまでのLayerを紐付けることができる。
Lambda関数とLayerの解凍後の合計サイズが250MB以下となる必要がある。
:::


Layerも同様にカスタムランタイムを使えば、サポートされていない言語で作成することも可能です。

作成から紐付けは、こちらで解説してます。



https://qiita.com/shimajiri/items/e0e41f2c7a8ac99f3253



## オートスケーリング
Lambdaは必要なときだけコードを実行し、リクエスト受信の回数に合わせて自動的にスケールします。
オートスケールによって、イベントの頻度が増えても安定した高いパフォーマンスが維持できます。

スパイクなリクエストが来た場合、スケーリングが追いつかずにスロットリングに引っかかってしまう場合がありますが、
Provisioned Concurrencyを設定することで、スパイクなリクエストにも対応できます。

[Lambda 関数のスケーリングについて](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-scaling.html)

## ステートレス
Lambdaは、時間のかかるデプロイや設定によって遅れが出ることなく必要な数だけインスタンスを実行できます。

:::note warn
ステートレスなので、データを永続化するのであれば、S3（ストレージ）や、DynamoDBなどと連携し保存する必要がある。
:::

## DB連携
NoSQLの[Amazon DynamoDB](https://aws.amazon.com/jp/dynamodb/)や[Amazon RDS](https://aws.amazon.com/jp/rds/)も連携可能です。

LambdaからRDSへのアクセスは、今までアンチパターンと言われていましたが、
[Amazon RDS Proxy](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.html)のおかげで実用的になりました。


## タイムアウト
2022年1月時点で、タイムアウトの時間が最大15分です。


https://aws.amazon.com/jp/blogs/news/aws-lambda-timeout-15min/


ちなみにLambdaと[API Gateway](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/welcome.html)を連携させて、REST APIを作成する場合、
API Gateway側のタイムアウトは29秒なので、注意が必要です。

## 料金
>AWS Lambda はプロビジョニングや管理を行うことなく、コードを実行できるサーバーレスのコンピューティングサービスです。ワークロードを考慮したクラスタースケーリングロジックの作成、イベント統合の維持、ランタイムの管理を容易に行うことができます。Lambda を使用すれば、実質どのようなタイプのアプリケーションやバックエンドサービスでも管理を必要とせずに実行でき、使った分だけお支払いいただけます。関数に対するリクエストの数とコードの実行時間に基づいて課金されます。

>実行時間は、コードの実行が開始された瞬間から、その処理が返される、もしくは中止されるまでの時間で計算され、値は 1 ミリ秒単位で切り上げられます*。料金は関数に割り当てたメモリ量により異なります。AWS Lambda のリソースモデルでは、お客様が関数に必要なメモリ量を指定すると、それに比例した CPU パワーとその他のリソースが割り当てられます。メモリサイズが増えると、関数で利用可能な CPU にも同等の増加が発生します。詳細については、関数の設定に関するドキュメントをご参照ください。

:::note info
つまり、Lambda関数のリクエスト数と、メモリサイズに応じた実行時間の従量課金制となる。
:::


1ヶ月あたり100万リクエスト、および400,000GB秒のコンピューティング時間の実行時間が無料枠として存在します。

[詳しい料金はこちらがとても参考になりました](https://qiita.com/Keisuke69/items/e3f79b50b6039175401b)


## まとめ
様々なフィードバックの改善が行われてきた結果、
私の所感ですが、Lambda自体はかなり使いやすくなってきたのではと感じています。

それに伴い、今後もサーバレスの普及はまだまだ続きそうな気がしており、
ベンダーとのやりとりでも、サーバレスを検討しているとの話をいただくことも少しづつ増えてきた印象です。

初心者の方は、少しでも参考になれば幸いです。


## 参考
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

https://qiita.com/Keisuke69/items/e3f79b50b6039175401b

## こちらもどうぞ
https://qiita.com/shimajiri/items/01ab61a08b58c2cb8acf

https://qiita.com/shimajiri/items/2fb424629d9ddb9c9ef1