在使用私有 IP 连接到云 sql 的云构建上运行数据库迁移

Posted

技术标签:

【中文标题】在使用私有 IP 连接到云 sql 的云构建上运行数据库迁移【英文标题】:Run DB migrations on cloud build connecting to cloud sql using private IP 【发布时间】:2020-09-25 09:23:15 【问题描述】:

我正在尝试为云构建上的 Nodejs 应用程序设置数据库迁移,该应用程序通过云 sql 代理连接到具有私有 IP 的云 sql。 Cloud SQL 连接总是因云构建而失败。

目前我正在从计算引擎手动运行迁移。

我按照这个 SO 来设置构建步骤。 Run node.js database migrations on Google Cloud SQL during Google Cloud Build

cloudbuild.yaml

steps:
  - name: node:12-slim
    args: ["npm", "install"]
    env:
      - "NODE_ENV=$_NODE_ENV"
  - name: alpine:3.10
    entrypoint: sh
    args:
      - -c
      - "wget -O /workspace/cloud_sql_proxy https://storage.googleapis.com/cloudsql-proxy/v1.16/cloud_sql_proxy.linux.386 &&  chmod +x /workspace/cloud_sql_proxy"
  - name: node:12
    timeout: 100s
    entrypoint: sh
    args:
      - -c
      - "(/workspace/cloud_sql_proxy -dir=/workspace -instances=my-project-id:asia-south1:postgres-master=tcp:5432 & sleep 3) && npm run migrate"
    env:
      - "NODE_ENV=$_NODE_ENV"
      - "DB_NAME=$_DB_NAME"
      - "DB_PASS=$_DB_PASS"
      - "DB_USER=$_DB_USER"
      - "DB_HOST=$_DB_HOST"
      - "DB_PORT=$_DB_PORT"
  - name: "gcr.io/cloud-builders/gcloud"
    entrypoint: "bash"
    args:
      [
        "-c",
        "gcloud secrets versions access latest --secret=backend-api-env > credentials.yaml",
      ]
  - name: "gcr.io/cloud-builders/gcloud"
    args: ["app", "deploy", "--stop-previous-version", "-v", "$SHORT_SHA"]
timeout: "600s"

错误:

KnexTimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
Step #2:     at Client_PG.acquireConnection (/workspace/node_modules/knex/lib/client.js:349:26)

云构建角色:

Cloud Build Service Account
Cloud SQL Admin
Compute Network User
Service Account User
Secret Manager Secret Accessor
Serverless VPC Access Admin

CLOUD SQL ADMIN API 也已启用。

版本:

NPM libs:
  "pg": "8.0.3"
  "knex": "0.21.1"

【问题讨论】:

node/v12.17.0 npm/6.14.4 【参考方案1】:

Cloud SQL 私有 IP 功能使用托管在 VPC network 中的内部 IP 地址,这些地址只能从同一 VPC 网络中的其他资源访问。

由于 Cloud Build 不支持 VPC 网络,因此无法从 Cloud Build 连接到 Cloud SQL 实例的私有 IP。

您可能想查看有关此主题的 official Cloud SQL documentation,以选择适合您用例的另一种替代方案。

【讨论】:

您首选的 Django 迁移到私有云 sql 的方式是什么?【参考方案2】:

连接公有云sql

我使用 docker-compose & cloud sql proxy。

    为云构建设置 docker-compose,here。

    创建服务帐户(json 文件)。

    docker-compose 文件:

version: '3.7'

services: 
  app:
    build:
      context: .
      dockerfile: Dockerfile
    restart: "no"
    links:
      - database
    tty: true
    volumes: 
      - app:/var/www/html
    env_file: 
      - ./.env
    depends_on: 
      - database
      

  database:
    image: gcr.io/cloudsql-docker/gce-proxy
    restart: on-failure
    command: 
      - "/cloud_sql_proxy" 
      - "-instances=<INSTANCE_CONNECTION_NAME>=tcp:0.0.0.0:3306" 
      - "-credential_file=/config/sql_proxy.json"
    volumes: 
      - ./sql_proxy.json:/config/sql_proxy.json:ro

volumes: 
  app:
    cloudbuild.yml

- name: 'gcr.io/$PROJECT_ID/docker-compose'
  id: Compose-build-cloudProxy
  args: ['build']

- name: 'gcr.io/$PROJECT_ID/docker-compose'
  id: Compose-up-cloudProxy
  args: ['up', '--timeout', '1', '--no-build', '-d']

- name: 'bash'
  id: Warm-up-cloudProxy
  args: ['sleep', '5s']

- name: 'gcr.io/cloud-builders/docker'
  id: Artisan-Migrate
  args: ['exec', '-i', 'workspace_app_1', 'php', 'artisan', 'migrate']

- name: 'gcr.io/$PROJECT_ID/docker-compose'
  id: Compose-down-cloudProxy
  args: ['down', '-v']

build-success.png

【讨论】:

你的云 SQL 实例是公开的吗? 是的。云 SQL 必须具有公共 IPv4 地址。公共 IP 地址不需要任何外部地址都可以访问(不需要添加为授权网络地址)。参考以下here。

以上是关于在使用私有 IP 连接到云 sql 的云构建上运行数据库迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌云平台中使用私有 IP 从我的电脑连接到 sql 实例

从具有私有和公共 IP 的虚拟机连接到私有 IP 上的 Google Cloud SQL 实例失败

专有网络云产品路由器和交换机

使用私有 IP 从不同 VPC 网络中的 GKE 集群连接到 Cloud SQL

将 gcloud VM 上运行的 Spring Boot 连接到云 SQL 实例

如何从android设备连接到sql server数据库