👹

一人称で開発をできるようになる

2023/05/20に公開

Hello Worldだけでも難しかった

こんにちは、Jboyです。今日は、2回目のポエムを書こうかなと思います。最近副業始めて、単価の金額に問わず、経験を積みたいと、メンターやったり、音声アプリの開発に携わりました。開発をしていたときに、Flutter,Dartだけでは、作れないのがわかり、絶望しました。これ作れないんじゃね😱
でも作りたい機能が作れた!

何を作ったのか?

PythonのフレームワークであるFlaskを使用して、開発した音声ファイルの音のテンポを策定するWeb APIです。librosaという信号処理や音楽の分析ができるライブラリーです。
https://librosa.org/doc/latest/index.html

ローカル環境で動作確認をして、使えたのはいいけどホスティングサービスにデプロイしないと本番環境では、使えないので、render.comというHerokuのようなサービスを使いましたが、こちらはリクエストがないと、停止するデメリットがあり、FlaskをDockerでコンテナ化して、ECRにpushして、EC2で使えるようにしましたが、お金かかりすぎそうで、一旦断念しました😂

レスポンスを早くしたい!

AWSを使いたいが、今は無理そうで代替手段を探していたところFirebase Hostingできるらしいので、試そうとしたが、どうやらバックエンドの方はできないようで、Cloud Runと呼ばれているサービスにデプロイするようです?無料枠はあるらしい。
https://firebase.google.com/docs/hosting/cloud-run?hl=ja#python
https://cloud.google.com/run?hl=ja

躓いたところ!

gunicornとポート番号の設定で苦労しました。
公式通りにやっても上手くいかなかった?、なので、サーバーを起動するコードの箇所は修正しました。Hello Worldするだけでも手こずりましたね。GCPのCLIもこの間使ったときは、さっぱり使い方が、わからず挫折して、AWS CLIの方を使いました。でも実は、以外と簡単で、プロジェクトIDをコピー&ペーストするだけで、実行できました🥲

Hello Worldするコード以外は、私の今使ってるバージョンに対応したDockerで使う設定です。
やることは、ローカル環境でDocker imageを作っておいて、動作検証もして、問題なければ、GCPのコマンドをプロジェクトは以下で実行して、Cloud Runにデプロイします。
APIのコードを紹介したいのですが、プロダクションコードなので、これで勘弁してください🙇‍♂️

app.py
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