Git Product home page Git Product logo

asset-management-simulation-backend's Introduction

asset-management-simulation-backend

  • 自作のWebAppである資産管理シミュレーションのバックエンドに関するレポジトリです。
  • フロントエンドのレポジトリは こちらをご参照ください。

fig

Overview

  • WebフレームワークはFlaskを使用しています。
  • デプロイ先は Google Cloud Runです。
  • develop branchへのPRが発行されたタイミングで、GitHub Actionsを利用した自動テスト(pytest)が実施されます。
  • develop branchへのPRがマージされたタイミングでmain branchへのリリースPRが自動作成されます。
  • main branchへpush、あるいはPRがマージされたタイミングでGitHub Actionsを利用したCloud Runへの自動デプロイが実施されます。

Usage

ローカル開発

  • 準備
    • Makefile.devなどを用意し、以下のようにGCPのプロジェクトID、任意のイメージ名、タグ名、firebaseプロジェクト名、ローカルホスト名、(必要に応じて)postman headerなどを記述
    • Makefileを読み込む必要があるため、include Makefileも合わせて記述
PROJECT_ID := xxx
IMAGE := xxx
TAG := xxx

FIREBASE_PROJECT_NAME := xxx
LOCAL_HOST := http://localhost:3000
POSTMAN_HEADER := http://postman

include Makefile
  • Dockerコンテナを起動する場合
# ビルド
make build -f Makefile.dev
# ローカルでコンテナ起動
make run-local -f Makefile.dev
# まとめてやる場合
make build run-local -f Makefile.dev
  • poetryで直接.venvを作成する場合
make install
  • ローカルで.venv環境を使ったpytestを実行する場合
make test-local

手動デプロイ

  • Makefile.prdなどを用意する。あとは以下のコマンドでdeployまで行う
  • デプロイ時にFRONTEND_URL_hogeFIREBASE_PROJECT_NAMEを環境変数として渡す必要があるのでMakefile.prdで事前に定義する
PROJECT_ID := xxx
IMAGE := xxx
TAG := xxx

FIREBASE_PROJECT_NAME := xxx
FRONTEND_URL_1 := xxx
FRONTEND_URL_2 := xxx
FRONTEND_URL_3 := xxx

include Makefile
# ビルド
make build -f Makefile.prd
# イメージをpush
make push -f Makefile.prd
# Cloud runにデプロイ
make deploy -f Makefile.prd
# まとめてやる場合
make build push deploy -f Makefile.prd

CI/CD

  • GCP上に新規サービスアカウントを以下のロールを付与した状態で作成
    • ストレージ管理者
    • Cloud Run 管理者
    • サービスアカウントユーザー
  • 以下のスクリプトを実行
    • サービスアカウントで発行されたjson鍵を使う認証は非推奨のため、workload-identityを使用
    • 実行後、workload_identity_providerが表示されるが、後工程で必要
PROJECT_ID=xxx
SERVICE_ACCOUNT_NAME=xxx   # 上記で作成したサービスアカウント
POOL_NAME=xxx
POOL_DISPLAY_NAME=xxx
PROVIDER_NAME=xxx
GITHUB_REPO=xxx


# IAM Service Account Credentialsの有効化
gcloud services enable iamcredentials.googleapis.com \
  --project "${PROJECT_ID}"

# Workload Identity Pool 作成
gcloud iam workload-identity-pools create "${POOL_NAME}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --display-name="${POOL_DISPLAY_NAME}"
# Pool IDを取得
export WORKLOAD_IDENTITY_POOL_ID=$( \
     gcloud iam workload-identity-pools describe "${POOL_NAME}" \
    --project="${PROJECT_ID}" \
    --location="global" \
    --format="value(name)" \
)

# Workload Identity Provider 設定
gcloud iam workload-identity-pools providers create-oidc "${PROVIDER_NAME}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="${POOL_NAME}" \
  --display-name="${PROVIDER_DISPLAY_NAME}" \
  --attribute-mapping="google.subject=assertion.sub,attribute.repository=assertion.repository,attribute.actor=assertion.actor,attribute.aud=assertion.aud" \
  --issuer-uri="https://token.actions.githubusercontent.com"

# サービス アカウントの権限借用の設定
gcloud iam service-accounts add-iam-policy-binding "${SERVICE_ACCOUNT_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --project="${PROJECT_ID}" \
  --role="roles/iam.workloadIdentityUser" \
  --member="principalSet://iam.googleapis.com/${WORKLOAD_IDENTITY_POOL_ID}/attribute.repository/${GITHUB_REPO}"

# workload_identity_providerを表示
echo
echo 'workload_identity_provider:'
echo $(gcloud iam workload-identity-pools providers describe "${PROVIDER_NAME}" \
  --project="${PROJECT_ID}" \
  --location="global" \
  --workload-identity-pool="${POOL_NAME}" \
  --format='value(name)')
  • GitHub上で各種Secretsを設定
Secrets 説明
FIREBASE_PROJECT_NAME FirebaseのプロジェクトID
FRONTEND_URL_1 Firebase Hosting のURL (デフォルト1)
FRONTEND_URL_2 Firebase Hosting のURL (デフォルト2)
FRONTEND_URL_3 Firebase Hosting のURL (カスタムドメイン)
GCP_PROJECT_ID デプロイ先のプロジェクトID
GCP_REGION デプロイ先のリージョン
SERVICE_ACCOUNT_NAME 作成したサービスアカウント名
SERVICE_NAME Docker Image 名
WORKLOAD_IDENTITY_PROVIDER 作成したプロバイダー名

asset-management-simulation-backend's People

Contributors

spider-man-tm avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.