Ich muss API-Schlüssel und andere vertrauliche Informationen app.yaml
als Umgebungsvariablen für die Bereitstellung auf GAE speichern . Das Problem dabei ist, dass app.yaml
diese Informationen öffentlich werden (nicht gut) , wenn ich auf GitHub pushe. Ich möchte die Informationen nicht in einem Datenspeicher speichern, da sie nicht zum Projekt passen. Vielmehr möchte ich die Werte aus einer Datei austauschen, die in .gitignore
jeder Bereitstellung der App aufgeführt ist.
Hier ist meine app.yaml Datei:
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}
Irgendwelche Ideen?
Antworten:
Wenn es sich um vertrauliche Daten handelt, sollten Sie diese nicht im Quellcode speichern, da sie in die Quellcodeverwaltung eingecheckt werden. Die falschen Personen (innerhalb oder außerhalb Ihrer Organisation) können es dort finden. Außerdem verwendet Ihre Entwicklungsumgebung wahrscheinlich andere Konfigurationswerte als Ihre Produktionsumgebung. Wenn diese Werte im Code gespeichert sind, müssen Sie in Entwicklung und Produktion unterschiedlichen Code ausführen, was chaotisch und schlecht ist.
In meinen Projekten habe ich Konfigurationsdaten mit dieser Klasse in den Datenspeicher eingefügt:
Ihre Anwendung würde dies tun, um einen Wert zu erhalten:
Wenn der Datenspeicher einen Wert für diesen Schlüssel enthält, erhalten Sie ihn. Ist dies nicht der Fall, wird ein Platzhalterdatensatz erstellt und eine Ausnahme ausgelöst. Die Ausnahme erinnert Sie daran, zur Entwicklerkonsole zu wechseln und den Platzhalterdatensatz zu aktualisieren.
Ich finde, dies erleichtert das Erraten der Einstellung von Konfigurationswerten. Wenn Sie sich nicht sicher sind, welche Konfigurationswerte eingestellt werden sollen, führen Sie einfach den Code aus und er wird es Ihnen sagen!
Der obige Code verwendet die ndb-Bibliothek, die Memcache und den Datenspeicher unter der Haube verwendet, also ist es schnell.
Aktualisieren:
jelder fragte, wie die Datenspeicherwerte in der App Engine-Konsole gefunden und festgelegt werden könnten. Hier ist, wie:
Gehen Sie zu https://console.cloud.google.com/datastore/
Wählen Sie Ihr Projekt oben auf der Seite aus, falls es noch nicht ausgewählt ist.
Wählen Sie im Dropdown-Feld Art die Option Einstellungen .
Wenn Sie den obigen Code ausgeführt haben, werden Ihre Schlüssel angezeigt. Sie haben alle den Wert NOT SET . Klicken Sie auf jeden und legen Sie seinen Wert fest.
Hoffe das hilft!
quelle
Diese Lösung ist einfach, eignet sich jedoch möglicherweise nicht für alle Teams.
Fügen Sie zunächst die Umgebungsvariablen in eine env_variables.yaml ein , z.
Fügen Sie dies dann
env_variables.yaml
in dieapp.yaml
Fügen Sie abschließend das
env_variables.yaml
to hinzu.gitignore
, damit die geheimen Variablen nicht im Repository vorhanden sind.In diesem Fall
env_variables.yaml
müssen die Bereitstellungsmanager gemeinsam genutzt werden.quelle
process.env.MY_SECRET_KEY
und wenn Sie diese Umgebungsvariablen in Ihrem lokalen Entwickler - Umgebung benötigen , können Sie den Knoten verwendendotenv
Paketenv_variables.yaml
Erreichen aller Instanzen ein fehlendes Puzzleteil sein?gcloud app deploy
Sie es einfach wie gewohnt, um es in Google Cloud bereitzustellen. 2. Wie werden geheime Umgebungsvariablen lokal festgelegt? Es gibt viele Wege. Sie können einfachexport
die Eingabeaufforderung verwenden oder Tools wie @DaveKiss vorschlagen.os.environ.get('SECRET')
.Mein Ansatz ist es, Kundengeheimnisse zu speichern nur in der App Engine-App selbst . Die Client-Geheimnisse befinden sich weder in der Quellcodeverwaltung noch auf lokalen Computern. Dies hat den Vorteil, dass jeder App Engine-Mitarbeiter Codeänderungen bereitstellen kann, ohne sich um die Client-Geheimnisse kümmern zu müssen.
Ich speichere Client-Geheimnisse direkt im Datenspeicher und verwende Memcache für eine verbesserte Latenz beim Zugriff auf die Geheimnisse. Die Datenspeicherentitäten müssen nur einmal erstellt werden und bleiben auch bei zukünftigen Bereitstellungen bestehen. Natürlich kann die App Engine-Konsole verwendet werden, um diese Entitäten jederzeit zu aktualisieren.
Es gibt zwei Möglichkeiten, um die einmalige Entitätserstellung durchzuführen:
quelle
Der beste Weg, dies zu tun, besteht darin, die Schlüssel in einer client_secrets.json-Datei zu speichern und diese vom Hochladen auf git auszuschließen, indem Sie sie in Ihrer .gitignore-Datei auflisten. Wenn Sie unterschiedliche Schlüssel für unterschiedliche Umgebungen haben, können Sie mit der API app_identity die App-ID ermitteln und entsprechend laden.
Hier finden Sie ein ziemlich umfassendes Beispiel -> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets .
Hier ist ein Beispielcode:
quelle
app.yaml
Bereitstellung der App. Irgendwelche Ideen da?app.yaml
) nicht mit geheimen Schlüsseln und vertraulichen Informationen, und ich mag es wirklich, dass Sie den Google-Workflow verwenden, um die Aufgabe auszuführen. Danke @GwynHowell. =)Dies gab es beim Posten noch nicht, aber für alle anderen, die hier stolpern, bietet Google jetzt einen Dienst namens Secret Manager an .
Es ist ein einfacher REST-Service (natürlich mit SDKs), um Ihre Geheimnisse an einem sicheren Ort auf der Google Cloud-Plattform zu speichern. Dies ist ein besserer Ansatz als der Datenspeicher, da zusätzliche Schritte erforderlich sind, um die gespeicherten Geheimnisse anzuzeigen, und über ein detaillierteres Berechtigungsmodell verfügen. Sie können einzelne Geheimnisse für verschiedene Aspekte Ihres Projekts bei Bedarf unterschiedlich sichern.
Es bietet eine Versionierung, sodass Sie Kennwortänderungen relativ einfach verarbeiten können, sowie eine robuste Abfrage- und Verwaltungsebene, mit der Sie bei Bedarf zur Laufzeit Geheimnisse entdecken und erstellen können.
Python SDK
Anwendungsbeispiel:
quelle
os.getenv('ENV_VAR')
s umgestalten zu müssen ?SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))
. Festlegen der Standardeinstellung für die Verwendung vonaccess_secret_version
Diese Lösung basiert auf der veralteten appcfg.py
Sie können die Befehlszeilenoption -E von appcfg.py verwenden, um die Umgebungsvariablen einzurichten, wenn Sie Ihre App für GAE bereitstellen (appcfg.py-Update).
quelle
gcloud
Dienstprogramm wie folgt zu übergeben?Die meisten Antworten sind veraltet. Die Verwendung des Google Cloud-Datenspeichers ist derzeit etwas anders. https://cloud.google.com/python/getting-started/using-cloud-datastore
Hier ist ein Beispiel:
Dies setzt voraus, dass der Entitätsname 'TWITTER_APP_KEY' ist, die Art 'settings' ist und 'value' eine Eigenschaft der Entität TWITTER_APP_KEY ist.
quelle
Es hört sich so an, als könnten Sie ein paar Ansätze machen. Wir haben ein ähnliches Problem und gehen wie folgt vor (angepasst an Ihren Anwendungsfall):
Der einfachste Weg, dies zu tun, ist die Verwendung eines kontinuierlichen Integrationsservers wie Hudson , Bamboo oder Jenkins . Fügen Sie einfach ein Plug-In, einen Skriptschritt oder einen Workflow hinzu, der alle oben genannten Elemente ausführt. Sie können Umgebungsvariablen übergeben, die beispielsweise in Bamboo selbst konfiguriert sind.
Zusammenfassend lässt sich sagen, dass Sie die Werte während des Erstellungsprozesses in einer Umgebung eingeben, auf die Sie nur Zugriff haben. Wenn Sie Ihre Builds noch nicht automatisieren, sollten Sie dies tun.
Eine andere Option Option ist, was Sie gesagt haben, setzen Sie es in die Datenbank. Wenn Sie dies nicht tun, weil die Dinge zu langsam sind, verschieben Sie die Werte einfach als Cache der zweiten Ebene in den Memcache und heften Sie die Werte als Cache der ersten Ebene an die Instanzen an. Wenn sich die Werte ändern können und Sie die Instanzen aktualisieren müssen, ohne sie neu zu starten, behalten Sie einfach einen Hash bei, den Sie überprüfen können, um zu wissen, wann sie sich ändern, oder lösen Sie ihn irgendwie aus, wenn Sie die Werte ändern. Das sollte es sein.
quelle
Sie sollten die Variablen mit Google KMS verschlüsseln und in Ihren Quellcode einbetten. ( https://cloud.google.com/kms/ )
Fügen Sie den verschlüsselten (verschlüsselten und base64-codierten) Wert in Ihre Umgebungsvariable (in der Yaml-Datei) ein.
Einige Python-Codes, mit denen Sie mit dem Entschlüsseln beginnen können.
quelle
Die Antwort von @Jason F, die auf der Verwendung von Google Datastore basiert, ist knapp, aber der Code ist aufgrund der Beispielverwendung in den Bibliotheksdokumenten etwas veraltet . Hier ist der Ausschnitt, der für mich funktioniert hat:
Teilweise inspiriert von diesem Medium-Beitrag
quelle
Ich wollte nur wissen, wie ich dieses Problem in Javascript / NodeJS gelöst habe. Für die lokale Entwicklung habe ich das Paket 'dotenv' npm verwendet, das Umgebungsvariablen aus einer .env-Datei in process.env lädt. Als ich anfing, GAE zu verwenden, habe ich gelernt, dass Umgebungsvariablen in einer 'app.yaml'-Datei festgelegt werden müssen. Nun, ich wollte nicht 'dotenv' für die lokale Entwicklung und 'app.yaml' für GAE verwenden (und meine Umgebungsvariablen zwischen den beiden Dateien duplizieren), also habe ich ein kleines Skript geschrieben, das die Umgebungsvariablen app.yaml in den Prozess lädt .env, für die lokale Entwicklung. Hoffe das hilft jemandem:
yaml_env.js:
Fügen Sie diese Datei nun so früh wie möglich in Ihren Code ein, und Sie sind fertig:
quelle
.env
Datei mit den geheimen Variablen verwende. Ich dupliziere sie nicht in meinerapp.yaml
Datei und mein bereitgestellter Code funktioniert immer noch. Ich mache mir allerdings Sorgen, was mit der.env
Datei in der Cloud passiert . Wird es verschlüsselt oder so? Wie kann ich sicherstellen, dass nach der Bereitstellung niemand auf die.env
Variablen der gcloud- Datei zugreift ?Martins Antwort erweitern
quelle
Es gibt ein Pypi-Paket namens gae_env , mit dem Sie Appengine-Umgebungsvariablen im Cloud-Datenspeicher speichern können. Unter der Haube verwendet es auch Memcache, so dass es schnell ist
Verwendung:
Wenn der Datenspeicher einen Wert für diesen Schlüssel enthält, wird dieser zurückgegeben. Ist dies nicht der
__NOT_SET__
Fall , wird ein Platzhalterdatensatz erstellt und einValueNotSetError
geworfen. Die Ausnahme erinnert Sie daran, zur Entwicklerkonsole zu wechseln und den Platzhalterdatensatz zu aktualisieren.Ähnlich wie bei Martins Antwort können Sie den Wert für den Schlüssel im Datenspeicher wie folgt aktualisieren:
Wechseln Sie in der Entwicklerkonsole zum Abschnitt Datenspeicher
Wählen Sie Ihr Projekt oben auf der Seite aus, falls es noch nicht ausgewählt ist.
Wählen Sie im Dropdown-Feld Art die Option aus
GaeEnvSettings
.Schlüssel, für die eine Ausnahme ausgelöst wurde, haben Wert
__NOT_SET__
.Weitere Informationen zur Verwendung / Konfiguration finden Sie auf der GitHub-Seite des Pakets
quelle