【AWS】用語を整理しながら学ぶAWS AWS Lambda

## はじめに

この記事では AWSが提供するAWS Lambda(以下、Lambda)を学習していく記事です。主な内容としては実践したときのメモを中心に書きます。（忘れやすいことなど）
誤りなどがあれば書き直していく予定です。

## Lambdaとは

簡単に1行で表現すると
`サーバーやクラスターについて検討することなくコードを実行`と表現されています。

公式では以下のように説明されています。

> AWS Lambda は、サーバーレスでイベント駆動型のコンピューティングサービスであり、サーバーのプロビジョニングや管理をすることなく、事実上あらゆるタイプのアプリケーションやバックエンドサービスのコードを実行することができます。200 以上の AWS のサービスやサービス型ソフトウェア (SaaS) アプリケーションから Lambda をトリガーすることができ、使用した分だけお支払いいただきます。

[参考](https://aws.amazon.com/jp/lambda/)

Lambdaは`re:Invent 2014`で発表された革新的なコンピューティングサービスです。

イベント駆動型で事前にサーバやクラスターを用意することなく、サーバレスでコンピューティングを実行します。Lambdaは200以上あるサービスと連携することが可能であり、使用した分だけ料金がかかります。

イベント駆動型？サーバレス？200 以上の AWS のサービスやサービス型ソフトウェア (SaaS) アプリケーションから Lambda をトリガー？

何もわからないですね。では一つ一つ見ていきましょう。

## イベント駆動型とは

簡単に説明するとリクエストがあった時に動作するということになりますが、特徴的な部分としては
`何かしら事象をトリガーにして動作する`というところです。

デスクトップやWebブラウザ上でアプリケーションを開発したことがある人はピンとくるかもしれません。例えば、`マウスでボタンをクリックした時にアクションを起こす`という実装は典型的なイベント駆動型のアクションです。

しかし、クラウド上にマウスはありませんので解釈を変える必要があります。
クラウドの場合は他のサービスから発生するイベントをイベント駆動の起点とします。

なお、イベント駆動に利用されるイベントを`イベントソース`と呼びます。

### イベント駆動の実装例

少し抽象的なのでわかりやすくしたいと思います。以前作成したクラウドインフラでちょうど良いものがありましたので紹介します。

以下の例ではLINEアプリから写真を受け取り、写真を分析してLINEアプリに返す例です。
※記事内ではLINE アプリを`LINE bot`と表記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527543/217627bf-b44a-d4d1-570e-4395aec71de6.png)

[（引用）貴様の幸せ度合いを数えろ ～ハピネススカウターを実際に作ってみた～](https://qiita.com/ymd65536/items/f1d50596cdd1d76d1c7b)

構成図の中に`写真を加工するタイミングでS3バケットに画像を保存している`瞬間があります。S3バケットに画像を保存すると`PUTイベント`が発生します。

この`PUTイベント`をイベントソースにしてLambdaを実行します。イベントソースの情報は起動したLambdaに入力として与えられ、Lambdaのコード内で利用できます。

構成図ではイベントで起動したLambdaからAmazon Rekognitionを起動して表情分析を実行しています。

## サーバレス（Serverless）とは

イベント駆動型についてなんとなく理解ができたと思います。しかし、イベント駆動型はいつイベントが発生するか予想ができないため、イベントが来たタイミングでコンピューティングリソースを待機させる必要があります。

そこでサーバレスという考え方が登場します。そもそも小さな作業、小さなコードを実行するために大きなインスタンスを起動する必要はありません。Lambdaでは起動時にMicro VMを瞬間的に起動してコードを実行します。

つまり、サーバを管理することなくイベント駆動を実現できます。
サーバレスというのは細かく見ていくとさまざまな定義がありますが、最初の理解では`サーバを管理することがない`という理解で問題ありません。

### 補足：Firecrackerという革新的な仮想化機能

Lambdaを支える技術として`Firecracker`という革新的な仮想化機能(KVM)があります。
Firecrackerはサーバーレスコンピューティングのための軽量な仮想化機能であり、Lambdaの中心を支える技術です。

軽量のマイクロ仮想マシン（microVM）を数秒で起動することができるため、必要な時にサーバを呼び出せます。

[Firecracker – サーバーレスコンピューティングのための軽量な仮想化機能](https://aws.amazon.com/jp/blogs/news/firecracker-lightweight-virtualization-for-serverless-computing/)

## さまざまなAWSサービスからLambdaをトリガー

前述の構成図にもある通り、S3+Lambda以外にもサービス連携ができます。
種類はさまざまですのでここでは個人的によく見る組み合わせを3つ紹介

- API Gateway + Lambda
- Kinesis Data Streams + Lambda
- Event Bridge + Lambda

Lambdaには`function URL`という機能があるため、API GatewayがなくてもWebAPIとして機能します。ですが、APIを複数管理する予定がある場合はAPI Gatewayの利用は必須となるでしょう。

なお、API Gatewayを利用するかどうかはその時のアーキテクチャ次第になりますので設計の際にはよく吟味しましょう。

### 補足：Lambda@Edge

同じLambdaと呼ばれるもので`Lambda@Edge`というAmazon CloudFrontの機能があります。
Lambda@EdgeはLambdaとは関係のないサービスです。
ただし、サーバを管理する必要がない点やイベント駆動である部分はLambdaと同じ性質を持ちます。

[参考 - Lambda@Edge](https://aws.amazon.com/jp/lambda/edge/)

## 利用時の注意点

ここまででイベントを用意しておけば、とりあえず実行できるサービスであることが理解できたと思います。しかしながら、とても便利な反面、注意点がありますので見ていきましょう。

### VPC内のサービスにアクセスする時はENIが必要

LambdaがVPCリソースにアクセスするためには、同じVPCかそのリソースにつながるVPCに所属する必要があります。Lambdaはサーバレスであるため、基本的にIPアドレスを持っていません。
厳密には決まったENIを所有していません。

VPCリソースにアクセスするにはそのVPCに所属しているENIを通してLambdaを実行する必要があります。

[VPC によるプライベートネットワーク](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/foundation-networking.html)

なお、LambdaからVPCにアクセスするケースでは`Lambda Hyperplane ENI`を利用できます。

### イベント駆動による無限ループ

一般的なプログラムでも無限ループに陥ることがありますが、Lambdaではそれ以外にもイベント駆動によるループがあります。

具体例

1. S3バケットにCSVを格納
2. 発火したイベンとをイベントソースにしてLambdaでCSVを加工
3. 加工したCSVを元のS3バケットに格納

上記のような場合は工程の3番目が終わった後に2番に戻り、処理が実行されます。
つまり、永遠と処理が実行され続けるため、Lambdaの実行が完了しません。

Lambdaの無限ループは対策方法がAWSからアナウンスされているため、無限ループする可能性
がある場合は対策をしておくか、ソフトウェアの設計を見直しましょう。

[Detecting and stopping recursive loops in AWS Lambda functions](https://aws.amazon.com/jp/blogs/compute/detecting-and-stopping-recursive-loops-in-aws-lambda-functions/)

## 料金

利用時の注意点まで理解できましたので料金を見ていきましょう。
主に以下の要素で決まります。

- ランタイムを実行するアーキテクチャ
    - x86/arm64
- 利用期間
    - GB/秒
- リクエスト数
    - 100万あたりのリクエスト
- メモリ
- 利用リージョン

[料金](https://aws.amazon.com/jp/lambda/pricing/)

### ランタイムとは

プログラムを実行する時に必要な基盤、PythonスクリプトだったらPythonです。

### アーキテクチャとは

クラウドなので意識の外に出てしまいがちですが、いわゆるどの設計かという意味です。
どんなコンピューティングでも基盤の上で動作します。それはLambdaも例外ではありません。

Lambdaではx86アーキテクチャもしくはarm64アーキテクチャのどちらかの基盤で動作します。

なお、コンテナイメージを使ったLambdaデプロイの際はアーキテクチャに合致した適切なコンテナイメージを選定する必要があるので注意しましょう。

`プログラムを実行するアーキテクチャの実行基盤（想定されるもの）`と`Lambdaのアーキテクチャ`が異なるとランタイムエラーが発生して動作しません。

## まとめ

AWSが提供するサーバレスサービス、AWS Lambdaを見ていきました。
概念的な部分にまでフォーカスしていくと`FaaS`の話にまで発展しますが、今回は基礎的な部分と利用時の注意点をチェックしました。

とても優秀なサービスである反面、さまざまなサービスと組み合わせて利用するので他のサービスの知識も必要となります。

## 参考

[AWS Lambda – Run Code in the Cloud](https://aws.amazon.com/jp/blogs/aws/run-code-cloud/)

## おわり