Google CloudBuildをGoogleCloudSQLに接続します
Google Cloud Runでは、CloudSQLを使用できます。しかし、Google CloudBuildでコンテナをビルドするときにCloudSQLが必要な場合はどうでしょうか。それは可能ですか?
バックグラウンド
Google CloudRunのコンテナで実行されるNext.jsプロジェクトがあります。コードをCloudBuildにプッシュし(インストール、静的ページの生成、すべてをコンテナーに入れる)、CloudRunにデプロイすることは完全に機能します。👌
クラウドSQL
ただし、Google CloudSQLで実行されるPostgreSQLインスタンスのデータにも必要な機能をいくつか追加しました。このデータは、プロジェクトのビルド(静的ページの生成)時に使用されます。
ローカルでは、私のマシンでは、プロジェクトがCloudSQLプロキシに接続できるため、これは正常に機能します。CloudRunではCloudSQL上のPostgresインスタンスに接続できるため、CloudRunで実行している間はこれも機能するはずです。
私の問題
Cloud Buildを使用してプロジェクトをビルドする場合、静的ページを生成できるようにするには、データベースにアクセスする必要があります。DockerクラウドビルダーをCloudSQLに接続する方法を探しています。おそらく、Cloud Run(完全に管理されている)がCloudSQLプロキシを使用して接続するメカニズムを提供しているようです。
そうすれば/cloudsql/INSTANCE_CONNECTION_NAME
、プロジェクトの構築中に接続できます。
質問
だから私の質問は:Google Cloud Buildでプロジェクトをビルドしているときに、Cloud SQLProxyを介してGoogleCloud SQLのPostgreSQLインスタンスに接続するにはどうすればよいですか?
私のデータベース資格情報などはすでにSecretsManagerに存在しているので、私が推測するそれらの詳細を使用できるはずです🤔
回答
必要な(そして必要な)コンテナーを使用して静的ページを生成し、クラウドSQLプロキシをダウンロードしてデータベースとのトンネルを開くことができます
- name: '<YOUR CONTAINER>'
entrypoint: 'sh'
args:
- -c
- |
wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
chmod +x cloud_sql_proxy
./cloud_sql_proxy -instances=<my-project-id:us-central1:myPostgresInstance>=tcp:5432 &
<YOUR SCRIPT>
App Engineには、Cloud SQLをプロキシするという利点があるexecラッパーがあるので、それを使用してクラウドビルドでDBに接続します(Googleチュートリアルもいくつか行います)。
ただし、事前に問題が発生する場合は注意が必要です。CloudBuildは排他的に実行されます* us-central1
。つまり、他の場所から接続するのは病理学的に遅くなります。1つまたは2つの操作の場合、私は気にしませんが、統合テストのスイート全体を実行している場合は、単純に機能しません。
また、GCBがGCSQLにアクセスするためのアクセス許可を付与する必要があります。
steps:
- id: 'Connect to DB using appengine wrapper to help'
name: gcr.io/google-appengine/exec-wrapper
args:
[
'-i', # The image you want to connect to the db from
'$_GCR_HOSTNAME/$PROJECT_ID/$REPO_NAME:$SHORT_SHA',
'-s', # The postgres instance
'${PROJECT_ID}:${_POSTGRES_REGION}:${_POSTGRES_INSTANCE_NAME}', '-e', # Get your secrets here... 'GCLOUD_ENV_SECRET_NAME=${_GCLOUD_ENV_SECRET_NAME}',
'--', # And then the command you want to run, in my case a database migration
'python',
'manage.py',
'migrate',
]
substitutions:
_GCLOUD_ENV_SECRET_NAME: mysecret
_GCR_HOSTNAME: eu.gcr.io
_POSTGRES_INSTANCE_NAME: my-instance
_POSTGRES_REGION: europe-west1
*より多くのお金を払ってベータソフトウェアに非常に悩まされる場合を除いて、クラウドビルドワーカーを使用できます(執筆時点ではベータ版ですが、とにかく...戻ってきて更新しますそれを本番環境に移行し、問題を修正します)