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プロセッサに切り替えることができます。