Как сохранить учетные данные базы данных в Google App Engine Standard?
Я экспериментирую с размещением приложения Django в Google App Engine Standard, и для этого я следовал руководству " Запуск Django в стандартной среде App Engine". Этот учебник полностью игнорирует проблему безопасной обработки учетных данных (и это своего рода пункты просто хранить их в репозитории... вздох).
При поиске способов хранения учетных данных есть много статей о службе управления облачными ключами Google, но мне это не нужно. Я согласен с тем, что учетные данные хранятся в GCP в незашифрованном виде (это все равно для базы данных GCP). То, что мне нужно, - это способ для моего приложения автоматически подобрать эту конфигурацию.
Мое приложение может получить переменные среды или .env
файл, который содержит эту информацию. Как сделать так, чтобы учетные данные и другие настройки отображались в моем экземпляре Google App Engine Standard?
1 ответ
Ответ на это на какое-то время сводил меня с ума, но я наконец получил ответ. Он использует Memcached, поэтому он быстр в производстве.
- В GCP перейдите в раздел API и службы и включите API хранилища данных Google.
- Затем настройте учетную запись службы и выполните проверку подлинности в соответствии с данным руководством: https://cloud.google.com/docs/authentication/getting-started
- В вашем местном окружении,
pip install google-cloud-datastore
, - Затем вы захотите создать модуль в той же папке, что и
settings.py
называется что-то вродеdatastore.py
:
Вот мой datastore.py
:
from google.cloud import datastore
from django.core.cache import cache
class DataStoreClient():
def __init__(self):
self.client = datastore.Client()
def get(self, property):
try:
cache_key = 'env-' + property
result = cache.get(cache_key)
if not result:
key = self.client.key('environment_variables', property)
result = self.client.get(key)
cache.set(cache_key, result, 86400)
return result['Value']
except TypeError:
print(
"{} is not a property in Cloud Datastore".format(property) +
"We are creating one for you. Go to Cloud Datastore to set a value."
)
entity = datastore.Entity(key=key)
entity.update({
'Value': 'NOT_SET'}
)
self.client.put(entity)
Затем в настройках вы просто вызываете такие ключи:
from your_app.datastore import DataStoreClient
datastore_client = DataStoreClient()
SECRET_KEY = datastore_client.get('SECRET_KEY')
Когда ты бежишь python manage.py runserver
впервые система будет заполняться NOT_SET
значения в Google DataStore. Отсюда вы можете перейти в GCP и изменить эти ключи в хранилище данных.
Это решение хорошо в том, что, как только есть значение, оно найдет его для вас.
Если вы действительно хотите сойти с ума (как у меня), вы можете установить скрипт, который включает все переменные среды локально, шифрует их с помощью KMS, загружает их, а затем записывает DataStoreClient только для загрузки и дешифрования.