Как сохранить учетные данные базы данных в Google App Engine Standard?

Я экспериментирую с размещением приложения Django в Google App Engine Standard, и для этого я следовал руководству " Запуск Django в стандартной среде App Engine". Этот учебник полностью игнорирует проблему безопасной обработки учетных данных (и это своего рода пункты просто хранить их в репозитории... вздох).

При поиске способов хранения учетных данных есть много статей о службе управления облачными ключами Google, но мне это не нужно. Я согласен с тем, что учетные данные хранятся в GCP в незашифрованном виде (это все равно для базы данных GCP). То, что мне нужно, - это способ для моего приложения автоматически подобрать эту конфигурацию.

Мое приложение может получить переменные среды или .env файл, который содержит эту информацию. Как сделать так, чтобы учетные данные и другие настройки отображались в моем экземпляре Google App Engine Standard?

1 ответ

Ответ на это на какое-то время сводил меня с ума, но я наконец получил ответ. Он использует Memcached, поэтому он быстр в производстве.

  1. В GCP перейдите в раздел API и службы и включите API хранилища данных Google.
  2. Затем настройте учетную запись службы и выполните проверку подлинности в соответствии с данным руководством: https://cloud.google.com/docs/authentication/getting-started
  3. В вашем местном окружении, pip install google-cloud-datastore,
  4. Затем вы захотите создать модуль в той же папке, что и 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 только для загрузки и дешифрования.

Другие вопросы по тегам