pythonでプロジェクトを作成する際のテンプレートです。
本リポジトリは、PythonでWebアプリケーションを開発する際のテンプレートです。
サンプルとして、メッセージ管理アプリケーションを実装しています。
機能 | 詳細 | ユースケース |
---|---|---|
メッセージの登録 | メッセージを登録する | メッセージ登録 |
メッセージの閲覧 | メッセージを閲覧する | メッセージ閲覧 |
メソッド | パス | 説明 |
---|---|---|
GET | /messages | メッセージ一覧を取得 |
POST | /messages | メッセージを登録 |
以下の機能を提供しています。
- UI
- CLI(typer)
- API(FastAPI)
- サーバーサイドレンダリング(Flask)
- UIフレームワーク(streamlit, dash)
- データベース
- SQLite
- Firestore
- DynamoDB
- CosmosDB
- クラウド
- GCP(Cloud Run)
- AWS(App Runner, Lambda)
- Azure(Container Apps)
- CI/CD
- GitHub Actions
- テスト
- unit test
- e2e test
- ログ
- モニタリング
Onion Architectureを採用しています。
UIフレームワークによって詳細は異なりますが、FastAPIを利用する場合のアーキテクチャ図を以下に示します。
プロジェクトを初期化する際は、以下の手順で行ってください。
- このリポジトリをクローン
- .env.sampleを元に.envを作成
- 不要なファイルを削除
本リポジトリは、各種クラウドでの動作確認等を行うため、最小限+αの構成としています。
最小限の構成として利用する場合は、以下の手順で不要なファイルを削除してください。
make minimize
を実行- docker-compose.ymlからcredentialsのマウントを削除
- src/presentation/のサブディレクトリのうち、不要なフレームワークのディレクトリを削除
- .devcontainer/devcontainer.jsonのlaunchの設定のうち、不要なフレームワークの設定を削除
- README.mdを編集
- クラウド関係の環境変数を.envとsrc/settings.pyから削除
アプリケーションを実行する際は、以下の手順で行ってください。
make up
でDocker Composeを起動- http://localhost:<LOCAL_PORT>/ からアプリにアクセス
make down
でDocker Composeを終了
終了せずにDev Containerを起動すると、docker-compose.override.ymlの内容が上書きされずデバッグが利用できません。
アプリケーションの開発を行う際は、以下の手順で行ってください。
- pre-commitをインストール(ex.
pip install pre-commit
) pre-commit install
でpre-commitのhookスクリプトを導入- VSCodeでDev Container拡張機能をインストール
- コマンドパレット(
Ctrl+Shift+P
)からRemote-Containers: Reopen in Container
を実行 - (Docker Compose立ち上げ時のみ)拡張機能の依存関係の解決に失敗することがあるので、ウィンドウの再読み込みする
- F5でデバッグ実行が可能
- http://localhost:<LOCAL_PORT>/ からアプリにアクセス
FastAPIを利用する場合は、以下の手順で行ってください。
- 上記手順でAPIサーバーを起動
- live-server拡張機能で、src/presentation/fastapi/frontend/index.htmlを開く
- http://localhost:5500/src/presentation/fastapi/frontend/ からフロントエンドにアクセス
各クラウドへのデプロイを行う際は、以下の手順で行ってください。
- Terraform State用のGCSバケット作成
- Cloud Storage > バケット の画面から、terraform-state保存用のGCSバケット(ex.
<app_name>-terraform-state-bucket
)を作成
保存場所やストレージクラスは任意、公開アクセスの防止はオンを選択
- Cloud Storage > バケット の画面から、terraform-state保存用のGCSバケット(ex.
make create-infra-gcp
- サービスアカウントキーの発行
- IAMと管理 > サービスアカウント > 作成したサービスアカウント > キー の画面から、 鍵を追加 > 新しい鍵の作成 > JSON > 作成 で鍵を作成してダウンロード
- credentials/credential_gcp.jsonとして保存
- ドメインの発行
- Cloud Domains > ドメインを登録 からドメインを発行
- DNSはterraformで作成したCloud DNSのゾーンを指定
- SSL証明書のプロビジョニング
- セキュリティ > Certificate Manager > 従来の証明書 の画面からステータスが完了になるまで待つ
- makeコマンドでデプロイ
make deploy-gcp
コマンドを実行すると、アプリケーションのデプロイが行われます
- 通知チャンネルの作成
- Monitoring > アラート > EDIT NOTIFICATION CHANNELS から、Emailの通知チャンネルを作成
- アラートポリシーを編集し、作成した通知チャンネルを追加
make destroy-gcp
- Terraform State用のS3バケット作成
- Amazon S3 > バケットを作成 の画面から、terraform-state保存用のS3バケット(ex.
<app_name>-terraform-state-bucket
)を作成
バケットタイプは汎用、ACLは無効、パブリックアクセスはブロック、バージョニングは無効、暗号化はS3マネージドキーを選択
- Amazon S3 > バケットを作成 の画面から、terraform-state保存用のS3バケット(ex.
make create-infra-aws-apprunner
- credentialsをcredentials/credentials_awsとして保存
ユーザーアカウントを利用する場合はcp ~/.aws/credentials credentials/credentials_aws
としてください make deploy-aws-apprunner
でApp Runnerにデプロイ
make destroy-aws-apprunner
- Terraform State用のS3バケット作成
- Amazon S3 > バケットを作成 の画面から、terraform-state保存用のS3バケット(ex.
<app_name>-terraform-state-bucket
)を作成
バケットタイプは汎用、ACLは無効、パブリックアクセスはブロック、バージョニングは無効、暗号化はS3マネージドキーを選択
- Amazon S3 > バケットを作成 の画面から、terraform-state保存用のS3バケット(ex.
make create-infra-aws-lambda
- credentialsをcredentials/credentials_awsとして保存
ユーザーアカウントを利用する場合はcp ~/.aws/credentials credentials/credentials_aws
としてください make deploy-aws-lambda
でLambdaにデプロイ
make destroy-aws-lambda
Container Appsへのデプロイを実施します
- Entra IDのアプリを登録からサービスプリンシパルを登録し、クライアントシークレットを発行する
- .envのAZURE_CLIENT_ID,AZURE_CLIENT_SECRETに各値を設定
- CosmosDBのデータベースとコレクションを作成
- サービスプリンシパルにCosmosDBへのアクセス権の付与
cf. https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac
az cosmosdb sql role assignment create \ --account-name <CosmosDBのアカウント名> \ --resource-group <リソースグループ名> \ --scope "/" \ --principal-id <EntraIDのエンタープライズアプリケーションの該当アプリケーション(サービスプリンシパル)のオブジェクトID> \ --role-definition-id <ロールid=00000000-0000-0000-0000-000000000002>
make deploy-azure
でContainer Appsにデプロイ- (オプション)Application Insightsを作成
- (オプション)Application Insightsなどの監視/ログからアラートを設定
cf. https://yotiky.hatenablog.com/entry/azure_exceptionsalert