GAE में app.yaml के साथ सुरक्षित रूप से पर्यावरण चर का भंडारण


97

मुझे app.yamlजीएई पर तैनाती के लिए पर्यावरण चर के रूप में एपीआई कुंजी और अन्य संवेदनशील जानकारी संग्रहीत करने की आवश्यकता है । इसके साथ मुद्दा यह है कि अगर मैं app.yamlGitHub को धक्का देता हूं , तो यह जानकारी सार्वजनिक हो जाती है (अच्छी नहीं)। मैं एक डेटास्टोर में जानकारी संग्रहीत नहीं करना चाहता क्योंकि यह परियोजना के अनुरूप नहीं है। बल्कि, मैं एक फ़ाइल से उन मूल्यों को स्वैप करना चाहूंगा .gitignoreजो ऐप की प्रत्येक तैनाती पर सूचीबद्ध हैं ।

यहाँ मेरे 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}

कोई विचार?


72
मैं चाहता हूं कि GAE डेवलपर कंसोल के माध्यम से इंस्टेंस env var सेट करने का विकल्प जोड़ेगा (जैसे हर अन्य Paa जिसके साथ मैं परिचित हूं)।
स्पेन ट्रेन

4
आप डेटास्टोर का उपयोग कर सकते हैं। कृपया इस उत्तर को देखें: stackoverflow.com/a/35254560/1027846
मुस्तफा han लहान

डेटास्टोर का उपयोग करने के बारे में मस्टिलिका की टिप्पणी पर विस्तार करना। कोड के लिए नीचे दिए गए मेरे जवाब को देखें मैं ऐसा करने के लिए अपनी परियोजनाओं में उपयोग करता हूं: stackoverflow.com/a/35261091#35261091 । वास्तव में, यह आपको डेवलपर कंसोल से पर्यावरण चर को संपादित करने देता है, और प्लेसहोल्डर मान स्वचालित रूप से बनाए जाते हैं।
मार्टिन ओमेंडर

धन्यवाद मस्टिलिका और मार्टिन। हम वास्तव में डेटस्टोर दृष्टिकोण का उपयोग कर रहे हैं और मैं मानता हूं कि यह इस समस्या का सबसे अच्छा समाधान है। JSON फ़ाइल दृष्टिकोण, IMO की तुलना में CI / CD सेटअप के साथ करना आसान है।
स्पेन ट्रेन

1
2019 और जीएई ने अभी भी इस मुद्दे को तय नहीं किया है: /
जोश नू

जवाबों:


53

यदि यह संवेदनशील डेटा है, तो आपको इसे स्रोत कोड में संग्रहीत नहीं करना चाहिए क्योंकि यह स्रोत नियंत्रण में जाँच की जाएगी। गलत लोग (आपके संगठन के अंदर या बाहर) इसे वहां पा सकते हैं। साथ ही, आपका विकास परिवेश संभवतः आपके उत्पादन परिवेश से भिन्न कॉन्फ़िगरेशन मानों का उपयोग करता है। यदि इन मूल्यों को कोड में संग्रहीत किया जाता है, तो आपको विकास और उत्पादन में अलग-अलग कोड चलाना होगा, जो कि गन्दा और बुरा व्यवहार है।

अपनी परियोजनाओं में, मैंने इस वर्ग का उपयोग करके डेटास्टोर में कॉन्फ़िगर डेटा डाला:

from google.appengine.ext import ndb

class Settings(ndb.Model):
  name = ndb.StringProperty()
  value = ndb.StringProperty()

  @staticmethod
  def get(name):
    NOT_SET_VALUE = "NOT SET"
    retval = Settings.query(Settings.name == name).get()
    if not retval:
      retval = Settings()
      retval.name = name
      retval.value = NOT_SET_VALUE
      retval.put()
    if retval.value == NOT_SET_VALUE:
      raise Exception(('Setting %s not found in the database. A placeholder ' +
        'record has been created. Go to the Developers Console for your app ' +
        'in App Engine, look up the Settings record with name=%s and enter ' +
        'its value in that record\'s value field.') % (name, name))
    return retval.value

आपका आवेदन मूल्य पाने के लिए ऐसा करेगा:

API_KEY = Settings.get('API_KEY')

यदि डेटास्टोर में उस कुंजी के लिए कोई मान है, तो आपको मिल जाएगा। यदि नहीं है, तो एक प्लेसहोल्डर रिकॉर्ड बनाया जाएगा और एक अपवाद फेंक दिया जाएगा। अपवाद आपको डेवलपर कंसोल पर जाने और प्लेसहोल्डर रिकॉर्ड को अपडेट करने के लिए याद दिलाएगा।

मुझे लगता है कि यह विन्यास मूल्यों को स्थापित करने से अनुमान लगाता है। यदि आप इस बात के बारे में अनिश्चित हैं कि कौन सा कॉन्फिगर वैल्यू सेट करना है, तो कोड को रन करें और यह आपको बताएगा!

ऊपर दिए गए कोड में ndb लाइब्रेरी का उपयोग किया गया है जो हुड के नीचे मेकचे और डेटास्टर का उपयोग करता है, इसलिए यह तेज़ है।


अपडेट करें:

jelder ने ऐप इंजन कंसोल में डेटास्टोर मानों को खोजने और उन्हें सेट करने का तरीका पूछा। यहां कैसे:

  1. Https://console.cloud.google.com/datastore/ पर जाएं

  2. यदि यह पहले से ही चयनित नहीं है, तो पृष्ठ के शीर्ष पर अपनी परियोजना का चयन करें।

  3. में तरह ड्रॉपडाउन बॉक्स, चयन सेटिंग्स

  4. यदि आपने ऊपर कोड चलाया है, तो आपकी चाबियाँ दिखाई देंगी। वे सभी मूल्य सेट नहीं होंगे । प्रत्येक पर क्लिक करें और उसका मूल्य निर्धारित करें।

उम्मीद है की यह मदद करेगा!

आपकी सेटिंग, सेटिंग वर्ग द्वारा बनाई गई है

सम्पादन के लिए क्लिक करो

वास्तविक मूल्य दर्ज करें और सहेजें


2
सभी प्रदान किए गए उत्तरों में से, यह निकटतम लगता है कि हरोकू चीजों को कैसे संभालता है। जीएई के बजाय नया होने के नाते, मुझे समझ में नहीं आता है कि डेवलपर्स कंसोल में प्लेसहोल्डर रिकॉर्ड कहां पाया जाता है। क्या आप समझा सकते हैं, या बोनस अंक के लिए स्क्रीनशॉट पोस्ट कर सकते हैं?
jelder

2
बांध ~… gcloud के लिए सभी उचित सम्मान के साथ, इस विशिष्ट आवश्यकता के लिए किसी अन्य सेवा का उपयोग करना काफी बुरा लगता है। इसके अलावा, Google फायरबस फंक्शंस के भीतर env vars के लिए "100% -herokuish" दृष्टिकोण प्रदान करता है, लेकिन gcloud फ़ंक्शंस के लिए नहीं है (कम से कम undocumented ... अगर मैं गलत नहीं हूँ)
बेन 14

1
यहां आपके दृष्टिकोण के आधार पर एक जिस्ट है,
स्पेन ट्रेन

3
@ बॉन नॉन-फायरबेस फ़ंक्शंस env vars (अब, कम से कम) का समर्थन करते हैं।
NReilingh

3
@obl - एक ऐप इंजन ऐप स्वचालित रूप से अपने स्वयं के डेटास्टोर में प्रमाणित है, कोई प्रमाणीकरण विवरण की आवश्यकता नहीं है। यह बहुत साफ है :-)
मार्टिन ओमैंडर

46

यह समाधान सरल है, लेकिन सभी अलग-अलग टीमों के अनुरूप नहीं हो सकता है।

सबसे पहले, पर्यावरण चर को env_variables.yaml में रखें , जैसे,

env_variables:
  SECRET: 'my_secret'

फिर, इस में शामिल हैं env_variables.yamlमेंapp.yaml

includes:
  - env_variables.yaml

अंत में, जोड़ने env_variables.yamlके लिए .gitignoreहै, ताकि गुप्त चर भंडार में मौजूद नहीं होगा।

इस मामले में, env_variables.yamlतैनाती प्रबंधकों के बीच साझा करने की आवश्यकता है।


1
बस जोड़ने के लिए कुछ करने के लिए स्पष्ट नहीं हो सकता है क्या, अपने वातावरण चर तो में पाया जा होगा process.env.MY_SECRET_KEYऔर आप नोड का उपयोग कर सकते है अगर आप अपने स्थानीय देव वातावरण में इन वातावरण चर की जरूरत dotenvपैकेज
डेव चुंबन

2
env_variables.yamlसभी उदाहरणों के लिए पहेली का एक गायब टुकड़ा कैसे होगा ।
क्रिस्टोफर ओजबेक

भी: स्थानीय रूप से इसका उपयोग कैसे करें?
क्रिस्टोफर ओजबेक

@ChristopherOezbek 1. कैसे तैनात करें? जैसा gcloud app deployकि आप सामान्य रूप से Google क्लाउड पर लागू करने के लिए करते हैं, वैसे ही उपयोग करें । 2. स्थानीय स्तर पर गुप्त पर्यावरण चर कैसे सेट करें? बहुत से रास्ते हैं। तुम बस का उपयोग कर सकते exportकमांड प्रॉम्प्ट में या किसी उपकरण का उपयोग @DaveKiss तरह का सुझाव दिया।
शिह-वेन सु

यह सबसे सरल उपाय है। राज आपके आवेदन के माध्यम से पहुँचा जा सकता है os.environ.get('SECRET')
क्विन कॉमेंडेंट

19

मेरा दृष्टिकोण केवल ऐप इंजन ऐप के भीतर क्लाइंट रहस्यों को संग्रहीत करना है। क्लाइंट रहस्य न तो स्रोत नियंत्रण में हैं और न ही किसी स्थानीय कंप्यूटर पर। इसका यह लाभ है कि कोई भी App Engine सहयोगी क्लाइंट के रहस्यों के बारे में चिंता किए बिना कोड में बदलाव कर सकता है।

मैं सीधे दातास्तूर में ग्राहक रहस्यों को संग्रहीत करता हूं और रहस्यों को प्राप्त करने में सुधार की विलंबता के लिए मेम्चे का उपयोग करता हूं। डेटास्टोर इकाइयाँ केवल एक बार बनाने की आवश्यकता होती हैं और भविष्य के डिप्लॉयस में बनी रहेंगी। बेशक इन इंजनों को किसी भी समय अपडेट करने के लिए ऐप इंजन कंसोल का उपयोग किया जा सकता है।

एक बार की इकाई निर्माण करने के लिए दो विकल्प हैं:

  • संस्थाओं को बनाने के लिए ऐप इंजन रिमोट एपीआई इंटरेक्टिव शेल का उपयोग करें।
  • एक व्यवस्थापक केवल हैंडलर बनाएँ जो डमी मूल्यों के साथ संस्थाओं को इनिशियलाइज़ करेगा। मैन्युअल रूप से इस व्यवस्थापक हैंडलर को लागू करें, फिर उत्पादन क्लाइंट रहस्यों के साथ संस्थाओं को अपडेट करने के लिए ऐप इंजन कंसोल का उपयोग करें।

7
जटिल बिलकुल नहीं। धन्यवाद ऐप इंजन।
कोर्टिमेस

16

इसे करने का सबसे अच्छा तरीका, एक client_secrets.json फ़ाइल में कुंजियों को संग्रहीत करना है, और इसे आपकी .itignore फ़ाइल में सूचीबद्ध करके git पर अपलोड होने से बाहर रखा गया है। यदि आपके पास विभिन्न वातावरणों के लिए अलग-अलग कुंजियाँ हैं, तो आप ऐप आईडी क्या है, यह निर्धारित करने के लिए app_identity एपीआई का उपयोग कर सकते हैं और उचित रूप से लोड कर सकते हैं।

यहाँ एक काफी व्यापक उदाहरण है -> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets

यहाँ कुछ उदाहरण कोड है:

# declare your app ids as globals ...
APPID_LIVE = 'awesomeapp'
APPID_DEV = 'awesomeapp-dev'
APPID_PILOT = 'awesomeapp-pilot'

# create a dictionary mapping the app_ids to the filepaths ...
client_secrets_map = {APPID_LIVE:'client_secrets_live.json',
                      APPID_DEV:'client_secrets_dev.json',
                      APPID_PILOT:'client_secrets_pilot.json'}

# get the filename based on the current app_id ...
client_secrets_filename = client_secrets_map.get(
    app_identity.get_application_id(),
    APPID_DEV # fall back to dev
    )

# use the filename to construct the flow ...
flow = flow_from_clientsecrets(filename=client_secrets_filename,
                               scope=scope,
                               redirect_uri=redirect_uri)

# or, you could load up the json file manually if you need more control ...
f = open(client_secrets_filename, 'r')
client_secrets = json.loads(f.read())
f.close()

2
निश्चित रूप से सही दिशा में है, लेकिन यह app.yamlऐप की तैनाती पर मूल्यों की अदला-बदली के मुद्दे को संबोधित नहीं करता है । वहाँ कोई विचार?
बेन

1
तो प्रत्येक वातावरण के लिए एक अलग client_secrets फ़ाइल है। जैसे client_secrets_live.json, client_secrets_dev.json, client_secrets_pilot.json आदि, फिर यह निर्धारित करने के लिए कि आप किस सर्वर पर हैं और उचित json फ़ाइल को लोड करने के लिए अजगर तर्क का उपयोग करें। App_identity.get_application_id () विधि आपके द्वारा सर्वर पर पता लगाने के लिए उपयोगी हो सकती है। क्या इस तरह का मतलब है?
ग्विन होवेल

@BenGrunfeld मेरा जवाब देखें। मेरा समाधान ठीक यही करता है। मैं यह नहीं देखता कि यह उत्तर कैसे प्रश्न हल करता है। मेरा मानना ​​है कि लक्ष्य को गुप्त विन्यास से बाहर रखना है, और तैनाती के हिस्से के रूप में गिट का उपयोग करना है। यहाँ, इस फ़ाइल को अभी भी कहीं और होना चाहिए और तैनाती प्रक्रिया में धकेल दिया जाएगा। यह कुछ ऐसा हो सकता है जिसे आप अपने ऐप में करते हैं, लेकिन आप सिर्फ मेरे द्वारा हाइलाइट की गई तकनीकों का उपयोग करेंगे, यदि आप इस बनाम ऐप का उपयोग करना चाहते हैं, तो शायद दूसरी फाइल में स्टोर करें। अगर मैं इस प्रश्न को समझता हूं, तो यह पुस्तकालय निर्माता के वास्तविक ग्राहक गुप्त या ठेस के साथ एक ओपन सोर्स ऐप को शिपिंग करने के लिए कुछ है। चाभी।
therewillbesnacks

1
मुझे अपना सिर इसके चारों ओर लाने में थोड़ा समय लगा, लेकिन मुझे लगता है कि यह सही तरीका है। आप app.yamlगुप्त कुंजी और गोपनीय जानकारी के साथ एप्लिकेशन सेटिंग ( ) नहीं मिला रहे हैं , और मुझे वास्तव में जो पसंद है वह यह है कि आप कार्य को पूरा करने के लिए Google वर्कफ़्लो का उपयोग कर रहे हैं। धन्यवाद @GwynHowell =)
बेन

1
इसी तरह का दृष्टिकोण उस JSON फ़ाइल को ऐप के डिफ़ॉल्ट GCS बाल्टी ( क्लाउड . google.com/appengine/docs/standard/python/… ) में एक ज्ञात स्थान पर रखना होगा ।
स्पेन ट्रेन

16

आपके द्वारा पोस्ट किए जाने पर यह मौजूद नहीं था, लेकिन किसी और के लिए जो यहां ठोकर खाता है, Google अब सीक्रेट मैनेजर नामक एक सेवा प्रदान करता है ।

Google क्लाउड प्लेटफ़ॉर्म पर एक सुरक्षित स्थान पर अपने रहस्यों को संग्रहीत करने के लिए यह एक सरल रीस्ट सेवा है (एसडीके इसे लपेटकर, निश्चित रूप से)। यह डेटा स्टोर की तुलना में बेहतर दृष्टिकोण है, संग्रहीत रहस्यों को देखने के लिए अतिरिक्त चरणों की आवश्यकता होती है और एक महीन-दाने वाली अनुमति मॉडल होता है - यदि आपको ज़रूरत है तो आप अपनी परियोजना के विभिन्न पहलुओं के लिए अलग-अलग रहस्यों को सुरक्षित कर सकते हैं।

यह संस्करण प्रदान करता है, इसलिए आप पासवर्ड परिवर्तन को सापेक्ष आसानी से संभाल सकते हैं, साथ ही साथ एक मजबूत क्वेरी और प्रबंधन परत को सक्षम कर सकते हैं और यदि आवश्यक हो तो रनटाइम पर रहस्य बनाने में सक्षम हो सकते हैं।

अजगर एसडीके

उदाहरण का उपयोग:

from google.cloud import secretmanager_v1beta1 as secretmanager

secret_id = 'my_secret_key'
project_id = 'my_project'
version = 1    # use the management tools to determine version at runtime

client = secretmanager.SecretManagerServiceClient()

secret_path = client.secret_verion_path(project_id, secret_id, version)
response = client.access_secret_version(secret_path)
password_string = response.payload.data.decode('UTF-8')

# use password_string -- set up database connection, call third party service, whatever

3
यह नया सही उत्तर होना चाहिए। गुप्त प्रबंधक अभी भी बीटा में है, लेकिन पर्यावरण चर के साथ काम करते समय यह आगे का रास्ता है।
किंग लियोन

@KingLeon, इस का उपयोग करने के लिए os.getenv('ENV_VAR')एस का एक गुच्छा refactor होने का मतलब होगा ?
अलेजांद्रो

मैं एक फ़ंक्शन में ऊपर के समान कोड डालता हूं, फिर मैं कुछ का उपयोग करता हूं SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))access_secret_version
किंग लियोन

इसके अलावा, मैं django-environ का उपयोग कर रहा हूं। github.com/joke2k/django-environ
किंग लियोन

15

यह समाधान deprecated appcfg.py पर निर्भर करता है

जब आप अपने ऐप को GAE (appcfg.py अपडेट) में तैनात करते हैं तो पर्यावरण चर को सेटअप करने के लिए आप appcfg.py के ई कमांड लाइन विकल्प का उपयोग कर सकते हैं

$ appcfg.py
...
-E NAME:VALUE, --env_variable=NAME:VALUE
                    Set an environment variable, potentially overriding an
                    env_variable value from app.yaml file (flag may be
                    repeated to set multiple variables).
...

क्या आप तैनाती के बाद उन पर्यावरण चर को क्वेरी कर सकते हैं? (मुझे आशा है कि नहीं।)
Ztyx

क्या gcloudउपयोगिता का उपयोग करके इस तरह पर्यावरण चर को पारित करने का एक तरीका है ?
ट्रेवर

6

अधिकांश उत्तर पुराने हैं। Google क्लाउड डेटास्टोर का उपयोग करना वास्तव में थोड़ा अलग है। https://cloud.google.com/python/getting-started/using-cloud-datastore

यहाँ एक उदाहरण है:

from google.cloud import datastore
client = datastore.Client()
datastore_entity = client.get(client.key('settings', 'TWITTER_APP_KEY'))
connection_string_prod = datastore_entity.get('value')

यह मानता है कि इकाई का नाम 'TWITTER_APP_KEY' है, जिस प्रकार की 'सेटिंग' है, और 'मान' TWITTER_APP_KEY इकाई की एक संपत्ति है।


3

ऐसा लगता है कि आप कुछ दृष्टिकोण कर सकते हैं। हमारे पास एक समान मुद्दा है और निम्नलिखित करें (आपके उपयोग-मामले के लिए अनुकूलित):

  • एक ऐसी फाइल बनाएं जो किसी भी डायनामिक ऐप को स्टोर करती हो। अपने वैल्यू को अपने बिल्ड माहौल में सुरक्षित सर्वर पर रखें। यदि आप वास्तव में पागल हैं, तो आप मूल्यों को असममित रूप से एन्क्रिप्ट कर सकते हैं। आप इसे एक निजी रेपो में भी रख सकते हैं यदि आपको संस्करण नियंत्रण / डायनेमिक पुलिंग की आवश्यकता है, या इसे कॉपी करने के लिए एक शेल स्क्रिप्ट का उपयोग करें या इसे उपयुक्त स्थान से खींचें।
  • परिनियोजन स्क्रिप्ट के दौरान गिट से खींचो
  • गिट पुल के बाद, एक यम लाइब्रेरी का उपयोग करके शुद्ध अजगर में इसे पढ़कर और लिखकर app.yaml को संशोधित करें

ऐसा करने का सबसे आसान तरीका हडसन , बांस या जेनकिंस जैसे निरंतर एकीकरण सर्वर का उपयोग करना है । बस कुछ प्लग-इन, स्क्रिप्ट चरण, या वर्कफ़्लो जोड़ें जो उपरोक्त सभी आइटम जो मैंने उल्लेख किया है। आप पर्यावरण चर में पारित कर सकते हैं जो उदाहरण के लिए बांस में ही कॉन्फ़िगर किए गए हैं।

सारांश में, केवल आपके द्वारा उपयोग किए जाने वाले वातावरण में अपनी निर्माण प्रक्रिया के दौरान मूल्यों में धक्का दें। यदि आप पहले से ही अपने बिल्ड को स्वचालित नहीं कर रहे हैं, तो आपको होना चाहिए।

एक अन्य विकल्प विकल्प जो आपने कहा है, उसे डेटाबेस में डालें। यदि ऐसा न करने का आपका कारण यह है कि चीजें बहुत धीमी हैं, तो बस 2-परत कैश के रूप में मानों को मेमकेच में धकेल दें, और मूल्यों को पहली-परत कैश के रूप में पिन करें। यदि मान बदल सकते हैं और आपको उन्हें रिबूट किए बिना इंस्टेंस को अपडेट करने की आवश्यकता है, तो बस एक हैश रखें जिसे आप यह जान सकते हैं कि जब वे बदलते हैं या इसे किसी तरह से ट्रिगर करते हैं तो आप मूल्यों को बदल देते हैं। यही होना चाहिए।


1
एफडब्ल्यूआईडब्ल्यू, यह दृष्टिकोण 12 फैक्टर ऐप दिशानिर्देशों ( 12factor.net ) में कॉन्फ़िगरेशन कारक का सबसे निकट से अनुसरण करता है
स्पेन ट्रेन

3

आपको Google किलोमीटर के साथ चर को एन्क्रिप्ट करना चाहिए और इसे अपने स्रोत कोड में एम्बेड करना चाहिए। ( https://cloud.google.com/kms/ )

echo -n the-twitter-app-key | gcloud kms encrypt \
> --project my-project \
> --location us-central1 \
> --keyring THEKEYRING \
> --key THECRYPTOKEY \
> --plaintext-file - \
> --ciphertext-file - \
> | base64

अपने पर्यावरण चर (yaml फ़ाइल में) को तले हुए (एन्क्रिप्टेड और base64 एन्कोडेड) मान में रखें।

आपको डिक्रिप्ट करने पर आरंभ करने के लिए कुछ पायथन कोड।

kms_client = kms_v1.KeyManagementServiceClient()
name = kms_client.crypto_key_path_path("project", "global", "THEKEYRING", "THECRYPTOKEY")

twitter_app_key = kms_client.decrypt(name, base64.b64decode(os.environ.get("TWITTER_APP_KEY"))).plaintext

3

Google डेटास्टोर का उपयोग करने के आधार पर @ जैसन एफ का उत्तर करीब है, लेकिन लाइब्रेरी डॉक्स पर नमूना उपयोग के आधार पर कोड थोड़ा पुराना है । यहाँ मेरे लिए काम करने वाला स्निपेट है:

from google.cloud import datastore

client = datastore.Client('<your project id>')
key = client.key('<kind e.g settings>', '<entity name>') # note: entity name not property
# get by key for this entity
result = client.get(key)
print(result) # prints all the properties ( a dict). index a specific value like result['MY_SECRET_KEY'])

आंशिक रूप से इस माध्यम पोस्ट से प्रेरित है


2

बस यह नोट करना चाहता था कि मैंने जावास्क्रिप्ट / नोडज में इस समस्या को कैसे हल किया। स्थानीय विकास के लिए मैंने 'dotenv' npm पैकेज का उपयोग किया जो एक .env फ़ाइल से पर्यावरण चर को प्रक्रिया में लोड करता है ।env। जब मैंने GAE का उपयोग करना शुरू किया, तो मुझे पता चला कि पर्यावरण चर को एक 'app.yaml' फ़ाइल में सेट करने की आवश्यकता है। खैर, मैं स्थानीय विकास के लिए 'dotenv' और GAE के लिए 'app.yaml' का उपयोग नहीं करना चाहता था (और दो फ़ाइलों के बीच अपने पर्यावरण चर की नकल करता हूं), इसलिए मैंने एक छोटी सी स्क्रिप्ट लिखी है जो app.yaml पर्यावरण चर को प्रक्रिया में लोड करती है .env, स्थानीय विकास के लिए। उम्मीद है कि यह किसी की मदद करता है:

yaml_env.js:

(function () {
    const yaml = require('js-yaml');
    const fs = require('fs');
    const isObject = require('lodash.isobject')

    var doc = yaml.safeLoad(
        fs.readFileSync('app.yaml', 'utf8'), 
        { json: true }
    );

    // The .env file will take precedence over the settings the app.yaml file
    // which allows me to override stuff in app.yaml (the database connection string (DATABASE_URL), for example)
    // This is optional of course. If you don't use dotenv then remove this line:
    require('dotenv/config');

    if(isObject(doc) && isObject(doc.env_variables)) {
        Object.keys(doc.env_variables).forEach(function (key) {
            // Dont set environment with the yaml file value if it's already set
            process.env[key] = process.env[key] || doc.env_variables[key]
        })
    }
})()

अब इस फ़ाइल को अपने कोड में यथाशीघ्र शामिल करें, और आपका काम हो गया:

require('../yaml_env')

क्या अभी भी यही मामला है? क्योंकि मैं .envगुप्त चर वाली फाइल का उपयोग कर रहा हूं । मैं उन्हें अपनी app.yamlफ़ाइल में डुप्लिकेट नहीं कर रहा हूं और मेरा तैनात कोड अभी भी काम करता है। मैं चिंतित हूं .envकि क्लाउड में फ़ाइल के साथ क्या होता है । क्या यह एन्क्रिप्टेड या कुछ और मिलता है? एक .envबार तैनात होने के बाद मैं यह कैसे सुनिश्चित कर सकता हूं कि कोई भी gcloud फ़ाइल चर का उपयोग न करे ?
गूस

यह बिल्कुल भी आवश्यक नहीं है क्योंकि GAE स्वतः ही app.yaml फ़ाइल में परिभाषित सभी चर नोड वातावरण में जोड़ता है। मूल रूप से यह वही है जो डॉटेनव .env पैकेज में परिभाषित चर के साथ करता है। लेकिन मैं सोच रहा हूँ कि आपको सीडी कैसे सेट करनी है क्योंकि आप किसी वीसीएस या पाइप लाइन में
एनवी वर्जन के साथ app.yaml

1

मार्टिन के जवाब का विस्तार

from google.appengine.ext import ndb

class Settings(ndb.Model):
    """
    Get sensitive data setting from DataStore.

    key:String -> value:String
    key:String -> Exception

    Thanks to: Martin Omander @ Stackoverflow
    https://stackoverflow.com/a/35261091/1463812
    """
    name = ndb.StringProperty()
    value = ndb.StringProperty()

    @staticmethod
    def get(name):
        retval = Settings.query(Settings.name == name).get()
        if not retval:
            raise Exception(('Setting %s not found in the database. A placeholder ' +
                             'record has been created. Go to the Developers Console for your app ' +
                             'in App Engine, look up the Settings record with name=%s and enter ' +
                             'its value in that record\'s value field.') % (name, name))
        return retval.value

    @staticmethod
    def set(name, value):
        exists = Settings.query(Settings.name == name).get()
        if not exists:
            s = Settings(name=name, value=value)
            s.put()
        else:
            exists.value = value
            exists.put()

        return True

1

Ge_env नामक एक pypi पैकेज है जो आपको क्लाउड डेटास्टोर में एपेंजिन के पर्यावरण चर को बचाने की अनुमति देता है। हुड के तहत, यह भी तेजी से मेम्चे का उपयोग करता है

उपयोग:

import gae_env

API_KEY = gae_env.get('API_KEY')

यदि डेटास्टोर में उस कुंजी के लिए कोई मान है, तो उसे वापस कर दिया जाएगा। यदि ऐसा नहीं है, तो एक प्लेसहोल्डर रिकॉर्ड बनाया __NOT_SET__जाएगा और ValueNotSetErrorउसे फेंक दिया जाएगा। अपवाद आपको डेवलपर कंसोल पर जाने और प्लेसहोल्डर रिकॉर्ड को अपडेट करने के लिए याद दिलाएगा ।


मार्टिन के जवाब के समान, यहां बताया गया है कि डेटास्टोर में कुंजी का मान कैसे अपडेट करें:

  1. डेवलपर्स कंसोल में डेटास्टोर अनुभाग पर जाएं

  2. यदि यह पहले से ही चयनित नहीं है, तो पृष्ठ के शीर्ष पर अपनी परियोजना का चयन करें।

  3. में तरह ड्रॉपडाउन बॉक्स का चयन करें GaeEnvSettings

  4. कुंजी जिसके लिए एक अपवाद उठाया गया था, उसका मूल्य होगा __NOT_SET__

आपकी सेटिंग, सेटिंग वर्ग द्वारा बनाई गई है

सम्पादन के लिए क्लिक करो

वास्तविक मूल्य दर्ज करें और सहेजें


पर जाएं पैकेज के GitHub पेज उपयोग / विन्यास पर अधिक जानकारी के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.