【Lambda講座6】同期呼び出し / 非同期呼び出し / イベントソースマッピング【9:42】

API Gateway、SQS、Kinesisについて、この時点で詳しく理解する必要はありません。
また、この時点では3種類の呼び出し方があり、エラー時の振る舞いが異なる点があると理解できれば十分です。

関連サービスについて、余裕がある方はこちらの講座を先行して視聴してみてください。
SQS:SQS / 疎結合設計 / 標準、FIFOキュー / デッドレターキュー / 遅延キュー / ショート、ロングポーリング【8:35】
API Gateway:API Gateway概要 / APIとは? / デプロイタイプ / リクエスト,レスポンス構造 / キャッシュ / 使用量プランと APIキー / スロットリング【14:22】
Kinesis:Kinesis / Data Streams / Data Firehose / Data Analytics / Video Streams / KPLとKCL / 試験問題の構成例

■イベントソースマッピングの説明(AWS公式マニュアル)
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-eventsourcemapping.html

■Understanding the Different Ways to Invoke Lambda Functions
https://aws.amazon.com/jp/blogs/architecture/understanding-the-different-ways-to-invoke-lambda-functions/

0:00 同期呼び出し
 Lambdaを呼び出したらLambdaが実行してすぐさま応答が戻ってくる。
 実行するクライアントサイドとLambdaが処理するサーバーサイドが同じタイミングで同期している。レスポンスのの内容はLambda関数にセットしておきます。
 タイプ・サービスについて、SDK/CLIやALB・API Gateway、テストボタンを押して実行したものなどは同期呼び出しになります。API Gatewayが間に入っていた場合でもユーザーはAPI Gatewayを呼び出してAPI GatewayがLambdaを代理で呼び出す。そしてクライアントはレスポンスを受け取る。エラーが発生した場合の特徴・クライアント側で対処が必要になります。対処とはリトライしたりバックアップしたりなどLambdaはエラーとなった場合何も振るわ回らないということになります。

02:00 非同期呼び出し
 呼び出したらすぐにはLambda実行せずに実行結果もすぐには返ってこない。
すでにハンズオンで実施しているS3とLambdaを連携したものが非同期呼び出しのパターンになります。S3とLambdaのイベント通知を詳しく見ていきます。
Lambdaのサービスの領域とLambda関数を分けて考えるとわかりやすいです。
Lambdaサービスの中にEvent Queueというものが間に挟まります。S3へアップロードした際にイベント通知がEvent Queueで受け取り後にEvent Queueに入っているイベントを読み込んでLambdaが処理をします。実行するタイミングとLambdaが処理するタイミングが
ずれているものが非同期呼び出しになります。コードを実行しエラーが起こったときリトライするのが特徴です。設定によって変更できますが2回実行します。
最大試行回数・・・リトライする回数、最大イベント経過時間・・・未処理のイベントをキューにに保持する最大時間のことです。
非同期呼び出しでの注意点として冪等性を担保すること。
冪等性とは何度実行しても同じ結果になること。失敗した場合処理途中のデータをすべて捨て去って最初からやり直すことでリトライを何度しても最終的には正しい状態になるこれが冪等性の一つです。リトライをした分cloudwatchにログが残る回数分残ります。最大試行回数分実行してそれでも失敗する場合はDLQ(デットレターキュー)が発行されます。SQSかSNSにセットされてどのような内容か後ほど確認ができます。DLQを発行する為のロールをアタッチする必要があるため気をつけましょう。同期呼び出しと比べると並列処理ができること。1回1回レスポンスを待つ必要がないため一気に1000の画像処理をするなどが行えます。対象のサービスとしてS3、SNS、SES、CloudFormation、CloudWatch logs,Event、CodeCommit、AWS configがあります。

05:00 イベントソースマッピング
イベントソースから読み取ってLambda関数を呼び出す。AWS Lambdaのリソースの事を言います。赤枠のEvent source mappingとありますがLambdaの1つのリソースでこれを理解することが大切になります。この例ですとKinesisがイベントソースとなってデータをやり取りしているのがわかると思います。イベントソースからデータをポーリング(取得)してデータを返してもらう。例だとSource batchを受け取ります。連携するサービスはKinesis、DynamoDB Streams(DynamoDBのテーブルに対する項目の追加変更削除の変化があった場合イベントとして検知ができるサービス)、SQSがあります。イベントソースとしてはストリームス型かキュー型の2つに別れます。イベントソースと実際のLambda関数の間にEvent source mappingリソースが挟まっておりKinesisをポーリングしにいってEvent batchを受け取ります。Event batchとは複数のイベントがひとまとまりになった単位のことです。5つのイベントがあったとして一つにしてEvent batchとして受け取ります。受け取れるbatchの数はサービスによって異なります。Event sourceからEvent batchをうけとり実際の処理をするLambda関数にEvent batchを渡してLambda関数を起動する動きとなります。Failed-event-destinationとありますが日本語では送信先、非同期呼び出しの時処理結果の出力先を指定できるものになります。同期呼び出しの場合直接クライアント側に戻ってきます。非同期呼び出しの場合、クライアントには実行結果のみ受け取ります。関数の処理の成功、失敗がわからない状態でした。今までは結果を通知したり格納したりする実装が必要でした。そこでdestinationとして設定することで実行結果を確認できるようになりました。送信先のサービスはSQS、SNS、Lambda、EventBridgeの4つがあります。利用する場合Lambda関数にiamロールをアタッチする必要があります。

08:15 まとめ
3つの呼び出し方法がありました。同期呼び出し、非同期呼び出し、Streamとありますがイベントソースマッピング型の呼び出しとなります。同期呼び出しは直接Lambda関数を呼び出してすぐに実行結果を返すものです。非同期呼び出しはイベントが発生するとキューに格納してその後にキューを読み取って実行する流れ、イベントソースマッピングは例えばDynamoDBに変化が起こったらEvent source mappingが変更した状態を取りにいきEvent batchをLambdaが受け取ってLambda関数にEvent batchを渡して処理をするという内容です。
呼び出し方とエラー時の振る舞いをまとめています。様々な設定項目がありますが3種類の呼び出し方を覚えておくと迷いにくくなりますので覚えておきましょう。