🛢️ はじめに
ローカルの 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
と連携することもでき,動作をローカルで試すことも可能です.誰かの参考になったら幸いです.最後まで読んでいただきありがとうございました.それでは!