はじめに
みなさんは、AWS Lambdaがどのような機能のサービスか説明することはできますか?
AWSの中でも、広く活用されているのがAWS Lambdaです。
AWSの資格勉強をしていた頃に、頻出していたサービスになります。
しかし、Lambdaの使い方や設定方法について詳しく説明している記事はよく見かけますが、
初心者向けにわかりやすく詳しく説明した記事はあまり見かけません。。。
私は理解するまでに少し苦労しました(汗)
そこで、本記事ではLambdaについて初心者目線で、わかりやすく解説しました!
Lambdaについて苦手意識を持っている方は、ぜひ最後までご覧ください!
AWS Lambdaとは?
AWS Lambdaとはざっくり解説すると…
・クラウド上にプログラムを定義しておき、インターネットを通じて実行できる
・利用者はプログラムコードを用意して、Lambda側に設定するだけで、プログラムを実行することが可能になる
というようなサービスです。
プログラムとは、コンピュータが実行する作業の順番のことです。
Lambdaを利用するメリットとは?
Lamdaを利用するメリットは、サーバーレス(サーバーがいらない)ということです。
自社でサーバーを構築し運用する場合、サーバー管理者は以下のような作業が発生します。
・物理的なサーバー機器の手配
・機器の設置・設定作業の手配(または自社で設置・設定作業)
・機器・各アプリケーションの不具合監視
・不具合発生時のメーカー保守対応依頼
・不具合時のメーカー連絡
・プログラムやバグの修正をするためのプログラム(修正パッチ)の適用
・サーバー負荷増による負荷分散・冗長化の設計
・OSを含めた各アプリケーションのアップデート作業・管理 etc‥
これはかなり大変な作業ですよね。
しかしながら、「サーバレス」は、ミドルウェアも、サーバーもAWSが管理します。
つまり、利用者側の運用管理が不要となります。
サーバーレスにすることで、サーバー管理にリソースを割かなくて済むので、
開発・運用に専念できることが企業にとって大きなメリットとなります。
サーバーレスのイメージ▼
また、リクエストの増加に応じて AWS Lambdaインスタンスは自動的にスケーリングされます。
他AWSサービスとの連携について
Lambdaは様々なAWSサービスと連携が可能であり、イベント駆動型のアプリケーションを実行することが可能です。
イベント駆動型とは、イベントの発生をきっかけとして処理を始めること です。
イメージしやすいようにお伝えすると、よくレンジャーものの1シーンで誰かが「助けてー!」と助けを呼ぶと、レンジャーに変身して助けてくれる というシーンがあるかと思いますが、そのようなイメージです。
「SOS」をトリガーとして、レンジャーが出動しますね。
続いて、Amazonのサービスを例にして解説します。
例えば、Amazon S3 にファイルがアップロードされたことをトリガー(きっかけ)として、LambdaでアップされたファイルをEC2に連携することが可能です。
実際に連携させてみた
では実際に、Lambdaを他AWSサービスと連携させて、発動させてみましょう。
今回のハンズオンでは、Amazon S3にオブジェクトがアップロードされたことをトリガー(きっかけ)として、Lmbdaを発動させます。
① Lambda関数の作成
まずはLambda関数を新規に作成します。
今回は、「s3-python-lambda」という新規関数を作成しました▼
② S3バケットの作成
続いてAmazon S3でバケットを新規で作成します。
このS3へのファイルのアップロードをトリガーに、先ほど作成したLambda関数が発動することになります▼
③ S3バケットでイベント通知を作成
先ほど作成したバケットの「プロパティ設定」から「イベント通知を作成」を選択します▼
イベント名やどのようなアクションでイベント通知を発動させるかを設定します。
今回の例では、すべてのオブジェクト作成イベントにチェックをしています▼
続いて、通知の送信先を設定します。
送信先は「Lambda関数」で先ほど作成した「s3-python-lambda」の関数を選択します▼
④トリガーが追加されているか確認
Lambdaの設定画面に戻って、トリガーにAmazon S3が追加されているかを確認します。ここでは、しっかり追加が反映されていますね▼
⑤Amzaon S3にオブジェクトを追加してみる
テスト的に、「test.png」というファイルをアップロードしてみました。
ここまでの設定がうまくいっていれば、イベント通知が発報されて、Lambdaが発動しているはずです▼
⑥Lambdaのモニタリングを確認
Lambdaのモニタリング画面から「CloudWatch ログを表示」を選択します。
CloudWatchの画面に遷移したら、「ログストリーム」を確認します。すると、先ほどS3にファイルをアップロードした際のログが確認できました▼
しっかりS3との連携ができていますね。
Lambda関数の呼び出し方について
Lambda関数には呼び出しタイプが3つあります。
①同期呼び出し
②非同期呼び出し
③イベントソースマッピング
トリガーによって呼び出しタイプが異なり、それによってAWS側でリトライ(再試行)が実行されるのか、ユーザー側でリトライ(再試行)を実装する必要があるかが変わってきます。
ここでは、呼び出しタイプについて、整理してみましょう。
①同期呼び出し
Lambdaを呼び出したら、Lambdaが実行して処理が完了してからレスポンスが戻ってきます。
実行するユーザー側とLambdaが処理するサーバーサイドが同じタイミングで同期しています。
リトライしたりバックアップしたりなどユーザー側で対処が必要になります。
同期呼び出しでは、エラーとなった場合にはLambda側で何も対応しないのが特徴となります。
②非同期呼び出し
同期呼び出しとは異なり、 実行するユーザー側とLambdaが処理するサーバーサイドが異なるタイミングで同期しています。
細かく流れを見ると、一度Event Queueにイベント通知を格納します。
その後、Event QueueからLambda functionにイベントを読み込ませます。
非同期呼び出しでは、Lambda関数のコードで、冪等性を担保することが重要です。
処理が途中で失敗した場合、リトライをして最初から処理をやり直したとしても最終的に結果が同じになるようにすることが求められます。
冪等性=「ある操作を 1 回行っても複数回行っても結果が同じである」という概念。
非同期呼び出しは、並列処理ができることが可能です。
同期呼び出しとは異なり、いちいちレスポンスを待つ必要がないので、大量に処理をすることが可能になります。
最高2回まで自動的にLambda側でリトライ(再試行)をします。
もしリトライに失敗した場合には、
デッドレターキュー (DLQ) という、エラーのために処理できないことを通知する仕組みがあります。
Amazon SQSやAmazon SNSと連携して、通知を発行することが可能です。
実際にコンソール画面を使って、デッドレターキュー(DLQ)の設定を見てみましょう!
Lamdaの「設定」から、「非同期呼び出し」を選択します▼
非同期呼び出しの「編集」を選択して、デッドレターキューを設定します▼
※事前にAmazon SQSでキューを作成しています
上記の設定が終わったら、デッドレターキューサービスとキューに設定が反映されていることを確認します▼
試しにエラーが2回以上起こるようにコードを実行して、デッドレターキューを発動させてみました。
すると、Amazon SQSに書きの画像のように通知が届いたことが確認できます▼
③イベントソースマッピング
イベントソースマッピングとは、イベントソースからデータを読み取り、Lambda関数を呼び出すLmbdaリソースのことです。
Lambdaがイベントを読み取るサービス(イベントソース)は、以下のようなものがあります。
- Amazon DynamoDB
- Amazon Kinesis
- Amazon MQ
- Amazon Managed Streaming for Apache Kafka (Amazon MSK)
- セルフマネージド Apache Kafka
- Amazon Simple Queue Service (Amazon SQS)
- Amazon DocumentDB (MongoDB 互換) (Amazon DocumentDB) など
Lambdaの便利な機能について
ここからは、AWS Lambdaの便利な機能について2つご紹介します!
①バージョニング機能
バージョニング機能を利用することで、過去の複数のバージョンを保持できるようになります。
例えば、最新バージョン(latest)から、ひとつ前のバージョンに戻ったり、ふたつ前にバージョンに戻ったりすることが可能になります。
また、バージョンを作成すると、過去のバージョンでは、コードや設定の編集はできなくなります。
編集が可能なのは、最新のバージョンのみになります。
②エイリアス機能
過去のバージョンにエイリアス機能を使って、別名を付与することが可能になります。
エイリアスで別名をつけることで、それぞれがどのような内容の関数なのかが可視化して分かりやすくなりますね。
また、加重ルーティングを使用して、
を何割割り当てるかを設定することも可能です。エイリアスに対して、バージョン
Lambdaの料金形態
Lambdaの料金は、Lambda関数が呼び出された回数と実行時間で決定する従量課金制です。
なお、Lambdaには無料枠があるので、無料枠を超えた範囲から請求が発生することになります。
・リクエスト数:1 か月あたり 100 万件
・実行時間:1 か月あたり 40 万 GB-s
課金枠については、以下のような料金となっております。
・リクエスト数: 100 万件あたり0.20USD
・実行時間:GB-秒あたり、0.0000166667USD
具体的な料金については、AWS 公式サイトをご覧ください。
引用:AWS 公式サイト
まとめ
AWS Lambdaについてまとめると、
クラウド上にプログラムを定義しておき、インターネットを通じて実行できるサーバーレスサービスでした。
サーバー管理が不要なため管理費がかからない点、他のAWSサービスとの連携が簡易にできる点がメリットということが分かりました。
AWS Lambdは代表的なサーバーレスサービスです。
うまく利用して、安く、安定したWebアプリケーションを作れるようにしましょう!