IaC推進活動大好き!AWS Lambda大好き!な“アプリとインフラの気持ちが分かるエンジニア”の大槻です。
アプリエンジニアの目線から考えると、従来の開発環境のインフラ設定は非効率でした。 個々の環境はゼロから構築する必要がありましたし、全く同じ環境であっても何度も同じ設定作業を繰り返す必要がありました。
AWS Lambda(以下、Lambda)は、 Amazon Web Services(以下、AWS)が提供するサーバレスコンピューティングサービスです。開発環境をサーバレスで使用できますので、Lambdaを利用すれば、アプリエンジニアはインフラの管理を気にすることなくビジネスロジックの開発に集中できるため、生産性向上が期待できます。
本コラムでは、アプリ・インフラ双方のエンジニア目線から効果的にLambdaを活用するためのナレッジを紹介します。
Lambdaの実行環境
従来のWebアプリケーションの実行環境と、Lambdaを利用した環境の違いを解説します。
従来のWebアプリケーションの実行環境
従来のWebアプリケーションの処理プロセスでは、Webブラウザからの指示が、Apache HTTP Server(Webサーバ)を経由し、 Apache Tomcat(Webサーバアプリケーション)によって受けとられ、データ処理を実行してApache HTTP Serverへ結果を返していました。 Apache HTTP Serverは処理結果の最新のデータを用いてWebブラウザ上のUIを更新し、ユーザーにフィードバックを提供するという流れです。
上記の流れでは、アプリケーションのビジネスロジックとなる制御(コントローラ)がApache Tomcat の内部でデータ処理を行っており、このモデルをMVCモデルと呼びます。Model(ロジック)、View(入出力)、Controller(制御)の3つに分割してそれぞれがアプリケーションを開発します。
Lambda を利用したWebアプリケーションの実行環境
Lambda を利用した環境では、Apache HTTP Serverの代わりに、Amazon API Gateway(以下、API Gateway)が使用され、APIリクエストに応答してLambda関数を実行します。
LambdaはApache Tomcatのコントローラ内に組み込まれた機能であり、Javaプログラムの特定のロジック部分を関数として独立させたもので、必要に応じた呼び出しが可能です。LambdaはAPI Gatewayと連携して初めて Web アプリケーションとして機能します。
また、LambdaはPOJO(Plain Old Java Object)と呼ばれる概念を利用し、依存関係のないシンプルなオブジェクトを構成できます。これにより、特定の規約やフレームワークに依存しない移植性の高い環境を実現できます。
Lamdaの主要なイベントトリガー
Lambdaでは多様なイベントをトリガーとしてLambda関数が実行されます。Lambdaで利用できる主要なイベントトリガーは以下の通りです。
各イベントトリガーの解説は最後の「おまけ:Lambdaの基本的な役割と機能の解説『Lambdaの主要なイベントトリガー』」をご参照ください。
Lambdaは、これらのイベントトリガーを活用し、多種多様なユースケースに対応するサーバレスアプリケーションの構築を可能とします。つまり、LambdaはWebアプリケーションだけのサービスではないということです。
Lambda関数の作成方法
Lambda関数をAWSコンソールで作成する手順を紹介します。ここでは基本動作として、以下の項目に注目して解説します。
・関数作成
・トリガー設定
・テスト実行
・後続処理
①AWS Lambdaコンソールへのアクセス
AWSマネジメントコンソールにログインして[サービス]から[Lambda]を選択します。
②関数の作成
Lambdaのダッシュボードで[関数の作成]ボタンをクリックします。
③関数の設定
関数の作成方法は[一から作成]を選択し、以下の項目の入力、選択を行います。
・[関数名](今回は“ShopingCart”)を入力
・[ランタイム(関数のコードを書く言語)]を選択(例: Python、Node.js、Javaなど)
・[アーキテクチャ]を選択(x86_64及びarm64から選択可能です。arm64はコストパフォーマンスが良いとされています。)
[作成]をクリックすると、関数の概要に作成した関数「ShopingCart」が表示されます。
④関数のコードの記述
AWSコンソールの画面下部にある[コード]タブより、インラインエディタを使用してコードを入力または貼り付けます。
コードソースの詳しい解説は最後の「おまけ:Lambdaの基本的な役割と機能の解説『Lambda関数の基本的な構文』」をご参照ください。
⑤イベントトリガーの設定
AWSコンソールの関数の概要にある[トリガーを追加]より、イベントトリガーを設定します。
下図では、既存のAPI Gatewayを利用しています。
設定が完了すると下図のように、作成した関数の概要が表示されます。
⑥ 実行した結果の送信先の設定
[連絡先を追加]をクリックし、関数実施後の後続処理として送信先を設定します。
⑦テストイベントの作成
[テスト]タブでは関数に対するテストイベントを設定できます。
⑧関数の実行状況のモニタリング
[モニタリング]タブでは、[Cloud Watch ログを表示]で取得可能な値を可視化できます。
Lambdaの設定方法の詳細はAWSの公式サイトをご参照ください。
Lambda構成パターン
複数のAPIを活用している場合、API GatewayがHTTPリクエストをLambda関数にトリガーとして送信し、Lambdaが処理を行います。ここではAPI GatewayとLambdaの構成例を紹介します。
Lambda+API Gatewayの構成パターン
API Gatewayに対し、それぞれの役割をもったLambdaを作成して下図のように構成します。
Amazonショッピングサイトに例えると、クライアントがアクセスするURL毎(アイテムリスト、ショッピングカート、出荷情報など)にLambdaを作成します。このようにマイクロコントローラ単位でのLambdaの構成を推奨しています。
メリットのないLambda構成例と改善方法
処理を同期させる手間を削減し、非同期で処理できる点がLambdaのメリットです。しかし、Lambdaから別のLambdaを呼ぶ構成の場合は依存関係が生まれ、Lambdaのメリットを打ち消してしまいます。このような場合は、AWS Step Functionsが適しています。AWS Step Functionsを使用すると、複雑なワークフローを容易に管理でき、Lambdaのスケーラビリティや柔軟性を最大限に活用できます。
まとめ
Lambdaは、イベント駆動型のコンピューティングサービスです。Webアプリケーション実行環境のコントローラの他に、バッチや処理を繋げる様々なリソースとして提供されています。Lambdaを利用する際には、効果的に活用するために以下の点について留意して検討してみてください。
・非同期を念頭に設計を検討しましょう
Lambdaはイベントが発生するたびに、Lambda関数を非同期(または同期)で実行します。非同期処理の利点は、複数イベントの並行処理によるスケーラビリティ、レイテンシの低減、リソースの効率的利用などです。非同期処理のメリットを活かした設計を検討しましょう。
・依存しないシンプルな設計を心掛けましょう
データ処理においても処理の依存を最小限にしてシンプルな設定にすることで、エラーの影響範囲を限定できます。シンプルな同期のシステムは、システム全体を拡張・進化させる設計の重要な概念だといえるでしょう。
・作り込まないこと
日々、様々な新しいサービスが提供されています。たとえば、AWS Step Functionなどの既存サービスを組み合わせて、モダナイゼーション設計に繋げましょう。
また、Webアプリケーション開発の考え方として、マイクロサービス(細分化)と非同期を考えることも重要になるでしょう。
AWS re:Invent 2022におけるAmazonのCEOであるWerner Vogels氏の発表をうけて、米国のエンジニアであるJacob Grisham氏が、「世界は非同期である。非同期なき、疎結合と密結合システムは進化するか、淘汰されるであろう。」と発言されました。
これは、非同期に実装できることを特性として捉えて、クラウドを利用するアーキテクトである私たちがWebアプリケーション設計・開発も同様に、進化させていくことを求められているのです。
AWS Lambdaでサーバレスを始めてみませんか?サーバレスで実現する非同期の新しいWebアプリケーションの進化を、設計・開発から導入まで、富士ソフトがお手伝いします。
おまけ:Lambdaの基本的な役割と機能の解説
Lambdaとは
Lambdaは、AWSが提供するサーバレスコンピューティングサービスです。Webアプリケーションのバックエンド、データ処理タスク、IoTバックエンド、リアルタイムファイル処理など様々なユースケースに利用されています。以下は主な特徴を紹介します。
イベントに応じたトリガー設定
Lambda はLambda関数を使用してアプリケーションを管理、実行します。Lambda関数は、HTTPリクエスト、 AWS内のリソースの状態変更、API GatewayからのHTTP リクエストなど、様々なイベントに応じて起動します。
従量課金制
Lambdaはリクエストの数とコードの実行時間(1ミリ秒単位)に基づいて課金されます。サーバレスなので、インフラの管理やコストを気にする必要がありません。
料金の詳細については、AWSの公式サイトをご覧ください。
複数言語サポート
LambdaはNode.js、Python、Ruby、Java、Go、.NET Coreなど、複数のプログラミング言語をサポートしています。
タイムアウトを1秒単位で設定
Lambda関数のタイムアウトはデフォルトで3秒に設定されていますが、最大15 分(900秒)まで1秒単位で設定できます。予想される処理時間に合わせてタイムアウトの値を設定します。
実行権限の定義はロールベース
Lambda関数を実行する際に、その関数がどのようなAWSリソースにアクセスできるかをIAMロールによって定義できます。
ソースコードの柔軟な管理
AWSの管理コンソールを使用して、ブラウザ上でコードを書き込めます。また、Amazon S3から読み込ませる方法や、管理コンソールへZipファイルをアップロードする方法もあり、柔軟に管理できます。
Lambda関数の基本的な構文
Lambda関数の基本的な構文を解説します。Lambdaは様々な言語で記述できますが、ここでは例として、Javaを使用します。
import json
def lambda_handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
①標準の場合、“lambda_handler”と名前をつけた関数を実装します。
②event変数には、Lambda関数を呼び出したイベント情報が含まれます。
③context変数には、ランタイム環境の情報が含まれます。例えば Lambda 関数の名前、関数に割り当てられるメモリ容量、IAMロールなどです。
④returnには返す処理結果を定義します。例では、HTTPリクエストを処理し、ステータスコード 200 とメッセージ“Hello from Lambda!”をJSON形式で返しています。
Lambdaの主要なイベントトリガー
Lambdaで利用できる主要なイベントトリガーを紹介します。
Amazon S3
S3バケット内でのオブジェクトの作成、更新、削除などのイベントに応じて、Lambda関数が実行されます。
Amazon DynamoDB
DynamoDBのテーブルに項目が追加、更新、削除された時に、Lambda関数が実行されます。
Amazon CloudWatch Events / Amazon EventBridge
スケジュールされたイベント、定期的なタスク、AWSリソースの状態変化が検出されると、Lambda関数が実行されます。
Amazon CloudWatch Logs
CloudWatch Logsのログストリームに新しいログが記録された時に、Lambda関数が実行されます。
Amazon SQS / Amazon SNS
SQSキューに新しいメッセージが到着した際や、SNSトピックへのメッセージの配信に応じて、Lambda関数が実行されます。
AWS re:Invent 2022 - Keynote with Dr. Werner Vogels
富士ソフトのAWS関連サービスについて、詳しくはこちら
アマゾンウェブサービス(AWS)