J'ai besoin de stocker les clés API et d'autres informations sensibles en app.yaml
tant que variables d'environnement pour le déploiement sur GAE. Le problème avec ceci est que si je pousse app.yaml
vers GitHub, ces informations deviennent publiques (pas bonnes). Je ne veux pas stocker les informations dans une banque de données car cela ne convient pas au projet. Je souhaite plutôt échanger les valeurs d'un fichier répertorié dans .gitignore
chaque déploiement de l'application.
Voici mon fichier app.yaml:
application: myapp
version: 3
runtime: python27
api_version: 1
threadsafe: true
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.application
login: required
secure: always
# auth_fail_action: unauthorized
env_variables:
CLIENT_ID: ${CLIENT_ID}
CLIENT_SECRET: ${CLIENT_SECRET}
ORG: ${ORG}
ACCESS_TOKEN: ${ACCESS_TOKEN}
SESSION_SECRET: ${SESSION_SECRET}
Des idées?
Réponses:
S'il s'agit de données sensibles, vous ne devez pas les stocker dans le code source car elles seront archivées dans le contrôle de code source. Les mauvaises personnes (à l'intérieur ou à l'extérieur de votre organisation) peuvent y trouver. En outre, votre environnement de développement utilise probablement des valeurs de configuration différentes de celles de votre environnement de production. Si ces valeurs sont stockées dans le code, vous devrez exécuter un code différent en développement et en production, ce qui est compliqué et une mauvaise pratique.
Dans mes projets, je place les données de configuration dans le magasin de données en utilisant cette classe:
Votre application ferait ceci pour obtenir une valeur:
S'il existe une valeur pour cette clé dans le magasin de données, vous l'obtiendrez. Si ce n'est pas le cas, un enregistrement d'espace réservé sera créé et une exception sera levée. L'exception vous rappellera d'aller dans la Developers Console et de mettre à jour l'enregistrement d'espace réservé.
Je trouve que cela évite de deviner la définition des valeurs de configuration. Si vous n'êtes pas sûr des valeurs de configuration à définir, exécutez simplement le code et il vous le dira!
Le code ci-dessus utilise la bibliothèque ndb qui utilise Memcache et la banque de données sous le capot, donc c'est rapide.
Mettre à jour:
jelder demandé comment trouver les valeurs Datastore dans la console App Engine et les définir. Voici comment:
Aller à https://console.cloud.google.com/datastore/
Sélectionnez votre projet en haut de la page s'il n'est pas déjà sélectionné.
Dans la liste déroulante Genre , sélectionnez Paramètres .
Si vous avez exécuté le code ci-dessus, vos clés s'afficheront. Ils auront tous la valeur NOT SET . Cliquez sur chacun d'eux et définissez sa valeur.
J'espère que cela t'aides!
la source
Cette solution est simple mais peut ne pas convenir à toutes les différentes équipes.
Tout d'abord, placez les variables d'environnement dans un env_variables.yaml , par exemple,
Ensuite, incluez ceci
env_variables.yaml
dans leapp.yaml
Enfin, ajoutez le
env_variables.yaml
à.gitignore
, afin que les variables secrètes n'existent pas dans le référentiel.Dans ce cas, les
env_variables.yaml
besoins doivent être partagés entre les gestionnaires de déploiement.la source
process.env.MY_SECRET_KEY
et si vous avez besoin de ces variables d'environnement dans votre environnement de développement local, vous pouvez utiliser ledotenv
package de nœudsenv_variables.yaml
arriver à toutes les instances est une pièce manquante du puzzle.gcloud app deploy
comme vous le faites normalement pour déployer sur Google Cloud. 2. Comment définir localement des variables d'environnement secrètes? Il existe de nombreuses manières. Vous pouvez simplement utiliserexport
l'invite de commande ou utiliser des outils tels que @DaveKiss suggéré.os.environ.get('SECRET')
.Mon approche consiste à stocker les secrets des clients uniquement dans l'application App Engine elle-même. Les secrets client ne sont ni dans le contrôle de code source ni sur aucun ordinateur local. Cela présente l'avantage que tout collaborateur App Engine peut déployer des modifications de code sans avoir à se soucier des secrets du client.
Je stocke les secrets des clients directement dans Datastore et j'utilise Memcache pour une latence améliorée pour accéder aux secrets. Les entités Datastore ne doivent être créées qu'une seule fois et persisteront lors des déploiements futurs. bien entendu, la console App Engine peut être utilisée pour mettre à jour ces entités à tout moment.
Il existe deux options pour effectuer la création d'entité ponctuelle:
la source
Cela n'existait pas lorsque vous avez posté, mais pour toute personne qui trébuche ici, Google propose désormais un service appelé Secret Manager .
C'est un simple service REST (avec des SDK qui l'enveloppent, bien sûr) pour stocker vos secrets dans un emplacement sécurisé sur la plate-forme cloud Google. Il s'agit d'une meilleure approche que le magasin de données, qui nécessite des étapes supplémentaires pour voir les secrets stockés et un modèle d'autorisation plus fin - vous pouvez sécuriser les secrets individuels différemment pour différents aspects de votre projet, si nécessaire.
Il offre une gestion des versions, afin que vous puissiez gérer les modifications de mot de passe avec une relative facilité, ainsi qu'une couche de requête et de gestion robuste vous permettant de découvrir et de créer des secrets au moment de l'exécution, si nécessaire.
SDK Python
Exemple d'utilisation:
la source
os.getenv('ENV_VAR')
s?SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))
. Définition de la valeur par défaut pour utiliser leaccess_secret_version
La meilleure façon de le faire est de stocker les clés dans un fichier client_secrets.json et d'exclure cela du téléchargement vers git en le listant dans votre fichier .gitignore. Si vous avez des clés différentes pour différents environnements, vous pouvez utiliser app_identity api pour déterminer l'ID de l'application et le charger de manière appropriée.
Il y a un exemple assez complet ici -> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets .
Voici un exemple de code:
la source
app.yaml
du déploiement de l'application. Des idées là-bas?app.yaml
) avec des clés secrètes et des informations confidentielles, et ce que j'aime vraiment, c'est que vous utilisez le flux de travail de Google pour accomplir la tâche. Merci @GwynHowell. =)Cette solution s'appuie sur l'appcfg.py obsolète
Vous pouvez utiliser l'option de ligne de commande -E de appcfg.py pour configurer les variables d'environnement lorsque vous déployez votre application sur GAE (mise à jour appcfg.py)
la source
gcloud
utilitaire?La plupart des réponses sont dépassées. Utiliser google cloud datastore est en fait un peu différent pour le moment. https://cloud.google.com/python/getting-started/using-cloud-datastore
Voici un exemple:
Cela suppose que le nom de l'entité est 'TWITTER_APP_KEY', le genre est 'settings' et 'value' est une propriété de l'entité TWITTER_APP_KEY.
la source
Il semble que vous puissiez faire quelques approches. Nous avons un problème similaire et faisons ce qui suit (adapté à votre cas d'utilisation):
Le moyen le plus simple de le faire est d'utiliser un serveur d'intégration continue tel que Hudson , Bamboo ou Jenkins . Ajoutez simplement un plug-in, une action de script ou un flux de travail qui effectue tous les éléments ci-dessus que j'ai mentionnés. Vous pouvez transmettre des variables d'environnement qui sont configurées dans Bamboo lui-même par exemple.
En résumé, insérez simplement les valeurs pendant votre processus de construction dans un environnement auquel vous n'avez accès que. Si vous n'automatisez pas déjà vos builds, vous devriez l'être.
Une autre option est ce que vous avez dit, mettez-le dans la base de données. Si la raison pour laquelle vous ne faites pas cela est que les choses sont trop lentes, poussez simplement les valeurs dans Memcache en tant que cache de deuxième couche et épinglez les valeurs aux instances en tant que cache de première couche. Si les valeurs peuvent changer et que vous devez mettre à jour les instances sans les redémarrer, gardez simplement un hachage que vous pouvez vérifier pour savoir quand elles changent ou le déclenchent d'une manière ou d'une autre lorsque quelque chose que vous faites change les valeurs. Ça devrait être ça.
la source
Vous devez crypter les variables avec google kms et l'intégrer dans votre code source. ( https://cloud.google.com/kms/ )
mettez la valeur brouillée (cryptée et encodée en base64) dans votre variable d'environnement (dans le fichier yaml).
Du code python pour vous aider à déchiffrer.
la source
La réponse de @Jason F basée sur l'utilisation de Google Datastore est proche, mais le code est un peu dépassé en fonction de l'exemple d'utilisation des documents de la bibliothèque . Voici l'extrait qui a fonctionné pour moi:
En partie inspiré par ce post Medium
la source
Je voulais juste noter comment j'ai résolu ce problème dans javascript / nodejs. Pour le développement local, j'ai utilisé le package npm «dotenv» qui charge les variables d'environnement d'un fichier .env dans process.env. Lorsque j'ai commencé à utiliser GAE, j'ai appris que les variables d'environnement devaient être définies dans un fichier «app.yaml». Eh bien, je ne voulais pas utiliser 'dotenv' pour le développement local et 'app.yaml' pour GAE (et dupliquer mes variables d'environnement entre les deux fichiers), j'ai donc écrit un petit script qui charge les variables d'environnement app.yaml dans le processus .env, pour le développement local. J'espère que cela aide quelqu'un:
yaml_env.js:
Incluez maintenant ce fichier le plus tôt possible dans votre code, et vous avez terminé:
la source
.env
fichier avec les variables secrètes. Je ne les duplique pas dans monapp.yaml
fichier et mon code déployé fonctionne toujours. Je m'inquiète cependant de ce qu'il advient du.env
fichier dans le cloud. Est-il crypté ou quelque chose? Comment puis-je m'assurer que personne n'accède aux.env
variables du fichier gcloud une fois qu'il est déployé?Prolonger la réponse de Martin
la source
Il existe un package pypi appelé gae_env qui vous permet d'enregistrer les variables d'environnement appengine dans Cloud Datastore. Sous le capot, il utilise également Memcache donc c'est rapide
Usage:
S'il existe une valeur pour cette clé dans la banque de données, elle sera renvoyée. S'il n'y en a pas, un enregistrement d'espace réservé
__NOT_SET__
sera créé et unValueNotSetError
sera jeté. L'exception vous rappellera d'aller dans la Developers Console et de mettre à jour l'enregistrement d'espace réservé.Semblable à la réponse de Martin, voici comment mettre à jour la valeur de la clé dans Datastore:
Accédez à la section Datastore dans la console des développeurs
Sélectionnez votre projet en haut de la page s'il n'est pas déjà sélectionné.
Dans la liste déroulante Genre , sélectionnez
GaeEnvSettings
.Les clés pour lesquelles une exception a été déclenchée auront une valeur
__NOT_SET__
.Accédez à la page GitHub du package pour plus d'informations sur l'utilisation / la configuration
la source