我正在尝试在 Google App Engine Standard 上托管 Django 应用程序,为此我遵循了本教程在 App Engine 标准环境中运行 Django。该教程完全忽略了安全处理凭证的问题(并且它只是将它们存储在代码库中……叹)。
在搜索如何存储凭据时,有很多关于 Google Cloud Key Management Service 的文章,但我真的不需要它。我同意将凭据以未加密的形式存储在 GCP 中(无论如何,它是用于 GCP 数据库的)。我需要的是一种让我的应用程序自动获取该配置的方法。
我的应用可以获取环境变量或.env
包含此信息的文件。如何获取凭证和其他配置,使其在我的 Google App Engine Standard 实例中显示?
答案1
这个问题的答案让我苦恼了好一阵子,不过我终于找到了答案。它使用 Memcached,因此在生产中速度很快。
- 在 GCP 中,转到 API 和服务,并启用 Google Datastore API。
- 然后设置服务帐户并根据本教程进行身份验证: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 仅下载和解密。