Google CloudBuildをGoogleCloudSQLに接続します

Dec 16 2020

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に存在しているので、私が推測するそれらの詳細を使用できるはずです🤔

回答

5 guillaumeblaquiere Dec 16 2020 at 23:42

必要な(そして必要な)コンテナーを使用して静的ページを生成し、クラウド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>        

1 thclark Dec 21 2020 at 01:05

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

*より多くのお金を払ってベータソフトウェアに非常に悩まされる場合を除いて、クラウドビルドワーカーを使用できます(執筆時点ではベータ版ですが、とにかく...戻ってきて更新しますそれを本番環境に移行し、問題を修正します)