Google Cloud Build를 Google Cloud SQL에 연결

Dec 16 2020

Google Cloud Run을 사용하면 Cloud SQL을 사용할 수 있습니다. 하지만 Google Cloud Build에서 컨테이너를 빌드 할 때 Cloud SQL이 필요하다면 어떻게해야할까요? 가능합니까?

배경

Google Cloud Run의 컨테이너에서 실행되는 Next.js 프로젝트가 있습니다. 내 코드를 Cloud Build에 푸시 (물건 설치, 정적 페이지 생성, 모든 것을 컨테이너에 저장)하고 Cloud Run에 배포하면 완벽하게 작동합니다. 👌

Cloud SQL

하지만 Google Cloud SQL에서 실행되는 PostgreSQL 인스턴스의 일부 데이터에도 필요한 일부 기능을 추가했습니다. 이 데이터는 프로젝트를 빌드 할 때 사용됩니다 (정적 페이지 생성).

로컬에서 내 컴퓨터에서는 프로젝트가 내 CloudSQL 프록시에 연결할 수 있으므로 제대로 작동합니다. CloudRun에서 실행하는 동안 Cloud Run 에서 Cloud SQL의 Postgres 인스턴스에 연결할 수 있으므로이 방법도 작동 합니다.

내 문제

Cloud Build로 프로젝트를 빌드 할 때 정적 페이지를 생성하려면 데이터베이스에 액세스해야합니다. Cloud Run (완전 관리 형)이 Cloud SQL 프록시를 사용하여 연결하는 메커니즘을 제공하는 것처럼 Docker 클라우드 빌더를 Cloud SQL에 연결하는 방법을 찾고 있습니다.

그렇게하면 /cloudsql/INSTANCE_CONNECTION_NAME프로젝트를 구축 하는 동안 연결할 수 있습니다 !

질문

제 질문은 Google Cloud Build에서 프로젝트를 빌드하는 동안 Cloud SQL 프록시를 통해 Google Cloud SQL의 PostgreSQL 인스턴스에 어떻게 연결합니까?

내 데이터베이스 자격 증명 등은 이미 Secrets Manager에 있으므로 이러한 세부 정보를 사용할 수 있어야합니다 🤔

답변

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 가이드도 마찬가지 임).

그러나 앞으로 문제가 발생할 경우주의해야합니다. Cloud Build는 독점적으로 * 실행되므로 us-central1다른 곳에서 연결하는 데 병리 적으로 느려집니다. 하나 또는 두 개의 작업에 대해서는 상관하지 않지만 단순히 작동하지 않는 전체 통합 테스트 제품군을 실행하고 있다면 상관 없습니다.

또한 GCSQL에 액세스하려면 GCB에 권한 을 부여 해야합니다 .

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

* 기꺼이 더 많은 비용을 지불하고 베타 소프트웨어에 푹 빠진 경우가 아니면 클라우드 빌드 작업자를 사용할 수 있습니다 (작성 당시에는 베타 버전입니다 ... 프로덕션으로 전환하고 문제를 수정)