はじめに
この記事は AWS に触ったことがない人に向けた、 AWS Lambda を紹介する記事です。
AWS Lambda とは
AWS Lambda とは、サーバー管理不要で、いろんな種類のコードを実行できる、コンピューティングサービスです。AWS Lambda で実行されるアプリケーションコードとその設定は Lambda 関数と呼ばれたりします。
AWS Lambda の全体像はこんな感じです。
開発者は実行したいコードを Lambda 関数として用意し、設定を行います。また複数の Lambda 関数で利用したいライブラリやパッケージがあれば、 Lambda レイヤーとして切り出せます。
AWS Lambda の呼び出し方
作成した Lambda 関数は、イベントソースの様々なイベントによって呼び出せます。イベントソースの例をいくつか、下記に記載します。
図のようにイベントソースによって同期的、非同期的、ポーリングによって呼び出されるか異なります。
Lambda関数が呼び出せるサービス・呼び出し方法の一覧は上記ドキュメントに記載されているので、気になる方はご確認ください。
また AWS Lambda を使ったサーバーレス設計・サーバレスアプリにおけるエラーハンドリングについては、下記ドキュメントをご確認ください。
Lambda 関数のコード例
AWS Lambda は下記のマネージドランタイムをサポートしてます。
- Node.js
- Python
- Java
- .NET
- Ruby
またOS専用ランタイムを用いて Go、Rust、C# 等の他ランタイムを実行することも可能です。
さらに AWS Lambda Web Adapter を用いることで、HTTPを話す任意のコンテナイメージを AWS Lambda で動作させることが可能です。使用感が気になる方は、下記ドキュメントをご確認ください。
今回は、Python を例にシンプルな Lambda 関数のコードを見てみます。
def lambda_handler(event, context):
message = 'Hello {} {}!'.format(event['first_name'], event['last_name'])
return {
'message' : message
}
マネージドランタイムで関数を定義する場合、lambda_handler
というハンドラーを定義します。ハンドラーは、 Lambda 関数が呼び出されたとき、最初に実行されるエントリーポイントです。
ハンドラーとなる関数は、イベントオブジェクトとコンテキストオブジェクトを引数として受け取る形にする必要があります。これらの引数のオブジェクトは、実行時に AWS Lambda により渡されて、コードの中で参照することが可能です。
- イベントオブジェクト
- Lambda 関数に処理させたいデータや、イベントソースから渡されたデータ
- イベントソースによってデータの中身が変わる
- コンテキストオブジェクト
- ランタイムの環境情報やプロパティが含まれる
- 例えば Lambda 関数の名前や Amazon リソースネーム (ARN) 、設定されている メモリ容量など
ハンドラーのコードを記述する時は、下記2つを抑えておきましょう。
ハンドラーの実行時間は最長 15 分まで
1回の呼び出しで15分を超えるような処理は、Lambda 関数はタイムアウトしてしまいます。処理を分割するか、AWS Lambda 以外のサービスを検討しましょう。
コンテナとサーバレスの使い分けについては、下記スライドをご確認ください。
ハンドラーの関数やメソッド内に全てのコードを記述する必要はない
ハンドラーはあくまで Lambda 関数のコードの中で最初に実行する関数です。なのでハンドラーにすべてのコードを記述する必要はありません。必要に応じてハンドラーから他の関数を呼び出したり、他のオブジェクトのメソッドを呼び出すように設計し、コードの可読性向上・テスタビリティの向上を目指しましょう!
まとめ
今回は AWS に触ったことがない人に向けて、 AWS Lambda を紹介しました。各種ハンズオンのリンクを記載しておくので、興味を持った方はぜひやってみてください!
参考文献