一人称で開発をできるようになる
Hello Worldだけでも難しかった
こんにちは、Jboyです。今日は、2回目のポエムを書こうかなと思います。最近副業始めて、単価の金額に問わず、経験を積みたいと、メンターやったり、音声アプリの開発に携わりました。開発をしていたときに、Flutter,Dartだけでは、作れないのがわかり、絶望しました。これ作れないんじゃね😱
でも作りたい機能が作れた!
何を作ったのか?
PythonのフレームワークであるFlaskを使用して、開発した音声ファイルの音のテンポを策定するWeb APIです。librosaという信号処理や音楽の分析ができるライブラリーです。
ローカル環境で動作確認をして、使えたのはいいけどホスティングサービスにデプロイしないと本番環境では、使えないので、render.comというHerokuのようなサービスを使いましたが、こちらはリクエストがないと、停止するデメリットがあり、FlaskをDockerでコンテナ化して、ECRにpushして、EC2で使えるようにしましたが、お金かかりすぎそうで、一旦断念しました😂
レスポンスを早くしたい!
AWSを使いたいが、今は無理そうで代替手段を探していたところFirebase Hostingできるらしいので、試そうとしたが、どうやらバックエンドの方はできないようで、Cloud Runと呼ばれているサービスにデプロイするようです?無料枠はあるらしい。
躓いたところ!
gunicornとポート番号の設定で苦労しました。
公式通りにやっても上手くいかなかった?、なので、サーバーを起動するコードの箇所は修正しました。Hello Worldするだけでも手こずりましたね。GCPのCLIもこの間使ったときは、さっぱり使い方が、わからず挫折して、AWS CLIの方を使いました。でも実は、以外と簡単で、プロジェクトIDをコピー&ペーストするだけで、実行できました🥲
Hello Worldするコード以外は、私の今使ってるバージョンに対応したDockerで使う設定です。
やることは、ローカル環境でDocker imageを作っておいて、動作検証もして、問題なければ、GCPのコマンドをプロジェクトは以下で実行して、Cloud Runにデプロイします。
APIのコードを紹介したいのですが、プロダクションコードなので、これで勘弁してください🙇♂️
import os
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
target = os.environ.get('TARGET', 'World')
return 'Hello {}!\n'.format(target)
if __name__ == "__main__":
# Get the PORT environment variable
port = int(os.environ.get('PORT', 8080))
# Run the Flask application on the specified port
app.run(host='0.0.0.0', port=port)
requirements.txtに必要なパッケージを書いておく。hello wordlするだけなら、Flask, gunicornだけで良い。
Flask
requests
Flask-CORS
librosa
gunicorn
Dockerfileの設定を書く
FROM python:3.9-slim
ENV PYTHONUNBUFFERED True
WORKDIR /app
COPY . .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
RUN pip install Flask gunicorn
# ENTRYPOINT ["python"]
CMD ["gunicorn", "--bind", ":8080", "--workers", "1", "--threads", "8", "--timeout", "0", "app:app"]
Docker imageを作り出すコマンドを実行する
docker build -t flask-app .
サーバーを起動するコマンドを実行する。停止するときは、control + cを押す
docker run -p 5001:8080 flask-app
ローカルで動作を確認するときは、こちらのURLにアクセスする
http://localhost:5001
本番環境にデプロイ
Dockerfile を含むディレクトリから次のコマンドを実行し、Cloud Build を使用してコンテナ イメージをビルドします。
gcloud builds submit --tag gcr.io/project id/helloworld
次のコマンドを使用してデプロイします。
gcloud run deploy --image gcr.io/project id/helloworld
最後に
今回携わっている副業案件では、Flutter以外の技術に触れることができまして、バックエンドからインフラまで経験できました。今の目標は、Cloudも使えて、APIも自作して、フルスタックに活躍できるエンジニアを目指すことですね。
Discussion