【问题标题】:Accessing Cloud SQL from Cloud Run on Google Cloud从 Cloud Run on Google Cloud 访问 Cloud SQL
【发布时间】:2020-11-05 01:30:18
【问题描述】:

我有一个通过 SQLAlchemy 访问 Cloud SQL 实例的 Cloud Run 服务。但是,在 Cloud Run 的日志中,我看到了 CloudSQL connection failed. Please see https://cloud.google.com/sql/docs/mysql/connect-run for additional details: ensure that the account has access to "<connection_string>"。转到那个链接,它说:

“默认情况下,您的应用将使用 Cloud Run(全托管)服务帐号授权您的连接。服务帐号的格式为 PROJECT_NUMBER-compute@developer.gserviceaccount.com。”

但是,以下 (https://cloud.google.com/run/docs/securing/service-identity) 说:

“默认情况下,Cloud Run 修订版使用具有 Project > Editor IAM 角色的 Compute Engine 默认服务帐号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com)。这意味着默认情况下,您的 Cloud Run 修订版具有对您的 Google Cloud 项目中的所有资源的读取和写入权限。”

那么这不应该意味着 Cloud Run 已经可以访问 SQL 了吗?我已经在 Cloud Run 部署页面中设置了 Cloud SQL 连接。您建议我怎么做才能允许从 Cloud Run 访问 Cloud SQL?

编辑:我必须启用 Cloud SQL API。

【问题讨论】:

  • 发布用于连接实例的代码会很有帮助。
  • 如果你有cloudbuild.yaml,可以发一下吗?

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


【解决方案1】:

否,Cloud Run 默认无法访问 Cloud SQL。您需要遵循两条路径之一。

  1. 使用本地 unix 套接字文件连接到 SQL:您需要像您所说的那样配置权限,并使用指示连接到数据库的意图的标志进行部署。关注https://cloud.google.com/sql/docs/mysql/connect-run

  2. 使用私有 IP 连接到 SQL:这涉及将 Cloud SQL 实例部署到 VPC 网络并因此获得私有 IP 地址。然后,您使用 Cloud Run VPC 访问连接器(当前为测试版)允许 Cloud Run 容器能够连接到该 VPC 网络,其中直接包括 SQL 数据库的 IP 地址(无需 IAM 权限)。关注https://cloud.google.com/vpc/docs/configure-serverless-vpc-access

【讨论】:

    【解决方案2】:

    Cloud SQL 代理解决方案

    我使用cloud-sql-proxy在Cloud Build提供的workspace目录下创建了一个本地unix socket文件。

    以下是主要步骤:

    1. 拉出一个Berglas 容器,用_VAR1 替换填充它的调用,这是我使用Berglas 加密的一个名为CMCREDENTIALS 的环境变量。您应该根据需要添加任意数量的_VAR{n}
    2. 通过 wget 安装 cloudsqlproxy。
    3. 运行中间步骤(针对此构建的测试)。此步骤使用存储在提供的临时 /workspace 目录中的变量。
    4. 建立您的形象。
    5. 推送您的图片。
    6. 使用 Cloud Run,部署并包含标志 --set-environment-variables

    完整的cloudbuild.yaml

    # basic cloudbuild.yaml
    steps:
    # pull the berglas container and write the secrets to temporary files 
    # under /workspace
      - name: gcr.io/berglas/berglas
        id: 'Install Berglas'
        env:
        - '${_VAR1}=berglas://${_BUCKET_ID_SECRETS}/${_VAR1}?destination=/workspace/${_VAR1}'
    
        args: ["exec", "--", "/bin/sh"]
    
    # install the cloud sql proxy
      - id: 'Install Cloud SQL Proxy'
        name: alpine:latest
        entrypoint: sh
        args:
          - "-c"
          - "\
          wget -O /workspace/cloud_sql_proxy \
          https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 && \
          sleep 2 && \
          chmod +x /workspace/cloud_sql_proxy"
        waitFor: ['-']
    
    # using the secrets from above, build and run the test suite
      - name: 'python:3.8.3-slim'
        id: 'Run Unit Tests'
        entrypoint: '/bin/bash'
        args: 
          - "-c"
          - "\
          (/workspace/cloud_sql_proxy -dir=/workspace/${_SQL_PROXY_PATH} -instances=${_INSTANCE_NAME1} & sleep 2) && \
          apt-get update && apt-get install -y --no-install-recommends \
          build-essential libssl-dev libffi-dev libpq-dev python3-dev wget && \
          rm -rf /var/lib/apt/lists/* && \
          export ${_VAR1}=$(cat /workspace/${_VAR1}) && \ 
          export INSTANCE_NAME1=${_INSTANCE_NAME1} && \
          export SQL_PROXY_PATH=/workspace/${_SQL_PROXY_PATH} && \
          pip install -r dev-requirements.txt && \
          pip install -r requirements.txt && \
          python -m pytest -v && \
          rm -rf /workspace/${_SQL_PROXY_PATH} && \
          echo 'Removed Cloud SQL Proxy'"
        
        waitFor: ['Install Cloud SQL Proxy', 'Install Berglas']
        dir: '${_APP_DIR}'
    
    # Using the application/Dockerfile build instructions, build the app image
      - name: 'gcr.io/cloud-builders/docker'
        id: 'Build Application Image'
        args: ['build',
               '-t',
               'gcr.io/$PROJECT_ID/${_IMAGE_NAME}',
               '.',
              ]
        dir: '${_APP_DIR}'
    
    # Push the application image
      - name: 'gcr.io/cloud-builders/docker'
        id: 'Push Application Image'
        args: ['push',
               'gcr.io/$PROJECT_ID/${_IMAGE_NAME}',
              ]
    
    # Deploy the application image to Cloud Run
    # populating secrets via Berglas exec ENTRYPOINT for gunicorn
      - name: 'gcr.io/cloud-builders/gcloud'
        id: 'Deploy Application Image'
        args: ['beta', 
               'run',
               'deploy', 
               '${_IMAGE_NAME}',
               '--image',
               'gcr.io/$PROJECT_ID/${_IMAGE_NAME}',
               '--region',
               'us-central1',
               '--platform', 
               'managed',
               '--quiet',
               '--add-cloudsql-instances',
               '${_INSTANCE_NAME1}',
               '--set-env-vars',
               'SQL_PROXY_PATH=/${_SQL_PROXY_PATH},INSTANCE_NAME1=${_INSTANCE_NAME1},${_VAR1}=berglas://${_BUCKET_ID_SECRETS}/${_VAR1}',
               '--allow-unauthenticated',
               '--memory',
               '512Mi'
              ]
    
    # Use the defaults below which can be changed at the command line
    substitutions:
      _IMAGE_NAME: your-image-name
      _BUCKET_ID_SECRETS: your-bucket-for-berglas-secrets
      _INSTANCE_NAME1: project-name:location:dbname
      _SQL_PROXY_PATH: cloudsql
      _VAR1: CMCREDENTIALS
    
    
    # The images we'll push here
    images: [
      'gcr.io/$PROJECT_ID/${_IMAGE_NAME}'
    ]
    
    

    Dockerfile 已使用

    以下代码从目录<myrepo>/application 包含内部 的源代码构建一个Python 应用程序。此 dockerfile 位于 application/Dockerfile 下。

    # Use the official lightweight Python image.
    # https://hub.docker.com/_/python
    FROM python:3.8.3-slim
    
    # Add build arguments
    # Copy local code to the container image.
    ENV APP_HOME /application
    
    WORKDIR $APP_HOME
    
    # Install production dependencies.
    RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        libpq-dev \
        python3-dev \
        libssl-dev \
        libffi-dev \
        && rm -rf /var/lib/apt/lists/*
    
    # Copy the application source
    COPY . ./
    
    # Install Python dependencies
    RUN pip install -r requirements.txt --no-cache-dir
    
    # Grab Berglas from Google Cloud Registry
    COPY --from=gcr.io/berglas/berglas:latest /bin/berglas /bin/berglas
    
    # Run the web service on container startup. Here we use the gunicorn
    # webserver, with one worker process and 8 threads.
    # For environments with multiple CPU cores, increase the number of workers
    # to be equal to the cores available.
    ENTRYPOINT exec /bin/berglas exec -- gunicorn --bind :$PORT --workers 1 --threads 8 app:app 
    

    希望这对某人有所帮助,尽管对于原始 OP 来说可能过于具体(Python + Berglas)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多