Назад | Перейти на главную страницу

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

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

Когда вы ищете, как хранить учетные данные, есть много статей о Google Cloud Key Management Service, но мне это действительно не нужно. Я согласен с тем, что учетные данные хранятся в незашифрованном виде в GCP (в любом случае, это для базы данных GCP). Мне нужно, чтобы мое приложение могло автоматически выбирать эту конфигурацию.

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

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

  1. В GCP перейдите в раздел API и службы и включите Google Datastore API.
  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 только для загрузки и дешифрования.