Lambdaとは

#AWS Lambda とは
> AWS Lambda はサーバーをプロビジョニングしたり管理する必要なくコードを実行できるコンピューティングサービスです。

##関数の AWS Lambda 管理
> AWS Lambda API またはコンソールを使用して Lambda 関数の設定を行います。「基本的な関数設定」には、Lambda コンソールで関数を作成するときに指定する説明、ロール、およびランタイムが含まれています。関数の作成後にその他の設定を行ったり、API を使用してハンドラー名、メモリ割り当て、セキュリティグループなどの内容を作成時に設定したりすることができます。

> 関数コードの外でシークレットを保持するには、関数の設定にシークレットを保存し、初期化時に実行環境から読み取ることができます。環境変数は、保管時に必ず暗号化されます。また、クライアント側でも暗号化できます。外部リソースの接続文字列、パスワード、エンドポイントを削除することにより、環境変数を使用して、関数コードを移植可能にすることができます。

> バージョンとエイリアスは、関数のデプロイおよび呼び出しを管理するために作成できるセカンダリリソースです。関数の各種バージョンを発行してそのコードおよび設定を、変更できない別個のリソースとして保存し、特定のバージョンを参照するエイリアスを作成します。その後、関数エイリアスを呼び出すようクライアントを設定し、クライアントを更新するのではなく、クライアントが新しいバージョンをポイントするようにするときにエイリアスを更新します。

> ライブラリやその他の依存関係を関数に追加する際、デプロイパッケージを作成してアップロードすると、開発に遅延が生じる可能性があります。レイヤーを使用して関数の依存関係を個別に管理し、デプロイパッケージを小さく保ちます。レイヤーを使用して、独自のライブラリを他の顧客と共有したり、公開されているレイヤーを自分の関数で使用することもできます。

> Amazon VPC の AWS リソースで Lambda 関数を使用するには、セキュリティグループとサブネットを使用して設定し、VPC 接続を作成します。関数を VPC に接続すると、リレーショナルデータベースやキャッシュなどのプライベートサブネットのリソースにアクセスできます。MySQL および Aurora DB インスタンスのデータベースプロキシを作成することもできます。データベースプロキシを使用すると、データベース接続を使い果たすことなく、関数の同時実行レベルを上げることができます。

##AWS Lambda 関数の呼び出し
> Lambda 関数を Lambda コンソール、Lambda API、AWS SDK、AWS CLI、AWS ツールキットで直接呼び出すことができます。他の AWS のサービスを設定して関数を呼び出したり、ストリームまたはキューから読み取るように Lambda を設定して関数を呼び出すこともできます。

> 関数を呼び出す際は、同期的に呼び出すか非同期的に呼び出すかを選択できます。同期呼び出しでは、イベントを処理する関数を待ってレスポンスを返します。非同期呼び出しでは、Lambda は処理のためにイベントをキューに入れ、すぐにレスポンスを返します。非同期呼び出しでは、Lambda によって再試行が行われるため、呼び出しレコードが送信先に送信される場合があります。

> 関数を使用してデータを自動的に処理するには、1 つ以上のトリガーを追加します。トリガーとは、Lambda リソース、つまりライフサイクルイベント、外部リクエスト、またはスケジュールに応答して関数を呼び出すように設定する別のサービスのリソースのことです。関数は複数のトリガーを持つことができます。各トリガーは、関数を独立して呼び出すクライアントとして機能します。Lambda により関数に渡される各イベントには、1 つのクライアントまたはトリガからのデータしかありません。

> ストリームまたはキューから項目を処理するには、イベントソースマッピングを作成することができます。イベントソースマッピングは、Amazon SQS キュー、Amazon Kinesis ストリーム、または Amazon DynamoDB ストリームから項目を読み取り、バッチで関数に送信する Lambda のリソースです。関数が処理する各イベントには、数百または数千の項目を含めることができます。

> 他の AWS サービスやリソースは、関数を直接呼び出します。たとえば、タイマーで関数を呼び出すように CloudWatch イベント を設定したり、オブジェクトが作成されたときに関数を呼び出すように Amazon S3 を設定したりできます。各サービスにおいて、関数の呼び出しに使用するメソッド、イベントの構造、および構成方法が異なります。詳細については、「他のサービスで AWS Lambda を使用する」を参照してください。

> 誰が関数を呼び出すか、どのように呼び出されるかによって、スケーリングの動作や発生する可能性のあるエラーの種類が異なります。関数を同期的に呼び出すと、エラーがレスポンスで返され、再試行できます。非同期的に呼び出したり、イベントソースマッピングを使用したり、別のサービスを構成して関数を呼び出す場合、要件を再試行し、多数のイベントを処理するために関数をスケーリングする方法は異なります。詳細については、「AWS Lambda 関数スケーリング」および「エラー処理と AWS Lambda での自動再試行」を参照してください。

###同期呼び出し
> 関数を同期的に呼び出すと、Lambda は関数を実行し、レスポンスを待ちます。関数の実行が終了すると、Lambda は、実行された関数のバージョンなどの追加データとともに、関数のコードからのレスポンスを返します。

<img width="393" alt="スクリーンショット 2020-05-20 12.25.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/40953167-d49a-5ccc-ecd6-7e6876c58761.png">

### 非同期呼び出し

> Amazon Simple Storage Service (Amazon S3) や Amazon Simple Notification Service (Amazon SNS) など、AWS のいくつかのサービスでは、関数を非同期的に呼び出してイベントを処理します。関数を非同期的に呼び出す場合は、関数コードからのレスポンスを待機しません。イベントを Lambda に渡すと、Lambda が残りを処理します。Lambda でエラーを処理する方法を設定し、呼び出しレコードをダウンストリームのリソースに送信して、アプリケーションのコンポーネントを連鎖させることができます。

<img width="607" alt="スクリーンショット 2020-05-20 12.26.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/11c23b0c-24df-3f12-2519-ae0e6107ee20.png">

まずは一読
AWS Lambda関数を非同期で呼ぶ場合の動きを改めて確める
https://qiita.com/horit0123/items/295f8dc55d8c07e6512a

###AWS Lambda イベントソースマッピング
> イベントソースのマッピングは、イベントソースからを読み取り、Lambda 関数を呼び出す AWS Lambda リソースのことを指します。イベントソースマッピングは、直接 Lambda 関数を呼び出さないサービスのキューまたはストリームから項目を処理するときに使用することができます。

* Amazon Kinesis
* Amazon DynamoDB
* Amazon Simple Queue Service

> イベントソースのマッピングは、イベントソースの項目の読み取りや管理のために、関数の実行ロールのアクセス権限を使用します。アクセス権限やイベント構造、設定、ポーリングの動作はイベントソースによって異なります。

<img width="642" alt="スクリーンショット 2020-05-20 12.52.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/c9bf2b1d-74d6-c475-9c08-e92b29bc2916.png">

* AWS LambdaがSQSをイベントソースとしてサポートしました！
* 
https://dev.classmethod.jp/articles/aws-lambda-support-sqs-event-source/
現在はFIFOも対応していました。

###AWS Lambda アプリケーション

AWS Lambdaのアプリケーション作成を使ってCI/CDパイプラインを一気に構築
https://qiita.com/shonansurvivors/items/b223fbb362aed3c1c536

###Lambda 関数のローリングデプロイ
> ローリングデプロイを使用して、Lambda 関数の新しいバージョンの導入に伴うリスクを制御します。ローリングデプロイでは、システムは関数の新しいバージョンを自動的にデプロイし、徐々に増加するトラフィックを新しいバージョンに送信します。

###一般的な Lambda アプリケーションの種類とユースケース

####例 1: Amazon S3 プッシュイベントと Lambda 関数の呼び出し
<img width="486" alt="スクリーンショット 2020-05-20 13.56.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/fc2206af-6aed-ec1a-69e6-739f8b784fae.png">

#### 例 2: AWS Lambda での Kinesis ストリームからのイベント取り出しと Lambda 関数呼び出し

<img width="556" alt="スクリーンショット 2020-05-20 13.57.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/28e7e55d-cc8e-cc91-49e1-03299c8782cd.png">

###AWS Lambda 関数を使用する際のベストプラクティス
* Lambda ハンドラーをコアロジックから分離
* 実行コンテキストの再利用を活用して関数のパフォーマンスを向上

> 関数ハンドラー外で SDK クライアントとデータベース接続を初期化し、静的なアセットを /tmp ディレクトリにローカルにキャッシュ

* 環境変数を使用して、オペレーショナルパラメータを関数に
* 関数のデプロイパッケージの依存関係を制御
* デプロイパッケージのサイズをランタイムに必要な最小限のサイズに
* Java で記述されたデプロイパッケージを Lambda で解凍する所要時間を短縮
* 依存関係の複雑さを最小限に抑えます。
* Lambda 関数内で、任意の条件が満たされるまでその関数自身を自動的に呼び出すような再帰的なコードを使用しない

##他のサービスで AWS Lambda を使用する

**Lambda がイベントを読み取るサービス**
> キューまたはデータストリームを生成するサービスの場合は、Lambda でイベントソースマッピングを作成し、他のサービスにアクセスするためのアクセス権限を実行ロールで Lambda に付与します。Lambda は、他のサービスのデータを読み込み、イベントを作成して、関数を呼び出します。

* Amazon Kinesis
* Amazon DynamoDB
* Amazon Simple Queue Service


**同期で呼び出すサービス**


> その他のサービスでは、関数を直接呼び出します。関数のリソースベースのポリシーで他のサービスのアクセス許可を付与してから、イベントを生成し、関数を呼び出すように他のサービスを設定します。サービスに応じて、同期呼び出しまたは非同期呼び出しになります。同期呼び出しの場合、その他のサービスは、関数のレスポンスを待機するため、エラーの再試行を行う場合があります。

* ALB
* Amazon Cognito
* Amazon Lex
* Amazon Alexa
* Amazon API Gateway
* Amazon CloudFront (Lambda@Edge)
* Amazon Kinesis Data Firehose
* AWS Step Functions
* Amazon Simple Storage Service Batch


**非同期で呼び出すサービス**

> 非同期呼び出しの場合、Lambda は、関数に渡す前にイベントをキューに入れます。イベントがキューに入ると、成功のレスポンスがもう一方のサービスに送信されるため、その後何が起こるのかは分かりません。エラーが発生した場合は、Lambda によって再試行が行われるため、設定したデッドレターキューに失敗したイベントが送信される場合があります。

* Amazon Simple Storage Service
* Amazon Simple Notification Service
* Amazon Simple Email Service
* AWS CloudFormation
* Amazon CloudWatch Logs
* Amazon CloudWatch Events
* AWS CodeCommit
* AWS Config
* AWS IoT
* AWS IoT Events
* AWS CodePipeline

##ALB
> Lambda 関数を使用して、Application Load Balancer からのリクエストを処理することができます。Elastic Load Balancing では、Application Load Balancer のターゲットとして Lambda 関数をサポートしています。パス、またはその他のヘッダー値に基づき、ロードバランサールールを使用して、HTTP リクエストを関数にルーティングします。リクエストを処理して、HTTP レスポンスを Lambda 関数に返します。

##Alexa で AWS Lambda を使用する
> Lambda 関数を使用して Amazon Echo の音声アシスタントである Alexa に新しいスキルを与えるサービスをビルドできます。Alexa Skills Kit は、Lambda 関数として実行している独自のサービスを使用して、新しいスキルを作成するための API、ツール、およびドキュメントを提供します。Amazon Echo ユーザーは、Alexa に質問やリクエストを行うことで、これらの新しいスキルにアクセスできます。

##AWS Lambda を Amazon API Gateway に使用する

> Amazon API Gateway を使用して、Lambda 関数の HTTP エンドポイントを持つウェブ API を作成できます。API Gateway は、HTTP リクエストを Lambda 関数にルーティングするウェブ API を作成および文書化するためのツールを提供します。認証および承認のコントロールにより、API へのアクセスを保護できます。API は、インターネット経由でトラフィックを処理することも、VPC 内でのみアクセス可能にすることもできます。

##AWS Lambda を AWS CloudTrail に使用する

> AWS CloudTrail は、ユーザー、ロール、または AWS サービスによって実行されたアクションを記録するサービスです。CloudTrail は API コールをイベントとしてキャプチャします。AWS アカウントのイベントの継続的な記録については、証跡を作成します。証跡により、CloudTrail はイベントのログファイルを Amazon S3 バケットに配信できます。

> Amazon S3 のバケット通知機能を利用して、Amazon S3 がオブジェクト作成イベントを AWS Lambda に発行するように指示できます。CloudTrail が S3 バケットにログを書き込むごとに、Amazon S3 は Amazon S3 のオブジェクト作成イベントをパラメーターとして Lambda 関数を呼び出すことができます。その S3 イベントでは、CloudTrail で作成されたログオブジェクトのバケット名とキー名などの情報が提供されます。Lambda 関数のコードで、ログオブジェクトを読み取り、CloudTrail でログ記録されたアクセスレコードを処理できます。たとえば、アカウントで特定の API 呼び出しが行われた場合に通知するための Lambda 関数のコードを記述できます。

> このシナリオでは、CloudTrail によって S3 バケットにアクセスログが書き込まれます。AWS Lambda については Amazon S3 がイベントソースであるため、Amazon S3 が AWS Lambda にイベントを発行して Lambda 関数を呼び出します。

##AWS Lambda を Amazon CloudWatch Events に使用する
> Amazon CloudWatch イベントは、AWS リソースの状態変化への対応に役立ちます。リソースの状態が変化すると、自動的にイベントがイベントストリームに送信されます。選択したイベントをストリーム内で照合し、AWS Lambda 関数にルーティングしてアクションを実行するためのルールを作成できます。たとえば、AWS Lambda 関数を自動的に呼び出し、EC2 インスタンスまたは AutoScaling グループの状態を記録することができます。

> CloudWatch イベント は、ソースからのイベントをラッピングするイベントドキュメントを使用して、関数を非同期に呼び出します。次の例は、Amazon Relational Database Service のデータベーススナップショットから発生したイベントを示しています。


##AWS Lambda を Amazon CloudWatch Logs に使用する
> Lambda 関数を使用して、Amazon CloudWatch Logs ログストリームのログをモニタリングして分析することができます。ログが作成されたとき、またはログがオプションのパターンに一致した場合に関数が呼び出されるように、1 つ以上のストリームのサブスクリプションを作成します。この関数を使用して通知を送信したり、ログをデータベースまたはストレージに保存したりします。

##AWS Lambda を AWS CloudFormation に使用する
> AWS CloudFormation テンプレートでは、Lambda 関数をカスタムリソースのターゲットとして指定できます。パラメータの処理にカスタムリソースを使用したり、設定値を取得したり、スタックのライフサイクルイベント中に他の AWS のサービスを呼び出します。

##CloudFront Lambda@Edge での AWS Lambda の使用
> Lambda@Edge では、Node.js および Python の Lambda 関数を実行して CloudFront が発信するコンテンツをカスタマイズし、ビューワーに近い AWS 地域でこの関数を実行できます。この関数は、プロビジョニングや管理の必要なく、CloudFront イベントに応答を実行します。Lambda 関数を使用して、次の時点で CloudFront リクエストとレスポンスを変更できます。


> Lambda@Edge を使用すると、さまざまなソリューションを構築できます。

* A/B テスト用に、異なるバージョンのサイトに URL を書き換えるために Cookie を検査します。
* リクエストを送信したデバイスに関する情報が含まれている、User-Agent ヘッダーに基づいてユーザーにさまざまなオブジェクトを送信します。たとえば、ユーザーのデバイスに応じて、さまざまな解像度のイメージをユーザーに送信できます。
* ヘッダーまたは認証トークンを検査し、対応するヘッダーを挿入して、リクエストをオリジンに転送する前にアクセス制御を有効にします。
* ヘッダーの追加、削除、変更、および URL パスの書き換えを行い、キャッシュの異なるオブジェクトにユーザーをダイレクトします。
* 未認証ユーザーをログインページにリダイレクトしたり、エッジから直に静的ウェブページを作成して配信したりといったことを行う新しい HTTP レスポンスを生成します。

##AWS Lambda を AWS CodeCommit に使用する

> AWS CodeCommit リポジトリのトリガーを作成して、リポジトリのイベントから Lambda 関数を呼び出すことができます。たとえば、ブランチまたはタグが作成されたときや既存のブランチに対してプッシュが行われたときに、Lambda 関数を呼び出すことができます。


##AWS Lambda を AWS CodePipeline で使用する
> AWS CodePipeline は、AWS で実行されるアプリケーション用に継続的な配信パイプラインを作成できるサービスです。Lambda アプリケーションをデプロイするパイプラインを作成できます。また、パイプラインの実行時にタスクを実行する Lambda 関数を呼び出すようにパイプラインを設定することもできます。Lambda コンソールで Lambda アプリケーションを作成すると、Lambda によってソース、ビルド、デプロイのステージを含むパイプラインが作成されます。

##AWS Lambda を Amazon Cognito に使用する
> Amazon Cognito イベント機能では、Amazon Cognito におけるイベントへの応答として Lambda 関数を実行できます。たとえば、データセットが同期されるたびに発行される同期トリガーイベントに対して Lambda 関数を呼び出すことができます。

##AWS Lambda を AWS Config に使用する
> AWS Lambda 関数を使用して、AWS リソースの設定が独自の設定ルールに従っているかどうかを評価できます。リソースが作成、削除、変更されると、AWS Config はこれらの変更を記録し、Lambda 関数に情報を送信します。Lambda 関数は変更を評価し、結果を AWS Config に報告します。その後、AWS Config を使用してリソース全体のコンプライアンスを評価できます。どのリソースが不適合であり、どの設定属性が不適合の原因であるかを知ることができます。

##AWS Lambda を Amazon DynamoDB に使用する
> AWS Lambda 関数を使用して、Amazon DynamoDB ストリームのレコードを処理できます。DynamoDB ストリーム では、Lambda 関数を使用して、DynamoDB テーブルが更新されるたびに追加の作業を実行することができます。

Lambda は、ストリームからレコードを読み取り、ストリームレコードを含むイベントを使用して関数を同期的に呼び出します。Lambda は、バッチ単位でレコードを読み取り、関数を呼び出してバッチからレコードを処理します。

##AWS Lambda を Amazon DynamoDB に使用する
> AWS Lambda 関数を使用して、Amazon DynamoDB ストリームのレコードを処理できます。DynamoDB ストリーム では、Lambda 関数を使用して、DynamoDB テーブルが更新されるたびに追加の作業を実行することができます。

Lambda は、ストリームからレコードを読み取り、ストリームレコードを含むイベントを使用して関数を同期的に呼び出します。Lambda は、バッチ単位でレコードを読み取り、関数を呼び出してバッチからレコードを処理します。

##AWS Lambda を Amazon Kinesis に使用する
> AWS Lambda 関数を使用して、Amazon Kinesis データストリームのレコードを処理できます。Kinesis では、多くのソースからデータを収集し、複数のコンシューマーで処理することができます。Lambda では、標準データストリームイテレーターおよび HTTP/2 ストリームコンシューマーがサポートされています。

Lambda は、データストリームからレコードを読み取り、ストリームレコードを含むイベントを使用して関数を同期的に呼び出します。Lambda は、バッチのレコードを読み取り、関数を呼び出してバッチからレコードを処理します。

##AWS Lambda を Amazon Kinesis Data Firehose に使用する
> Amazon Kinesis Data Firehose は、ストリーミングデータをダウンストリーミングサービス (例: Kinesis Data Analytics または Amazon S3) にキャプチャ、変換、またはロードします。Lambda 関数を作成して、データがダウンストリームに送信される前に、カスタマイズされた処理を追加でリクエストできます。

##AWS Lambda を Amazon Lex に使用する

> Amazon Lex を使用して、会話ボットをアプリケーションに統合できます。Amazon Lex ボットには、ユーザーとの会話型インターフェイスが用意されています。Amazon Lex では、Lambda との統合が事前に構築されています。これにより、Lambda 関数を Amazon Lex ボットで使用できます。

##AWS Lambda を Amazon RDS に使用する
> AWS Lambda を使用して、Amazon Relational Database Service (Amazon RDS) データベースからのイベント通知を処理できます。Amazon RDS により Amazon Simple Notification Service (Amazon SNS) に通知が送信されます。この通知は、Lambda 関数の呼び出すために設定できます。Amazon SNS は、Amazon RDS からのメッセージを独自のイベントドキュメントにまとめて関数に送信します。

##Amazon S3 イベントでの AWS Lambda の使用
> Lambda を使用して Amazon Simple Storage Service からのイベント通知を処理できます。Amazon S3 は、オブジェクトの作成時や削除時にイベントをLambda 関数に送信できます。バケットの通知設定を構成し、関数のリソースベースのアクセス許可ポリシーで関数を呼び出すためのアクセス許可を Amazon S3 に付与します。

> Lambda 関数で使用するバケットが、その関数をトリガーするのと同じバケットである場合、関数はループで実行される可能性があります。たとえば、オブジェクトがアップロードされるたびにバケットで関数をトリガーし、その関数によってオブジェクトがバケットにアップロードされると、その関数によって間接的にその関数自体がトリガーされます。これを回避するには、2 つのバケットを使用するか、受信オブジェクトで使用されるプレフィックスにのみ適用されるようにトリガーを設定します。

##AWS Lambda を Amazon SES に使用する
> Amazon SES を使用してメッセージを受信する場合、メッセージが到着すると Lambda 関数を呼び出すように Amazon SESを設定できます。次に、受信 E メールイベント (実際には Amazon SNS イベントの Amazon SES メッセージ) をパラメータとして渡すことで、サービスによって Lambda 関数を呼び出すことができます。

##AWS Lambda を Amazon SNS に使用する

> Lambda 関数を使用して、Amazon Simple Notification Service 通知を処理することができます。Amazon SNS は、トピックに送信されるメッセージのターゲットとして Lambda 関数をサポートしています。関数は、同じアカウントまたは他の AWS アカウントのトピックにサブスクライブできます。

Amazon SNS は、メッセージやメタデータが含まれたイベントを使用して、関数を非同期的に呼び出します。

##AWS Lambda を Amazon SQS に使用する
> AWS Lambda 関数を使用して、Amazon Simple Queue Service (Amazon SQS) キュー内のメッセージを処理できます。Lambda イベントソースマッピングは、標準キューと FIFO (先入れ先出し) キューをサポートしています。Amazon SQS を使用すると、タスクをキューに送信して非同期的に処理することで、アプリケーションの 1 つのコンポーネントからタスクを任せることができます。

Lambda はキューをポーリングして、キューのメッセージを含むイベントで関数を同期的に呼び出します。Lambda はメッセージをバッチで読み取り、バッチごとに関数を呼び出します。関数が正常にバッチを処理すると、Lambda はキューからそのメッセージを削除します。以下の例では、2 つのメッセージのバッチのイベントを示しています。


#参考文献
* AWS Lambda とは
    * https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html