Verbinden Sie Google Cloud Build mit Google Cloud SQL

Dec 16 2020

Google Cloud Run ermöglicht die Verwendung von Cloud SQL. Was aber, wenn Sie beim Erstellen Ihres Containers in Google Cloud Build Cloud SQL benötigen? Ist das möglich?

Hintergrund

Ich habe ein Next.js-Projekt, das in einem Container in Google Cloud Run ausgeführt wird. Das Verschieben meines Codes in Cloud Build (Installieren des Materials, Generieren statischer Seiten und Platzieren von allem in einem Container) und Bereitstellen in Cloud Run funktioniert einwandfrei. 👌

Cloud SQL

Ich habe jedoch gerade einige Funktionen hinzugefügt, in denen auch einige Daten aus meiner PostgreSQL-Instanz benötigt werden, die unter Google Cloud SQL ausgeführt wird. Diese Daten werden beim Erstellen des Projekts (Generieren der statischen Seiten) verwendet.

Auf meinem Computer funktioniert dies lokal einwandfrei, da das Projekt eine Verbindung zu meinem CloudSQL-Proxy herstellen kann. Während der Ausführung in CloudRun sollte dies auch funktionieren, da Cloud Run die Verbindung zu meiner Postgres-Instanz in Cloud SQL ermöglicht .

Mein Problem

Wenn ich mein Projekt mit Cloud Build erstelle, benötige ich Zugriff auf meine Datenbank, um meine statischen Seiten generieren zu können. Ich suche nach einer Möglichkeit, meinen Docker Cloud Builder mit Cloud SQL zu verbinden, möglicherweise genau wie Cloud Run (vollständig verwaltet) einen Mechanismus bietet, der eine Verbindung über den Cloud SQL-Proxy herstellt.

Auf diese Weise könnte ich mich /cloudsql/INSTANCE_CONNECTION_NAMEbeim Erstellen meines Projekts verbinden!

Frage

Meine Frage lautet also: Wie kann ich über den Cloud SQL-Proxy eine Verbindung zu meiner PostgreSQL-Instanz in Google Cloud SQL herstellen, während ich mein Projekt in Google Cloud Build erstelle?

Dinge wie meine Datenbankanmeldeinformationen usw. befinden sich bereits im Secrets Manager, daher sollte ich in der Lage sein, diese Details zu verwenden, denke ich 🤔

Antworten

5 guillaumeblaquiere Dec 16 2020 at 23:42

Sie können den gewünschten (und benötigten) Container zum Generieren Ihrer statischen Seiten verwenden und den Cloud-SQL-Proxy herunterladen, um einen Tunnel mit der Datenbank zu öffnen

  - 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

Die App-Engine verfügt über einen Exec-Wrapper, der den Vorteil hat, dass Sie Ihr Cloud-SQL für Sie als Proxy verwenden können. Daher verwende ich diesen, um im Cloud-Build eine Verbindung zur Datenbank herzustellen ( ebenso einige Google-Tutorials ).

Seien Sie jedoch vor bevorstehenden Problemen gewarnt: Cloud Build wird ausschließlich * ausgeführt, us-central1was bedeutet, dass die Verbindung von einem anderen Ort aus pathologisch langsam ist. Für ein oder zwei Operationen ist es mir egal, aber wenn Sie eine ganze Reihe von Integrationstests ausführen, funktioniert das einfach nicht.

Außerdem müssen Sie GCB die Berechtigung erteilen , auf GCSQL zuzugreifen.

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

* Es sei denn, Sie sind bereit, mehr zu zahlen und werden von der Beta-Software sehr beeindruckt. In diesem Fall können Sie Cloud-Build-Worker verwenden (zum Zeitpunkt des Schreibens sind sie sowieso in der Beta ... Ich werde zurückkommen und aktualisieren, wenn sie dies tun es in die Produktion und beheben Sie die Probleme)