Heroku上にサーバーを立てる。 Procfileを用意して、直接プロセスを実行する方法と、コンテナをビルド&デプロイする方法がある。 ここでは後者のコンテナデプロイの方法をとる。 IntegrationでGithub<->Heroku CD設定はカンタンに可能。ただし、ここでは逐一コマンド実行によって設定・デプロイを実行することとする。
docker build
を実行する際のcontextの設定位置は、heroku側でDockerfile
の配置されているディレクトリに固定されてしまうため、
それを加味したDockerfile
記述、またはディレクトリ構成とする必要がある。
├── example/
│ └── python/
│ ├── config.py
│ ├── requirements.txt
│ └── server.py
├── heroku.yml
└── herokuDockerfile
heroku login # login via Web UI
heroku create ${APP_NAME}
heroku stack:set container --app ${APP_NAME}
heroku config:set ${ENV_NAME}=${ENV_VAR} --app ${APP_NAME}
git push heroku ${BRANCH_NAME}:master
# Display Applications
heroku apps
# Display Logs
heroku logs --app ${APP_NAME}
# Restart Service
heroku ps:scale web=0 --app ${APP_NAME}
heroku ps:scale web=1 --app ${APP_NAME}
# Maintenance Mode
heroku maintenance:on --app ${APP_NAME}
CloudRun
との使い分けはざっくり以下- KNative上でStatelessContainerを動かしたい場合は
CloudRun
Pub/Sub
やFirebase
をトリガーとしたい場合はCloudFunctions
- そもそも
CloudFunctions
で用意されていないランタイムで動かしたい場合は自動的にCloudRun
- KNative上でStatelessContainerを動かしたい場合は
master
ブランチへのpushを契機にGithubActionsのワークフローから、
CloudBuildでイメージビルド・レジストリpush・CloudRunデプロイを実施する。
リソースはTerraform
で作成する。
# DeployはCloudBuildから行うため、yml内で定義
gcloud builds submit --config cloudbuild.yml --substitutions _DOCKER_IMAGE_TAG=${TAG}
- CloudBuildからCloudRunへデプロイするにあたって必要な権限は、Cloud Run 管理者とサービスアカウントユーザーロールが必要
- Secret情報の保管はSecretManagerを使うことが推奨されている。
- 公開アクセスを許可するためには、Cloud Run起動元ロールをallUsersに与える必要がある(参照)
- フルマネージドで利用するケースでは、NetworkFirewallを設定するユースケースは見当たらない