নিরাপদে অ্যাপ্লিকেশন। আইএমএল দ্বারা জিএইতে পরিবেশের ভেরিয়েবলগুলি সংরক্ষণ করে


101

আমাকে app.yamlজিএইতে মোতায়েনের জন্য পরিবেশগত পরিবর্তনশীল হিসাবে এপিআই কীগুলি এবং অন্যান্য সংবেদনশীল তথ্য সংরক্ষণ করতে হবে । এটির সাথে সমস্যাটি হ'ল আমি যদি app.yamlগিটহাবের দিকে চাপ দিই , তবে এই তথ্যটি সর্বজনীন হয় (ভাল নয়)। আমি ডেটাস্টোরে তথ্য সংরক্ষণ করতে চাই না কারণ এটি প্রকল্পের সাথে খাপ খায় না। পরিবর্তে, আমি .gitignoreঅ্যাপ্লিকেশানের প্রতিটি স্থাপনার তালিকায় থাকা ফাইল থেকে মানগুলি সরিয়ে নিতে চাই ।

এখানে আমার অ্যাপ্লিকেশন। আইএমএল ফাইল:

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}

কোন ধারনা?


77
আমি আশা করি GAE বিকাশকারী কনসোলের মাধ্যমে উদাহরণস্বরূপ এনভ ভার্স সেট করার বিকল্প যুক্ত করবে (প্রতিটি প্যাএস যার সাথে আমি পরিচিত)।
স্পেন ট্রেন

4
আপনি ডেটাস্টোর ব্যবহার করতে পারেন। দয়া করে এই উত্তরটি দেখুন: stackoverflow.com/a/35254560/1027846
মোস্তফা İlhan

ডেটাস্টোর ব্যবহার সম্পর্কে উপরে Mustilica এর মন্তব্য উপর প্রসারিত। এটি করার জন্য আমি আমার প্রকল্পগুলিতে কোড ব্যবহার করি কোডের জন্য নীচে আমার উত্তর দেখুন: stackoverflow.com/a/35261091#35261091 । কার্যত, এটি আপনাকে বিকাশকারী কনসোল থেকে পরিবেশের পরিবর্তনগুলি সম্পাদনা করতে দেয় এবং স্থানধারক মানগুলি স্বয়ংক্রিয়ভাবে তৈরি হয়।
মার্টিন ওমান্ডার

ধন্যবাদ মুস্টিলিকা এবং মার্টিন আমরা আসলে কিছুক্ষণের জন্য ডাটাস্টোরের পদ্ধতির ব্যবহার করে আসছি এবং আমি সম্মত হলাম এটিই এই সমস্যার সেরা সমাধান। আইএসও-র জেসন ফাইলের চেয়ে সিআই / সিডি সেটআপ করা সহজ।
স্পেন ট্রেন

4
2019 এবং GAE এখনও এই সমস্যাটি স্থির করেনি: /
জোশ

উত্তর:


54

যদি এটি সংবেদনশীল ডেটা হয় তবে আপনার উত্স কোডে এটি সংরক্ষণ করা উচিত নয় কারণ এটি উত্স নিয়ন্ত্রণে পরীক্ষা করা হবে। ভুল লোকেরা (আপনার সংস্থার ভিতরে বা বাইরে) এটি এটি খুঁজে পেতে পারে। এছাড়াও, আপনার বিকাশের পরিবেশ সম্ভবত আপনার উত্পাদন পরিবেশ থেকে বিভিন্ন কনফিগার মানগুলি ব্যবহার করে। যদি এই মানগুলি কোডে সঞ্চিত থাকে তবে আপনাকে বিকাশ এবং উত্পাদনে বিভিন্ন কোড চালাতে হবে, যা অগোছালো এবং খারাপ অভ্যাস।

আমার প্রকল্পগুলিতে, আমি এই শ্রেণিটি ব্যবহার করে ডেটাস্টোরে কনফিগার ডেটা রেখেছি:

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')

যদি ডেটাস্টোরে সেই কীটির জন্য কোনও মান থাকে তবে আপনি তা পাবেন। যদি তা না থাকে তবে একটি স্থানধারক রেকর্ড তৈরি হবে এবং একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। ব্যতিক্রম আপনাকে বিকাশকারী কনসোলে যেতে এবং স্থানধারক রেকর্ড আপডেট করার জন্য মনে করিয়ে দেবে।

আমি এটি কনফিগার মানগুলি নির্ধারণের বাইরে থেকে অনুমান করার চেষ্টা করি। আপনি যদি কনফিগার মানগুলি সেট করবেন সে সম্পর্কে অনিশ্চিত হয়ে থাকেন তবে কেবল কোডটি চালান এবং এটি আপনাকে জানাবে!

উপরের কোডটিতে এনডিবি লাইব্রেরি ব্যবহার করা হয়েছে যা মেমক্যাচ এবং হুডের নীচে ডেটাস্টোর ব্যবহার করে, তাই এটি দ্রুত।


হালনাগাদ:

জেল্ডার অ্যাপ ইঞ্জিন কনসোলে কীভাবে ডেটাস্টোরের মানগুলি খুঁজে পাবেন এবং সেগুলি সেট করতে চেয়েছিলেন। এটি এখানে:

  1. Https://console.cloud.google.com/datastore/ এ যান

  2. যদি আপনার প্রকল্পটি ইতিমধ্যে নির্বাচিত না হয় তবে পৃষ্ঠার শীর্ষে নির্বাচন করুন।

  3. ইন কাইন্ড ড্রপডাউন বক্স, নির্বাচন সেটিং

  4. আপনি যদি উপরে কোডটি চালিয়ে যান তবে আপনার কীগুলি প্রদর্শিত হবে। তাদের সকলের SET মান থাকবে না । প্রতিটি ক্লিক করুন এবং এর মান সেট করুন।

আশাকরি এটা সাহায্য করবে!

আপনার সেটিংস, সেটিংস শ্রেণীর দ্বারা তৈরি

সংযোজন করার জন্য ক্লিক করো

আসল মান লিখুন এবং সংরক্ষণ করুন


4
প্রদত্ত সমস্ত উত্তরের মধ্যে এটি হেরোকু কীভাবে জিনিসগুলি পরিচালনা করে তার সবচেয়ে কাছাকাছি মনে হয়। GAE- র পরিবর্তে নতুন হওয়ার কারণে, স্থানধারক রেকর্ডটি কোথায় বিকাশকারীদের কনসোলে রয়েছে তা আমি পুরোপুরি বুঝতে পারি না। আপনি ব্যাখ্যা করতে পারেন, বা বোনাস পয়েন্ট, পোস্ট স্ক্রিনশট?
জেলদার

4
বাঁধ g… gcloud এর প্রতি যথাযোগ্য সম্মানের সাথে, এই নির্দিষ্ট প্রয়োজনের জন্য অন্য কোনও পরিষেবা ব্যবহার করা বেশ খারাপ লাগে। তদ্ব্যতীত, গুগল ফায়ারবেস ফাংশনগুলির মধ্যে এনভ ভার্সের জন্য "100% - হেরোকুইশ" দৃষ্টিভঙ্গি সরবরাহ করে তবে গ্র্যাকউড ফাংশনগুলির জন্য না (কমপক্ষে নথিভুক্ত ... যদি আমি ভুল না করি)
বেন

4
আপনার পদ্ধতির উপর ভিত্তি করে এখানে একটি গিস্ট দেওয়া হয়েছে
স্পেন ট্রেন

4
@ বেন-ফায়ারবেস ফাংশনগুলি এনভ ভার্সকে সমর্থন করে (এখন, কমপক্ষে)।
এনআরিলিংহ

4
@ ওবিএল - একটি অ্যাপ ইঞ্জিন অ্যাপ্লিকেশনটি স্বয়ংক্রিয়ভাবে তার নিজস্ব ডেটাস্টোরের কাছে প্রমাণীকৃত, কোনও প্রমাণীকরণের বিশদ প্রয়োজন নেই। এটি বেশ ঝরঝরে :-)
মার্টিন ওমান্ডার

57

এই সমাধানটি সহজ তবে সমস্ত টিমের পক্ষে উপযুক্ত নয়।

প্রথমে, এনভায়রনেবল ভেরিয়েবলগুলি এনভ_ভেরিয়েবলস.আইএমএলে রাখুন , যেমন,

env_variables:
  SECRET: 'my_secret'

তারপরে, এটিতে অন্তর্ভুক্ত env_variables.yamlকরুনapp.yaml

includes:
  - env_variables.yaml

অবশেষে, যোগ env_variables.yamlকরতে .gitignore, যাতে গোপন ভেরিয়েবল সংগ্রহস্থলের মধ্যে উপস্থিত করা হবে না।

এই ক্ষেত্রে, env_variables.yamlডিপ্লোয়মেন্ট ম্যানেজারগুলির মধ্যে ভাগ করে নেওয়া দরকার।


4
কিছুতে স্পষ্ট নাও হতে পারে কেবল যুক্ত করার জন্য, আপনার পরিবেশের পরিবর্তনগুলি তখন পাওয়া যাবে process.env.MY_SECRET_KEYএবং আপনার স্থানীয় দেব পরিবেশে যদি এই পরিবেশের পরিবর্তনশীলগুলির প্রয়োজন হয় তবে আপনি নোড dotenvপ্যাকেজটি ব্যবহার করতে পারেন
ডেভ কিস

4
env_variables.yamlসমস্ত দৃষ্টিতে কীভাবে পাওয়া যায় তা ধাঁধাটির একটি অনুপস্থিত অংশ।
ক্রিস্টোফার ওয়েজবাক

4
এছাড়াও: স্থানীয়ভাবে এটি কীভাবে ব্যবহার করবেন?
ক্রিস্টোফার ওয়েজবাক

ক্রিস্টোফার ওয়েজবিক ১. কীভাবে মোতায়েন করবেন? gcloud app deployগুগল ক্লাউডে স্থাপন করতে আপনি যেমনটি করেন ঠিক তেমনই ব্যবহার করুন । ২. স্থানীয়ভাবে গোপন পরিবেশের পরিবর্তনগুলি কীভাবে সেট করবেন? অনেক উপায় আছে। আপনি কেবল exportকমান্ড প্রম্পটেই ব্যবহার করতে পারেন বা @DaveKiss এর প্রস্তাবিত কোনও সরঞ্জাম ব্যবহার করতে পারেন।
শিহ-ওয়েন সু

4
এটি সহজ সমাধান। আপনার অ্যাপ্লিকেশন মাধ্যমে গোপনীয়তা অ্যাক্সেস করা যেতে পারে os.environ.get('SECRET')
কুইন কমেন্ডেন্ট

20

আমার অ্যাপ্লিকেশনটি কেবল অ্যাপ ইঞ্জিন অ্যাপের মধ্যেই ক্লায়েন্টের গোপনীয়তা সংরক্ষণ করা store ক্লায়েন্টের গোপনীয়তাগুলি সোর্স নিয়ন্ত্রণে বা কোনও স্থানীয় কম্পিউটারে নেই। এটির সুবিধা রয়েছে যে কোনও অ্যাপ ইঞ্জিনের সহযোগী ক্লায়েন্টের গোপন বিষয়গুলি নিয়ে চিন্তা না করে কোড পরিবর্তনগুলি মোতায়েন করতে পারে।

আমি ক্লায়েন্ট সিক্রেটগুলি সরাসরি ডেটাস্টোরে সঞ্চয় করি এবং গোপনীয়তাগুলিতে অ্যাক্সেসের উন্নত বিলম্বের জন্য মেমক্যাচ ব্যবহার করি। ডেটাস্টোর সত্ত্বাগুলি কেবল একবার তৈরি করা দরকার এবং ভবিষ্যতে মোতায়েন অব্যাহত থাকবে। অবশ্যই অ্যাপ ইঞ্জিন কনসোলটি যে কোনও সময় এই সত্ত্বাগুলি আপডেট করতে ব্যবহার করা যেতে পারে।

ওয়ান-টাইম সত্তা তৈরির জন্য দুটি বিকল্প রয়েছে:

  • সত্তা তৈরি করতে অ্যাপ ইঞ্জিন রিমোট এপিআই ইন্টারেক্টিভ শেল ব্যবহার করুন ।
  • কেবলমাত্র এমন একটি প্রশাসক তৈরি করুন যা ডামি মান সহ সত্তাগুলি সূচনা করবে। এই অ্যাডমিন হ্যান্ডলারটিকে ম্যানুয়ালি অনুরোধ করুন, তারপরে প্রোডাকশন ক্লায়েন্ট সিক্রেটস সহ সত্তাগুলি আপডেট করতে অ্যাপ ইঞ্জিন কনসোলটি ব্যবহার করুন।

7
মোটেই জটিল নয়। ধন্যবাদ অ্যাপ ইঞ্জিন
আদালতসমাছ

19

আপনি পোস্ট করার সময় এটি উপস্থিত ছিল না, তবে যে কেউ এখানে এসে হোঁচট খায়, তার জন্য গুগল এখন সিক্রেট ম্যানেজার নামে একটি পরিষেবা সরবরাহ করে ।

গুগল ক্লাউড প্ল্যাটফর্মে আপনার গোপনীয়তাগুলি সুরক্ষিত জায়গায় সংরক্ষণ করার জন্য এটি একটি সহজ আরএসটি পরিষেবা (অবশ্যই এসডিকে এটি মোড়ানো সহ)। এটি স্টোরের গোপনীয়তাগুলি দেখার জন্য অতিরিক্ত পদক্ষেপের প্রয়োজন এবং একটি সূক্ষ্ম-গ্রেডযুক্ত অনুমতি মডেল থাকা - এটি ডেটা স্টোরের চেয়ে ভাল পদ্ধতির - আপনার প্রয়োজনের প্রয়োজনে, আপনি আপনার প্রকল্পের বিভিন্ন দিকগুলির জন্য পৃথক গোপনীয়তাগুলি আলাদাভাবে সুরক্ষিত করতে পারেন।

এটি সংস্করণ সরবরাহ করে, যাতে আপনি আপেক্ষিক স্বাচ্ছন্দ্যের সাথে পাসওয়ার্ড পরিবর্তনগুলি হ্যান্ডল করতে পারেন, পাশাপাশি একটি শক্তিশালী ক্যোয়ারী এবং পরিচালনা স্তর আপনাকে প্রয়োজনীয় সময়ে রানটাইমে সিক্রেটগুলি আবিষ্কার করতে এবং তৈরি করতে সক্ষম করে।

পাইথন এসডিকে

ব্যবহারের উদাহরণ:

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

4
এটি নতুন সঠিক উত্তর হওয়া উচিত। সিক্রেট ম্যানেজার এখনও বিটাতে রয়েছে, তবে পরিবেশের ভেরিয়েবলগুলির সাথে কাজ করার সময় এটি এগিয়ে যাওয়ার পথ।
কিং লিওন

কিংলিয়ন, কি এই অর্থ ব্যবহার করে একগুচ্ছ রিফ্যাক্টর করানো হবে os.getenv('ENV_VAR')?
আলেজান্দ্রো

আমি কোনও ফাংশনে উপরের মতো কোড রেখেছি, তারপরে আমি এর মতো কিছু ব্যবহার করি SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))access_secret_version
কিং লিওন

এছাড়াও, আমি জাঙ্গো-পরিবেশ ব্যবহার করছি। github.com/joke2k/django-en वातावरण
রাজা লিওন

আমাকে একটি বোকা প্রশ্ন জিজ্ঞাসা করা দরকার, তবে আপনি যা বলেছিলেন তা কি secret_id = 'my_secret_key'আপনার সংস্করণ নিয়ন্ত্রণে উপস্থিত নেই?
dierre

16

এটি করার সর্বোত্তম উপায় হ'ল একটি ক্লায়েন্ট_সেক্রেটস.জসন ফাইলে কীগুলি সংরক্ষণ করা এবং এটি আপনার .gitignore ফাইলে তালিকাভুক্ত করে গিটকে আপলোড করা থেকে বাদ দিন। আপনার যদি বিভিন্ন পরিবেশের জন্য আলাদা কী থাকে তবে আপনি অ্যাপ্লিকেশন আইডিটি কী তা নির্ধারণ করতে অ্যাপ_সিয়েন্টিটি এপিআই ব্যবহার করতে পারেন এবং যথাযথভাবে লোড করতে পারেন।

এখানে মোটামুটি বিস্তৃত উদাহরণ রয়েছে -> 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()

4
অবশ্যই সঠিক দিকে, তবে app.yamlএটি অ্যাপ্লিকেশন স্থাপনের সময় মানগুলি অদলবদল করার বিষয়টি বিবেচনা করে না । কোন ধারণা আছে?
বেন

4
সুতরাং প্রতিটি পরিবেশের জন্য পৃথক ক্লায়েন্ট_সেক্রেটস ফাইল রাখুন। উদাহরণস্বরূপ ক্লায়েন্ট_সক্রিটস_লাইভ.জসন, ক্লায়েন্ট_সেক্রেটস_দেব.জসন, ক্লায়েন্ট_সেক্রেটস_পাইলট.জসন ইত্যাদি, তারপরে আপনি কোন সার্ভারে আছেন তা নির্ধারণ করতে এবং উপযুক্ত জেসন ফাইলটি লোড আপ করতে পাইথন যুক্তি ব্যবহার করুন। আপনি কোন সার্ভারে আছেন তা স্বয়ংক্রিয়ভাবে সনাক্ত করতে অ্যাপ_ডিসিটিটি.জেট_অ্যাপ্লিকেশন_আইডি () পদ্ধতিটি কার্যকর হতে পারে। আপনি কি বোঝাতে চাইছেন?
গুইন হাওল

@ বেনগ্রানফেল্ড আমার উত্তর দেখুন। আমার সমাধানটি ঠিক এটি করে। এই উত্তরটি কীভাবে প্রশ্নের সমাধান করে তা আমি দেখতে পাচ্ছি না। আমি ধরে নিই লক্ষ্যটি হ'ল গোপন কনফিগারেশনটি গিটের বাইরে রাখা, এবং ব্যবহারের অংশ হিসাবে গিট ব্যবহার করা। এখানে, এই ফাইলটি এখনও অন্য কোথাও থাকা এবং মোতায়েনের প্রক্রিয়াতে ঠেলা দরকার। এটি আপনার অ্যাপ্লিকেশনটিতে আপনি কিছু করতে পারেন তবে আপনি যে কৌশলগুলি হাইলাইট করেছিলেন তা আপনি ব্যবহার করতে পারেন, সম্ভবত আপনি যদি এই বনাম অ্যাপ্লিকেশন.আইএমএল ব্যবহার করতে চান তবে অন্য কোনও ফাইলে সংরক্ষণ করবেন। যদি আমি প্রশ্নটি বুঝতে পারি তবে এটি লাইব্রেরি প্রস্তুতকারকের আসল ক্লায়েন্টের গোপন বা প্রোডের সাথে একটি ওপেন সোর্স অ্যাপ্লিকেশনটি প্রেরণ করার অনুরূপ। চাবি.
therewillbesnacks

4
আমার মাথাটি ঘিরে এটি পেতে আমার কিছুটা সময় লেগেছিল তবে আমি মনে করি এটি সঠিক পন্থা। আপনি app.yamlগোপন কী এবং গোপনীয় তথ্যের সাথে অ্যাপ্লিকেশন সেটিংস ( ) মেশাচ্ছেন না এবং আমি যা পছন্দ করি তা হ'ল আপনি কার্য সম্পাদন করতে গুগল ওয়ার্কফ্লো ব্যবহার করছেন। ধন্যবাদ @ গুইনহোয়েল। =)
বেন

4
অনুরূপ পন্থাটি হ'ল অ্যাপটির ডিফল্ট জিসিএস বালতিতে জেএসএন ফাইলটি একটি পরিচিত স্থানে স্থাপন করা ( ক্লাউড . google.com/appengine/docs/standard/python/… )।
স্পেন ট্রেন

15

এই সমাধানটি অবমুক্ত appcfg.py উপর নির্ভর করে

আপনি যখন আপনার অ্যাপ্লিকেশনটি জিএইতে স্থাপন করেন তখন অ্যাপ্লিকেশন ভেরিয়েবল সেটআপ করতে আপনি appcfg.py এর -E কমান্ড লাইন বিকল্পটি ব্যবহার করতে পারেন (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

বেশিরভাগ উত্তর পুরানো। গুগল ক্লাউড ডেটাস্টোর ব্যবহার করা এখনই কিছুটা আলাদা। https://cloud.google.com/python/getting-st সূত্র / ব্যবহার- ক্লাউড- ডেডাস্টোর

এখানে একটি উদাহরণ:

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 সত্তার সম্পত্তি।


4

আপনার ভেরিয়েবলগুলি গুগল কেএমএস সহ এনক্রিপ্ট করা উচিত এবং এটি আপনার উত্স কোডে এম্বেড করা উচিত। ( 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

স্ক্র্যাম্বলড (এনক্রিপ্টড এবং বেস 64 এনকোডড) মানটি আপনার পরিবেশের পরিবর্তনশীল (ইয়ামল ফাইলটিতে) মধ্যে রাখুন।

আপনাকে ডিক্রিপ্টিং শুরু করার জন্য কিছু অজগর কোড।

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

দেখে মনে হচ্ছে আপনি কয়েকটি পন্থা করতে পারেন। আমাদের অনুরূপ সমস্যা রয়েছে এবং নিম্নলিখিতগুলি করুন (আপনার ব্যবহারের ক্ষেত্রে অভিযোজিত):

  • এমন একটি ফাইল তৈরি করুন যা কোনও গতিশীল অ্যাপ্লিকেশন সংরক্ষণ করে yam আইএমএল মানগুলি এবং আপনার বিল্ড পরিবেশে এটি একটি সুরক্ষিত সার্ভারে রাখে। আপনি যদি সত্যই ভৌতিক হয়ে থাকেন তবে আপনি অসমিত্রভাবে মানগুলি এনক্রিপ্ট করতে পারেন। এমনকি আপনার যদি সংস্করণ নিয়ন্ত্রণ / গতিশীল টান প্রয়োজন হয় তবে এটি এটিকে প্রাইভেট রেপোতে রাখতে পারেন, বা এটি অনুলিপি করতে / উপযুক্ত স্থান থেকে টানতে কেবল শেল স্ক্রিপ্ট ব্যবহার করুন।
  • স্থাপনার স্ক্রিপ্টের সময় গিট থেকে টানুন
  • গিট টানার পরে, অ্যাপ্লিকেশনটি পরিবর্তন করুন: ইমাল পাঠাগারটি ব্যবহার করে খাঁটি অজগরে এটি লিখে এবং লিখে

এটি করার সবচেয়ে সহজ উপায় হ'ডসন , বাঁশ বা জেনকিন্সের মতো অবিচ্ছিন্ন একীকরণের সার্ভার ব্যবহার করা । কেবলমাত্র কিছু প্লাগ-ইন, স্ক্রিপ্ট পদক্ষেপ বা ওয়ার্কফ্লো যুক্ত করুন যা উপরের সমস্ত আইটেম আমি উল্লেখ করেছি। আপনি উদাহরণস্বরূপ বাঁশের মধ্যে কনফিগার করা পরিবেশের পরিবর্তনশীলগুলিতে পাস করতে পারেন।

সংক্ষেপে, আপনার বিল্ড প্রক্রিয়া চলাকালীন এমন পরিবেশে কেবলমাত্র মানগুলিতে চাপ দিন you আপনি যদি ইতিমধ্যে নিজের বিল্ডগুলি স্বয়ংক্রিয়ভাবে না চালাচ্ছেন তবে আপনার হওয়া উচিত।

আর একটি বিকল্প বিকল্প হ'ল আপনি যা বলেছেন, এটি ডাটাবেসে রাখুন। যদি এটি না করার কারণ আপনি যদি জিনিসগুলি খুব ধীরগতিতে থাকেন তবে কেবলমাত্র দ্বিতীয় স্তরের ক্যাশে হিসাবে মানগুলি ম্যাকচেতে চাপুন এবং মানগুলি প্রথম স্তরের ক্যাশে হিসাবে পিন করুন। মানগুলি যদি পরিবর্তন করতে পারে এবং এগুলি পুনরায় চালু না করে আপনার আপডেট করতে হবে, আপনি যখন মানগুলি পরিবর্তন করেন তখন কোনও পরিবর্তন হয় এবং কখন এটি পরিবর্তন করে তা জানতে আপনি একটি হ্যাশ রাখুন। এটা হওয়া উচিত।


4
এফডব্লিউআইডাব্লু, এই পদ্ধতির 12 ফ্যাক্টর অ্যাপ্লিকেশন নির্দেশিকা (12 ফ্যাক্টর ডটনেট )
স্পেন ট্রেন

3

গুগল ডেটাস্টোর ব্যবহারের উপর ভিত্তি করে @ জেসন এফ এর উত্তরটি নিকটে, তবে লাইব্রেরি ডক্সের নমুনা ব্যবহারের ভিত্তিতে কোডটি কিছুটা পুরানো । এই স্নিপেটটি আমার পক্ষে কাজ করেছে:

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

আমি কীভাবে জাভাস্ক্রিপ্ট / নোডজে এই সমস্যাটি সমাধান করেছি তা নোট করতে চেয়েছিলেন। স্থানীয় বিকাশের জন্য আমি 'ডোটেনভ' এনপিএম প্যাকেজটি ব্যবহার করেছি যা একটি .env ফাইল থেকে প্রক্রিয়া.এনভিতে পরিবেশের ভেরিয়েবলগুলি লোড করে। আমি যখন জিএই ব্যবহার করতে শুরু করেছি তখন শিখেছি যে পরিবেশের ভেরিয়েবলগুলি একটি 'অ্যাপ্লিকেশন। আইএমএল' ফাইলটিতে সেট করা দরকার। ভাল, আমি স্থানীয় বিকাশের জন্য 'ডটেনভ' এবং জিএই'র জন্য 'অ্যাপ.আইএমএল' ব্যবহার করতে চাইনি (এবং দুটি ফাইলের মধ্যে আমার পরিবেশের ভেরিয়েবলগুলি নকল করুন), তাই আমি একটি ছোট স্ক্রিপ্ট লিখেছিলাম যা অ্যাপ্লিকেশনগুলিতে প্রযোজ্য পরিবেশের ভেরিয়েবলগুলি লোড করে .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 স্বয়ংক্রিয়ভাবে অ্যাপ্লিকেশনগুলিতে সংজ্ঞায়িত সমস্ত ভেরিয়েবল যুক্ত করে yam মূলত এটি .env প্যাকেজে সংজ্ঞায়িত ভেরিয়েবলগুলির সাথে ডটেনভের মতোই। তবে আমি ভাবছি যে আপনি কীভাবে সিডি সেটআপ করতে হবে কারণ আপনি অ্যাপ্লিকেশনকে ভিভিএস বা পাইপলাইনে এনভ ভার্স সহ চাপতে পারবেন না ...
জর্নেভ

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

Gae_env নামে একটি পাইপি প্যাকেজ রয়েছে যা আপনাকে ক্লাউড ডেটাস্টোরে অ্যাপেনজিন পরিবেশের পরিবর্তনগুলি সংরক্ষণ করতে দেয়। ফণা অধীনে, এটি মেমক্যাচ ব্যবহার করে তাই এটির দ্রুত

ব্যবহার:

import gae_env

API_KEY = gae_env.get('API_KEY')

যদি ডেটাস্টোরে সেই কীটির জন্য কোনও মান থাকে তবে তা ফিরে আসবে। যদি তা না থাকে তবে একটি স্থানধারক রেকর্ড __NOT_SET__তৈরি ValueNotSetErrorহবে এবং একটি নিক্ষিপ্ত হবে। ব্যতিক্রম আপনাকে বিকাশকারী কনসোলে যেতে এবং স্থানধারক রেকর্ড আপডেট করার জন্য মনে করিয়ে দেবে ।


মার্টিনের উত্তরের অনুরূপ, কীভাবে ডেটাস্টোরের কীটির মান আপডেট করা যায় তা এখানে:

  1. বিকাশকারীদের কনসোলে ডেটাস্টোর বিভাগে যান

  2. যদি আপনার প্রকল্পটি ইতিমধ্যে নির্বাচিত না হয় তবে পৃষ্ঠার শীর্ষে নির্বাচন করুন।

  3. ইন কাইন্ড ড্রপডাউন বক্স নির্বাচন GaeEnvSettings

  4. যে কীগুলির জন্য একটি ব্যতিক্রম উত্থাপিত হয়েছিল তার মান থাকবে __NOT_SET__

আপনার সেটিংস, সেটিংস শ্রেণীর দ্বারা তৈরি

সংযোজন করার জন্য ক্লিক করো

আসল মান লিখুন এবং সংরক্ষণ করুন


ব্যবহার / কনফিগারেশন সম্পর্কিত আরও তথ্যের জন্য প্যাকেজের গিটহাব পৃষ্ঠায় যান

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.