J'ai déjà utilisé Heroku et AWS et je configure maintenant un service sur la plate-forme Google Cloud à l'aide d'App Engine et de Cloud SQL (Postgres).

Nous avons essayé de créer l'application en utilisant 12 principes de facteurs.

La configuration s'est avérée si fastidieuse que je commence à me demander si j'ai fondamentalement raté quelque chose.

Voici les choses qui me rendent confus :

  1. Être encouragé à écrire des mots de passe dans un fichier qui se retrouve dans le contrôle de source (app.yaml).
  2. Besoin de pirater une solution de contournement pour le chargement des variables d'environnement (si je ne veux pas qu'elles soient engagées dans le contrôle de source).
  3. Constatant que pour me connecter à l'instance cloud sql, j'ai besoin d'une ligne faisant référence à l'instance spécifique dans app.yaml - alors maintenant j'ai besoin d'app.staging.yaml et d'app.production.yaml ?
  4. Trouver cette ligne ne semble prendre en charge qu'une instance de base de données et ne sait pas s'il existe une prise en charge si nous voulons que l'application se connecte à 2 bases de données.

Ai-je raté des développements majeurs dans l'administration des serveurs où ceux-ci sont devenus les meilleures pratiques ? Après avoir découvert les 3 et 4, je commence vraiment à penser que j'ai dû faire quelque chose de fondamentalement mal dans ma configuration. Ai-je?

answer

Je n'ai pas spécifiquement essayé de configurer une application comme vous le décrivez, mais je sais que ce ne sont pas les plats à emporter que Google a l'intention de faire. Pour répondre à quelques spécificités :

  1. La connexion à Cloud SQL indique spécifiquement ce qui suit pour suggérer que le stockage des mots de passe n'est pas ce qu'ils prévoient et fournit une solution distincte pour les secrets.

    # 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. D'après cet article, Google App Engine ne prend pas en charge les variables d'environnement dans app.yaml ( Commentaires sur des problèmes similaires avec Google App Engine ). Ma solution pour un problème similaire était le code suivant :

    #!/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
    

    REMARQUE : Ce script peut également être écrit en python à l'aide de la bibliothèque de sous-processus. C'est ainsi que j'ai automatisé la compilation de mon projet GKE.

    Ensuite, prenez le fichier app.yaml de votre application et ajoutez des remplacements de chaînes de variables bash comme cet exemple app-tpl.flexible.yaml :

    # 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}"
    

    Créer un fichier contenant les variables nécessaires (ignorées dans le contrôle de source)

    #!/bin/bash
    # FILE: env/production.vars
    
    project="project-name"
    region="europe-west1"
    instance="prod001"
    db_name="db001"
    db_user="root"
    db_pw="qwerty"
    
  3. Cela devrait être résolu par la réponse #2. Ajoutez un indicateur/une option sur le script à exécuter pour échanger l'instance SQL ou modifiez le nom de la variable d'environnement.

  4. Il semble que vous devrez configurer deux instances de connexion CloudSQL, puis le proxy CloudSQL automatique pourra se connecter à 2 bases de données. Voir cloud.google.com/sql/docs/mysql/connect-app-engine-flexible et cette réponse car ils l'ont fait fonctionner avec différents numéros de port.

Bonne chance!

La réponse de @codejedi ci-dessus (utilisez Google Secrets Manager ou injectez-les pendant le déploiement) est ce que je choisirais aujourd'hui.

Au moment où j'ai posté cette question (avril 2018), Google Secrets Manager ne serait pas publié avant 18 mois.

J'ai fini par déployer ma propre solution à l'époque en utilisant Datastore .