Saya perlu menyimpan kunci API dan informasi sensitif lainnya app.yaml
sebagai variabel lingkungan untuk penerapan di GAE. Masalah dengan ini adalah jika saya mendorong app.yaml
ke GitHub, informasi ini menjadi publik (tidak baik). Saya tidak ingin menyimpan info di datastore karena tidak sesuai dengan proyek. Sebaliknya, saya ingin menukar nilai dari file yang terdaftar di .gitignore
setiap penerapan aplikasi.
Ini adalah file app.yaml saya:
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}
Ada ide?
Jawaban:
Jika ini adalah data sensitif, Anda tidak boleh menyimpannya dalam kode sumber karena akan diperiksa ke kontrol sumber. Orang yang salah (di dalam atau di luar organisasi Anda) mungkin menemukannya di sana. Selain itu, lingkungan pengembangan Anda mungkin menggunakan nilai konfigurasi yang berbeda dari lingkungan produksi Anda. Jika nilai-nilai ini disimpan dalam kode, Anda harus menjalankan kode yang berbeda dalam pengembangan dan produksi, yang merupakan praktik yang berantakan dan buruk.
Dalam proyek saya, saya meletakkan data konfigurasi di datastore menggunakan kelas ini:
Aplikasi Anda akan melakukan ini untuk mendapatkan nilai:
Jika ada nilai untuk kunci itu di datastore, Anda akan mendapatkannya. Jika tidak ada, rekaman placeholder akan dibuat dan pengecualian akan diberikan. Pengecualian akan mengingatkan Anda untuk pergi ke Developers Console dan memperbarui catatan placeholder.
Saya menemukan ini menghilangkan tebakan dari pengaturan nilai konfigurasi. Jika Anda tidak yakin nilai konfigurasi apa yang harus disetel, jalankan saja kode dan itu akan memberi tahu Anda!
Kode di atas menggunakan pustaka ndb yang menggunakan memcache dan datastore di bawah tenda, jadi cepat.
Memperbarui:
jelder menanyakan cara menemukan nilai Datastore di konsol App Engine dan menyetelnya. Begini caranya:
Buka https://console.cloud.google.com/datastore/
Pilih proyek Anda di bagian atas halaman jika belum dipilih.
Di kotak tarik-turun Jenis , pilih Pengaturan .
Jika Anda menjalankan kode di atas, kunci Anda akan muncul. Mereka semua akan memiliki nilai NOT SET . Klik masing-masing dan tetapkan nilainya.
Semoga ini membantu!
sumber
Solusi ini sederhana tetapi mungkin tidak cocok untuk semua tim yang berbeda.
Pertama, letakkan variabel lingkungan di env_variables.yaml , misalnya,
Kemudian, masukkan ini ke
env_variables.yaml
dalamapp.yaml
Terakhir, tambahkan
env_variables.yaml
ke.gitignore
, sehingga variabel rahasia tidak akan ada di repositori.Dalam hal ini,
env_variables.yaml
kebutuhan dibagikan di antara manajer penerapan.sumber
process.env.MY_SECRET_KEY
dan jika Anda memerlukan variabel lingkungan ini di lingkungan dev lokal Anda, Anda dapat menggunakandotenv
paket nodeenv_variables.yaml
mendapatkan semua contoh adalah bagian yang hilang dari teka-teki.gcloud app deploy
seperti yang biasa Anda lakukan untuk menerapkan ke Google Cloud. 2. Bagaimana mengatur variabel lingkungan rahasia secara lokal? Ada banyak cara. Anda bisa menggunakanexport
di command prompt atau menggunakan alat apa pun seperti yang disarankan @DaveKiss.os.environ.get('SECRET')
.Pendekatan saya adalah menyimpan rahasia klien hanya dalam aplikasi App Engine itu sendiri. Rahasia klien tidak ada di kontrol sumber maupun di komputer lokal mana pun. Keuntungannya adalah setiap kolaborator App Engine dapat menerapkan perubahan kode tanpa harus mengkhawatirkan rahasia klien.
Saya menyimpan rahasia klien langsung di Datastore dan menggunakan Memcache untuk meningkatkan latensi dalam mengakses rahasia. Entitas Datastore hanya perlu dibuat sekali dan akan tetap ada di penerapan di masa mendatang. tentu saja konsol App Engine dapat digunakan untuk memperbarui entitas ini kapan saja.
Ada dua opsi untuk melakukan pembuatan entitas satu kali:
sumber
Ini tidak ada saat Anda memposting, tetapi untuk siapa pun yang tersandung di sini, Google sekarang menawarkan layanan yang disebut Manajer Rahasia .
Ini adalah layanan REST sederhana (dengan SDK yang membungkusnya, tentu saja) untuk menyimpan rahasia Anda di lokasi yang aman di platform cloud google. Ini adalah pendekatan yang lebih baik daripada Penyimpanan Data, yang membutuhkan langkah-langkah ekstra untuk melihat rahasia yang disimpan dan memiliki model izin yang lebih terperinci - Anda dapat mengamankan rahasia individu secara berbeda untuk berbagai aspek proyek Anda, jika perlu.
Ini menawarkan pembuatan versi, sehingga Anda dapat menangani perubahan kata sandi dengan relatif mudah, serta kueri yang kuat dan lapisan manajemen yang memungkinkan Anda menemukan dan membuat rahasia pada waktu proses, jika perlu.
Python SDK
Contoh penggunaan:
sumber
os.getenv('ENV_VAR')
s?SECRET_KEY = env('SECRET_KEY', default=access_secret_version(GOOGLE_CLOUD_PROJECT_ID, 'SECRET_KEY', 1))
. Menyetel default untuk menggunakanaccess_secret_version
Cara terbaik untuk melakukannya, adalah menyimpan kunci dalam file client_secrets.json, dan mengecualikannya agar tidak diunggah ke git dengan mencantumkannya di file .gitignore Anda. Jika Anda memiliki kunci yang berbeda untuk lingkungan yang berbeda, Anda dapat menggunakan app_identity api untuk menentukan apa id aplikasi, dan memuat dengan tepat.
Ada contoh yang cukup komprehensif di sini -> https://developers.google.com/api-client-library/python/guide/aaa_client_secrets .
Berikut beberapa contoh kode:
sumber
app.yaml
saat penerapan aplikasi. Ada ide di sana?app.yaml
) dengan kunci rahasia dan informasi rahasia, dan yang sangat saya sukai adalah Anda menggunakan alur kerja Google untuk menyelesaikan tugas tersebut. Terima kasih @GwynHowell. =)Solusi ini bergantung pada appcfg.py yang tidak digunakan lagi
Anda dapat menggunakan opsi baris perintah -E dari appcfg.py untuk menyiapkan variabel lingkungan saat Anda menerapkan aplikasi Anda ke GAE (appcfg.py update)
sumber
gcloud
utilitas?Sebagian besar jawaban sudah usang. Menggunakan datastore google cloud sebenarnya sedikit berbeda sekarang. https://cloud.google.com/python/getting-started/using-cloud-datastore
Berikut contohnya:
Ini mengasumsikan nama entitas adalah 'TWITTER_APP_KEY', jenisnya adalah 'pengaturan', dan 'nilai' adalah properti dari entitas TWITTER_APP_KEY.
sumber
Sepertinya Anda bisa melakukan beberapa pendekatan. Kami memiliki masalah serupa dan melakukan hal berikut (disesuaikan dengan kasus penggunaan Anda):
Cara termudah untuk melakukannya adalah dengan menggunakan server integrasi berkelanjutan seperti Hudson , Bamboo , atau Jenkins . Cukup tambahkan beberapa plugin, langkah skrip, atau alur kerja yang melakukan semua item di atas yang saya sebutkan. Anda bisa memasukkan variabel lingkungan yang dikonfigurasi di Bamboo itu sendiri misalnya.
Singkatnya, cukup masukkan nilai selama proses build Anda di lingkungan yang hanya dapat Anda akses. Jika Anda belum mengotomatiskan build Anda, Anda harus melakukannya.
Opsi opsi lainnya adalah apa yang Anda katakan, taruh di database. Jika alasan Anda tidak melakukannya adalah karena semuanya terlalu lambat, cukup dorong nilainya ke dalam memcache sebagai cache lapisan kedua, dan sematkan nilai ke instance sebagai cache lapisan pertama. Jika nilai dapat berubah dan Anda perlu memperbarui instans tanpa me-rebootnya, cukup simpan hash yang dapat Anda periksa untuk mengetahui kapan mereka berubah atau memicunya entah bagaimana ketika sesuatu yang Anda lakukan mengubah nilainya. Seharusnya begitu.
sumber
Anda harus mengenkripsi variabel dengan google kms dan menyematkannya di kode sumber Anda. ( https://cloud.google.com/kms/ )
masukkan nilai yang diacak (dienkripsi dan dienkode base64) ke dalam variabel lingkungan Anda (dalam file yaml).
Beberapa kode pythonish untuk membantu Anda mulai mendekripsi.
sumber
Jawaban @Jason F berdasarkan penggunaan Google Datastore sudah dekat, tetapi kodenya agak ketinggalan jaman berdasarkan penggunaan sampel di dokumen perpustakaan . Berikut cuplikan yang berhasil untuk saya:
Sebagian terinspirasi oleh postingan Medium ini
sumber
Hanya ingin mencatat bagaimana saya memecahkan masalah ini di javascript / nodejs. Untuk pengembangan lokal saya menggunakan paket 'dotenv' npm yang memuat variabel lingkungan dari file .env ke dalam proses.env. Ketika saya mulai menggunakan GAE, saya mengetahui bahwa variabel lingkungan perlu disetel dalam file 'app.yaml'. Ya, saya tidak ingin menggunakan 'dotenv' untuk pengembangan lokal dan 'app.yaml' untuk GAE (dan menduplikasi variabel lingkungan saya di antara dua file), jadi saya menulis skrip kecil yang memuat variabel lingkungan app.yaml ke dalam proses .env, untuk pengembangan lokal. Semoga ini bisa membantu seseorang:
yaml_env.js:
Sekarang sertakan file ini sedini mungkin dalam kode Anda, dan Anda selesai:
sumber
.env
file dengan variabel rahasia. Saya tidak menduplikasi mereka diapp.yaml
file saya dan kode yang saya terapkan masih berfungsi. Saya khawatir apa yang terjadi pada.env
file di cloud. Apakah itu dienkripsi atau sesuatu? Bagaimana cara memastikan tidak ada yang mengakses.env
variabel file gcloud setelah diterapkan?Memperluas jawaban Martin
sumber
Ada paket pypi bernama gae_env yang memungkinkan Anda menyimpan variabel lingkungan appengine di Cloud Datastore. Di bawah tenda, ia juga menggunakan Memcache sehingga cepat
Pemakaian:
Jika ada nilai untuk kunci itu di datastore, itu akan dikembalikan. Jika tidak ada, rekaman placeholder
__NOT_SET__
akan dibuat danValueNotSetError
akan dilempar. Pengecualian akan mengingatkan Anda untuk pergi ke Developers Console dan memperbarui catatan placeholder.Mirip dengan jawaban Martin, berikut adalah cara memperbarui nilai untuk kunci di Datastore:
Buka Bagian Datastore di konsol pengembang
Pilih proyek Anda di bagian atas halaman jika belum dipilih.
Di kotak dropdown Kind , pilih
GaeEnvSettings
.Kunci yang pengecualiannya dimunculkan akan memiliki nilai
__NOT_SET__
.Buka halaman GitHub paket untuk info lebih lanjut tentang penggunaan / konfigurasi
sumber