Я экспериментирую с размещением приложения Django в Google App Engine Standard, и для этого я следовал руководству Запуск Django в стандартной среде App Engine. В этом руководстве полностью игнорируется проблема безопасной обработки учетных данных (и это своего рода указывает на то, чтобы просто сохранить их в репозитории кода ... вздох).
Когда вы ищете, как хранить учетные данные, есть много статей о Google Cloud Key Management Service, но мне это действительно не нужно. Я согласен с тем, что учетные данные хранятся в незашифрованном виде в GCP (в любом случае, это для базы данных GCP). Мне нужно, чтобы мое приложение могло автоматически выбирать эту конфигурацию.
Мое приложение может получать переменные среды или .env
файл, содержащий эту информацию. Как сделать так, чтобы учетные данные и другие конфигурации присутствовали в моем экземпляре Google App Engine Standard?
Ответ на этот вопрос на некоторое время свел меня с ума, но, наконец, я получил ответ. Он использует Memcached, поэтому работает быстро.
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 только для загрузки и дешифрования.