AWSでAPI GatewayとLambda関数でWebアプリケーションを作る

 AWSのAPI GatewayとLambda関数で簡単なWebアプリケーションを作ってみます。Webのサービスを実行するLambda関数はpythonで記述します。

 WebアプリケーションのフレームワークとしてBottleを使います。pythonではWebフレームワークとしてFlaskがよく使われるようですが、一方、Bottleは単一ファイルのモジュールとして配布され、Python標準ライブラリ以外には依存関係がなく(pure python)、単純で、速く、軽量です。
 さっそく、試しに簡単なWebアプリケーションを作ってみます。Pythonで簡単なWebサーバを記述します。

ファイルapp.py

 プログラムの先頭で、パッケージawsgi(プロジェクトttps://github.com/slank/awsgi、v0.2.7)をインポートします。awsgiは、AWS API Gateway/Lambda Proxy統合をWSGIのインタフェースにするラッパーです。

 Webフレームワークとしてbottle(0.12.25)を使います。

 WebサーバのLambda関数のエントリはlambda_handlerです。この関数の中でawsgiを使ってbottleのアプリケーション(app)を呼び出します。

 プログラムの最後のif __name__ == ‘__main__’:で、bottle単体で起動するときの処理を書いています。これは単体デバッグ用です。

 このWebアプリケーションは、URLで「/」をアクセスすると「<p>index</p>」、子供のリソースの「/hello/world」をアクセスすると「<p>Hello world</p>」を返すようにしています。

 Lambda関数にするためのPythonのパッケージを用意します。app.pyと直下のディレクトリで次のコマンドを実行します。

$ pip install aws-wsgi -t ./
$ pip install bottle -t ./

 このディレクトリでLambda関数としてデプロイするためにzipファイルを作ります。

$ zip -r echo.zip .

つぎに、AWS Consoleのブラウザを開きます。

 lambda関数を作ります。AWS Console Lambdaで、Lambdaの関数名「echo」、ランタイム「python」、アーキテクチャ「x86_64」または「arm64」と指定して作ります。

作ったLambda関数(ここではecho)のソースコードのタブで、アップロード元にzipを選んで、さっき作ったecho.zipをアップロードします。Zipファイルが小さいときには直接ファイルをアップロードできます。

 そのあと、Lambda関数のランタイム設定で、ハンドラを「app.lambda_handler」を指定します。指定するのはWebアプリケーションのapp.pyのなかの関数lambda_handlerです。

 Lambda関数echoのログは、CloudWatchのロググループ/aws/lambda/echoにでます。ロググループのechoは作ったlambda関数の名前です。

 今度は、API GatewayにAPIを作ります。AWS ConsoleのAPI Gateway画面でAPIの作成ボタンを押します。

 APIのタイプでHTTP APIの構築ボタンを選びます。

 APIの作成で、統合の種類を「lambda」として、さきほど作ったlambda関数「echo」を指定して、Versionを「1.0」にします。API名をわかりやすい名前にします。ここでは「echo」にしました。

 次のルート作成で、メソッドはANYでリソースパスを「/{proxy+}」にします。「{proxy+}」は網羅的なプロキシリソースやcatch-allパス変数と呼ばれるパス変数です。指定したリソースより深いパスは全てここでキャッチしてくれます。統合ターゲットは作成したLambda関数のままにします。

 次のステージを設定では、ステージ名を「$default」のままにします。

 次の「確認して作成」のページで、確認して作成します。

 作ったAPI Gatewayのステージで「$default」を選んで、表示されたURLをアクセスします。

 表示されたURLをブラウザで開きます。「index」と表示されます。
 表示されたURLに「/hello/world」の文字列をつないでアクセスしてみてください。「Hello world!」と表示されます。

 WebアプリケーションをAWSのAPI GatewayとLambda関数で作ってみました。

 このような構成にすることにより、Webサーバを用意する必要がなくなり、無駄なWebサーバの実行時間やサーバの管理の手間が削減できます。

 マイクロサービスのアーキテクチャでシステムを構成するときには、機能の少ないWebサービスを多数用意して組み合わせる必要が出てきます。そのようなシステムを作るときには、このようなAPI GatewayとLambda関数を使った作り方も有力な候補となります。

 また、Lambda関数をpure pythonだけで構成することで、アーキテクチャへの依存関係がないlambda関数を構築できます。そうすると、アーキテクチャの違いをLambdaのレイヤーで吸収し足りせずに、簡単に、安価で高性能なAWS Graviton2プロセッサに切り替えることができます。