Ich habe zuvor Heroku und AWS verwendet und richte jetzt einen Dienst auf der Google Cloud-Plattform mit App Engine und Cloud SQL (Postgres) ein.

Wir haben versucht, die App mit 12-Faktor-Prinzipien zu erstellen.

Das Setup hat sich als so mühsam erwiesen, dass ich anfange zu fragen, ob ich nur grundlegend etwas verpasst habe.

Hier sind die Dinge, die mich gerade verwirrt haben:

  1. Ermutigt werden , Passwörter in eine Datei zu schreiben , die in der Quellcodeverwaltung (app.yaml) landet.
  2. Ich muss eine Problemumgehung zum Laden von Umgebungsvariablen hacken (wenn ich nicht möchte, dass sie der Quellcodeverwaltung zugewiesen werden).
  3. Um eine Verbindung mit der Cloud-SQL-Instanz herzustellen, benötige ich eine Zeile, die sich auf die spezifische Instanz in app.yaml bezieht - also brauche ich jetzt app.staging.yaml und app.production.yaml?
  4. Das Finden dieser Linie scheint nur 1 DB-Instance zu unterstützen und unklar, ob es Unterstützung gibt, wenn die App eine Verbindung zu 2 DBs herstellen soll.

Habe ich einige wichtige Entwicklungen in der Serververwaltung verpasst, wo diese zu Best Practices geworden sind? Nachdem ich gerade #3 & #4 entdeckt habe, fange ich wirklich an zu denken, dass ich in meinem Setup etwas grundlegend falsch gemacht haben muss. Habe ich?

answer

Ich habe nicht speziell versucht, eine Anwendung so zu konfigurieren, wie Sie es beschreiben, aber ich weiß, dass dies nicht die Absichten von Google sind. Um auf einige Besonderheiten einzugehen:

  1. Beim Herstellen einer Verbindung mit Cloud SQL wird Folgendes ausdrücklich erwähnt, um darauf hinzuweisen, dass das Speichern von Passwörtern nicht das ist, was sie beabsichtigen, und eine separate Lösung für Geheimnisse bieten.

    # Remember - storing secrets in plaintext is potentially unsafe. Consider using
    # something like https://cloud.google.com/secret-manager/docs/overview to help keep
    # secrets secret.
    
  2. Basierend auf diesem Artikel unterstützt Google App Engine keine Umgebungsvariablen in app.yaml ( Kommentare zu ähnlichen Problemen mit Google App Engine ). Mein Fix für ein ähnliches Problem war der folgende Code:

    #!/bin/bash
    # deploy-helper.sh
    
    prepare_yaml() {
        [ -z "$1" ] && echo "ERROR: template.yaml filename must be provided." && exit 1
    
        template="${1}"         # ARG #1 : filename of template yaml
        finalYAML=$(mktemp)     # make temporary file
    
        generated_stdin_cmds="$(echo "cat <<EOF >\"$finalYAML\""; cat $template; echo EOF;)"
        source /dev/stdin <<< "$generated_stdin_cmds"
        echo "$finalYAML";      # return filepath of filled-in file
        return 0
    }
    
    # Set environment variables 
    TYPE="prod"                     # in script file
    source env/production.vars      # read them in from a file
    
    DEPLOYMENT_FILE="app.flexible.yaml"
    tmpfile="$(prepare_yaml "app.tpl.yaml")"
    if [ $? -eq 0 ]; then
        mv "$tmpfile" "$PWD/$DEPLOYMENT_FILE"   # gcloud wants specific filename
        gcloud app deploy "$DEPLOYMENT_FILE"
        rm "$DEPLOYMENT_FILE"                   # Cleanup temporary file
    fi
    

    HINWEIS: Dieses Skript kann auch in Python geschrieben werden, indem die Subprozessbibliothek verwendet wird. So habe ich den Build für mein GKE-Projekt automatisiert.

    Nehmen Sie als Nächstes Ihre Anwendung app.yaml-Datei und fügen Sie Bash-Variablen-String-Ersetzungen wie in diesem Beispiel app-tpl.flexible.yaml hinzu:

    # example app-tpl.flexible.yaml
    ---
    runtime: custom
    env: flex
    env_variables:
      MYSQL_SOCK: "/cloudsql/${project}:${region}:${instance}"
      MYSQL_DB: "${db_name}"
      MYSQL_USER: "${db_user}"
      MYSQL_PASSWORD: "${db_pw}"
    

    Datei erstellen, die die notwendigen Variablen enthält (in der Quellcodeverwaltung ignoriert)

    #!/bin/bash
    # FILE: env/production.vars
    
    project="project-name"
    region="europe-west1"
    instance="prod001"
    db_name="db001"
    db_user="root"
    db_pw="qwerty"
    
  3. Dies sollte durch Antwort #2 gelöst werden. Fügen Sie dem Skript ein Flag/eine Option hinzu, das zum Austauschen der SQL-Instanz ausgeführt werden soll, oder ändern Sie den Namen der Umgebungsvariablen.

  4. Anscheinend müssen Sie zwei CloudSQL-Verbindungsinstanzen konfigurieren und dann kann der automatische CloudSQL-Proxy eine Verbindung zu zwei Datenbanken herstellen. Siehe cloud.google.com/sql/docs/mysql/connect-app-engine-flexible und diese Antwort, da sie es mit verschiedenen Portnummern zum Laufen gebracht haben .

Viel Glück!

Die obige Antwort von @codejedi (verwenden Sie Google Secrets Manager oder fügen Sie sie während der Bereitstellung ein) würde ich heute gehen.

Als ich diese Frage gestellt habe (April 2018), wurde Google Secrets Manager erst in 18 Monaten veröffentlicht.

Ich habe damals meine eigene Lösung mit Datastore eingeführt .