【问题标题】:Connect Google Cloud Build to Google Cloud SQL将 Google Cloud Build 连接到 Google Cloud SQL
【发布时间】:2021-03-27 06:25:30
【问题描述】:

Google Cloud Run 允许使用 Cloud SQL。但是,如果您在 Google Cloud Build 中构建容器时需要 Cloud SQL 怎么办?这可能吗?

背景

我有一个 Next.js 项目,它在 Google Cloud Run 上的容器中运行。将我的代码推送到 Cloud Build(安装东西、生成静态页面并将所有内容放入容器中)并部署到 Cloud Run 非常有效。 ????

云 SQL

但是,我刚刚添加了一些功能,其中它还需要来自在 Google Cloud SQL 上运行的 PostgreSQL 实例中的一些数据。在构建项目(生成静态页面)时会用到这些数据。

在本地,在我的机器上,这工作正常,因为项目可以连接到我的 CloudSQL 代理。在 CloudRun 中运行时,这也应该可以工作,因为 Cloud Run 允许 connecting to my Postgres instance on Cloud SQL

我的问题

使用 Cloud Build 构建我的项目时,我需要访问我的数据库才能生成我的静态页面。我正在寻找一种将我的 Docker 云构建器连接到 Cloud SQL 的方法,也许就像 Cloud Run(完全托管)提供了一种使用 Cloud SQL 代理进行连接的机制。

这样我可以在构建项目时连接到/cloudsql/INSTANCE_CONNECTION_NAME

问题

所以我的问题是:在 Google Cloud Build 上构建项目时,如何通过 Cloud SQL 代理连接到 Google Cloud SQL 上的 PostgreSQL 实例?

我的数据库凭据等内容已经存在于 Secrets Manager 中,所以我应该能够使用我猜想的那些详细信息????

【问题讨论】:

    标签: google-cloud-platform google-cloud-sql google-cloud-run google-cloud-build cloud-sql-proxy


    【解决方案1】:

    您可以使用您想要(并且您需要)的容器来生成您的静态页面,并下载云 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>        
    
    

    【讨论】:

    • 谢谢,但这对我来说是行不通的,只是在构建阶段,而不是整个容器。但是,受您输入的启发,我在 Dockerfile 中添加了以下内容: RUN GOOGLE_APPLICATION_CREDENTIALS=$(pwd)/service_account.json \ ./cloud_sql_proxy -instances=foobar:europe-west4:baz=tcp:5432 & \ GOOGLE_APPLICATION_CREDENTIALS=$(pwd )/service_account.json DB_HOST='127.0.0.1' npm run build && rm -rf .next/cache 在安装 CloudSQL 代理并通过 base64 编码的 build-arg 注入 SERVICE_ACCOUNT_FILE 之后。
    • 您介意再解释一下 的值吗?我也在 OP 遇到同样的问题,并试图更多地理解事情。你会为 使用“gcr.io/cloud-builders/yarn”之类的东西,然后让一切都在 下构建 nextjs 容器映像 + 将映像推送到注册表 + 部署云吗?
    • 您的容器是您想要安装的二进制文件的容器。它可以是 NodeJS,也可以是特定的运行时或其他任何东西。如果使用 wget,则必须使用安装了 wget 的容器,或者使用 apt-get 或其他包管理器自行安装(取决于您的容器操作系统)
    • 明白了。非常感谢!这很有帮助
    【解决方案2】:

    应用引擎有一个exec wrapper,它可以为您代理您的 Cloud SQL,因此我使用它来连接到云构建中的数据库 (so do some google tutorials)。

    但是,请注意前方的麻烦:Cloud Build 仅在 us-central1 中运行*,这意味着从其他任何地方连接都会非常缓慢。对于一两个操作,我不在乎,但如果您正在运行一整套根本无法工作的集成测试。

    另外,您需要 grant permission 让 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
    

    * 除非您愿意支付更多费用并被 Beta 版软件刺痛,在这种情况下您可以使用云构建工作者(无论如何,在撰写本文时处于 Beta 版...我会回来更新如果他们将其投入生产并解决问题)

    【讨论】:

      【解决方案3】:

      ENV VARS(包括数据库连接)在构建步骤期间不可用。 但是,您可以在容器运行时(完成构建步骤后)使用(Docker 的)ENTRYPOINT 来运行命令。

      我需要在部署新构建时运行数据库迁移(即当容器开始运行时)并且使用 ENTRYPOINT(到文件/命令)能够运行迁移(需要数据库连接详细信息,不可用在构建过程中)。

      “如何”部分非常简短,位于此处:https://*.com/a/69088911/867451

      【讨论】: