🛢️ はじめに
ローカルの Docker 環境で AWS Lambda(Serverless Framework)と Python(Flask)でサーバーレス API を実装,デプロイします.非常に簡単にAPIを実装できるので便利です.皆さんも試してはいかがでしょうか.
🛢️ 自己紹介
初めまして.趣味でweb開発を勉強している273*(ツナサンド) / Kei.と申します.関西の大学生です.最近はフルスタック開発やツール制作を行なっています.まだまだ初心者です.
🛢️ 完成品
以下のリポジトリにテンプレートを用意しましたので,お好きに使ってください!
🛢️ 実装
使用ツール
- Docker:PCの中に仮想環境を作れるツール.他のプロセスと遮断できるため環境の差をなくすことができる.
- AWS Lambda:AWSが提供しているサービス.プログラムを定義しておき,インターネットを通じて実行できる.
- Serverless Framework:サーバレス・アプリケーションを簡単に構築するためのツール.Node,Pythonなどいろんな言語やフレームワークに対応している.LambdaやAPIGatewayの設定を自動化,ymlで実装できる.
- Python:機械学習やwebシステムなどなんでも作れる万能なプログラミング言語.
- Flask:Pythonのwebフレームワーク.
- WSGI:Pythonのwebフレームワークとwebサーバーを接続するインタフェース.読み方はウィスキーやウィズギー.
事前準備
-
こちらを参考にAWSからアクセスキーとシークレットキーを発行してください.
-
Macを使用している場合は設定からAirPlayレシーバーを切っておきましょう.
(ポートがFlaskのデフォルトポートである5000番と重複しているため)
実装
-
上記のリポジトリをクローンしてください.
-
docker-compose.ymlのcontainer_nameにコンテナ名を設定し,docker compose buildでDockerイメージを構築します. -
docker compose up -dでデタッチドモードでコンテナを起動します. -
docker exec -it 設定したコンテナ名 /bin/bashでコンテナの中に入ります. -
serverlessでプロジェクトを作成します.- 今回はFlaskで実装してみたいので
AWS / Python / Flask APIを選択します. - プロジェクト名を設定します.
- Serverless Frameworkのログインを求められますので,表示されたリンクからログインしてください(
Login/Registerを選びます). - アプリを作成するか既存のアプリを選択するか聞かれますのが,
Skip Adding An Appを選択します. - AWSの認証を求められますので,
Save AWS Credentials in a Local Profileを選択して事前準備で用意したアクセスキーを入力します. - 作成されたディレクトリに移動し,
npm iを実行します.
- 今回はFlaskで実装してみたいので
-
serverless.ymlでPythonのバージョン(runtimeの部分)をpython3.9に変更し,customのwsgiにpythonBin: /usr/bin/python3を追加します. -
docker-compose.ymlのコメントアウトされている部分を解除し,FLASK_APPにapp.pyのパスを指定します. -
exitでコンテナから抜け,docker compose downでコンテナの終了させます. -
docker compose upでコンテナ内のflaskアプリがローカルで起動します.この時点でhttp://localhost:5000 をGETメソッドで叩くと,jsonでHello from root!とレスポンスが返ってきます. -
コンテナの中に入って,
aws configureコマンドでAWSの認証をしておきましょう.region(AWSサーバー)やoutput format(デフォルトはjson)はお好みでどうぞ. -
デプロイする時はコンテナの中に入り,
serverless.ymlのあるディレクトリに移動し,sls deployを実行します.するとAWSに自動でデプロイされます.デプロイ後,ターミナルにデプロイ先のリンクが表示されます.AWS コンソールからも確認できます.また,LambdaとAPI Gatewayが作成,接続されているのを確認できます.
🛢️ 最後に
いかがでしたでしょうか.簡単にサーバーレスAPIを実装することができました!
serverless.ymlで環境をコードで書けたり非常に便利ですね!他にもPython以外の言語やDynamoDBやS3と連携することもでき,動作をローカルで試すことも可能です.誰かの参考になったら幸いです.最後まで読んでいただきありがとうございました.それでは!