我需要将API密钥和其他敏感信息存储在app.yaml
中,作为在GAE上部署的环境变量。这样做的问题是,如果我将app.yaml
推送到GitHub,这些信息将变得公开(不好)。我不想将信息存储在数据存储中,因为它不适合项目。相反,我想在应用程序的每个部署上从. gitignore
中列出的文件中交换值。
这是我的应用程序。yaml文件:
application: myapp
version: 3
runtime: python27
api_version: 1
threadsafe: true
libraries:
- name: webapp2
version: latest
- name: jinja2
version: latest
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.application
login: required
secure: always
# auth_fail_action: unauthorized
env_variables:
CLIENT_ID: ${CLIENT_ID}
CLIENT_SECRET: ${CLIENT_SECRET}
ORG: ${ORG}
ACCESS_TOKEN: ${ACCESS_TOKEN}
SESSION_SECRET: ${SESSION_SECRET}
有什么想法吗?
这在你发帖的时候是不存在的,但是对于其他在这里遇到麻烦的人来说,谷歌现在提供了一个名为Secret Manager的服务。
这是一个简单的REST服务(当然是SDK包装的),可以将你的秘密存储在谷歌云平台上的一个安全位置。这是一种比数据存储更好的方法,需要额外的步骤来查看存储的机密,并具有更细粒度的权限模型——如果需要,您可以为项目的不同方面保护不同的机密。
它提供版本控制,因此您可以相对轻松地处理密码更改,以及强大的查询和管理层,使您能够在必要时在运行时发现和创建机密。
开发包
用法示例:
from google.cloud import secretmanager_v1beta1 as secretmanager
secret_id = 'my_secret_key'
project_id = 'my_project'
version = 1 # use the management tools to determine version at runtime
client = secretmanager.SecretManagerServiceClient()
secret_path = client.secret_version_path(project_id, secret_id, version)
response = client.access_secret_version(secret_path)
password_string = response.payload.data.decode('UTF-8')
# use password_string -- set up database connection, call third party service, whatever
如果是敏感数据,则不应将其存储在源代码中,因为它将被签入源代码管理。错误的人(组织内部或外部)可能会在那里找到它。此外,开发环境可能使用与生产环境不同的配置值。如果这些值存储在代码中,您将不得不在开发和生产中运行不同的代码,这是一种混乱和糟糕的做法。
在我的项目中,我使用以下类将配置数据放入数据存储:
from google.appengine.ext import ndb
class Settings(ndb.Model):
name = ndb.StringProperty()
value = ndb.StringProperty()
@staticmethod
def get(name):
NOT_SET_VALUE = "NOT SET"
retval = Settings.query(Settings.name == name).get()
if not retval:
retval = Settings()
retval.name = name
retval.value = NOT_SET_VALUE
retval.put()
if retval.value == NOT_SET_VALUE:
raise Exception(('Setting %s not found in the database. A placeholder ' +
'record has been created. Go to the Developers Console for your app ' +
'in App Engine, look up the Settings record with name=%s and enter ' +
'its value in that record\'s value field.') % (name, name))
return retval.value
您的应用程序会这样做以获得一个值:
API_KEY = Settings.get('API_KEY')
如果数据存储中有该键的值,您将获得它。如果没有,将创建一个占位符记录并抛出一个异常。异常将提醒您转到开发人员控制台并更新占位符记录。
我发现这消除了设置配置值的猜测。如果您不确定要设置什么配置值,只需运行代码,它就会告诉您!
上面的代码使用ndb库,它使用memcache和后台的数据存储,所以速度很快。
更新:
杰尔德询问如何在App Engine控制台中找到Datastore值并设置它们。以下是方法:
>
转到https://console.cloud.google.com/datastore/
如果尚未选择项目,请在页面顶部选择该项目。
在种类下拉框中,选择设置。
如果您运行上面的代码,您的密钥将显示出来。它们都将具有未设置的值。单击每个并设置其值。
希望这有帮助!
此解决方案很简单,但可能不适合所有不同的团队。
首先,将环境变量放在env_variables.yaml,例如,
env_variables:
SECRET: 'my_secret'
然后,在app.yaml
中包含这个env_variables.yaml
includes:
- env_variables.yaml
最后,添加env_变量。yaml
至。gitignore
,这样存储库中就不会存在秘密变量。
在这种情况下,env_variables.yaml
需要在部署管理器之间共享。
问题内容: 如果我在终端输入 … shell在哪里存储该环境变量? 我正在使用Ubuntu 8.10。我查看了文件〜/ .profile和/ etc / profile,找不到DISPLAY的痕迹。 问题答案: 进程的环境变量在运行时存在,并且未存储在某些文件中。它们存储在进程自己的内存中(在那里,它们会传递给子进程)。但是其中有一个虚拟文件 该文件显示了在调用进程时传递的所有环境变量(除非进程覆
我通过Github将我的项目部署到GAE。有一些外国API密钥,我不想保存在存储库中并公开它们。是否可以在GAE控制面板中为项目设置环境变量,以便在应用程序中捕获它?
问题内容: 我使用martini在Go中有一个GAE应用程序。我需要能够设置环境变量以告诉martini它应该使用生产设置进行初始化。根据Python文档,您可以在app.yaml中设置环境变量。我没有在Go docs中 看到任何有关此的内容,但我猜想它应该可以正常工作。 我需要能够将环境变量设置为,但是我只想在实际投入生产时(即)进行操作。有什么方法可以告诉您仅在非开发服务器上运行吗? 问题答案
我正在使用GAE部署我的应用程序,我想把一些环境变量传递给我的GAE实例。例如,每次我使用DB时,分配当前是这样的: 这很好,但问题是它是一个共享代码,每次有人进行本地测试时,它都会更改路径,并将更改推送到存储库。当有人拉动新的更改时,它需要更改以发出db请求,因为每个人都有不同的套接字更改路径。因此,我创建了以下声明: 因此,如果某个人的系统中有一个环境变量,那么它会接受该变量并避免绝对路径。问
问题内容: 如何在Windows中为Java(类路径)设置环境变量? 问题答案: 64位Windows 7或Windows 8上的Java SE Development Kit 8u112 设置以下用户环境变量(== 用户变量类型的环境变量) JAVA_HOME : C:\Program Files\Java\jdk1.8.0_112 JDK_HOME : %JAVA_HOME% JRE_HOME
Git 总是在一个 bash shell 中运行,并借助一些 shell 环境变量来决定它的运行方式。 有时候,知道它们是什么以及它们如何让 Git 按照你想要的方式去运行会很有用。 这里不会列出所有的 Git 环境变量,但我们会涉及最有的那部分。 全局行为 像通常的程序一样,Git 的常规行为依赖于环境变量。 GIT_EXEC_PATH 决定 Git 到哪找它的子程序 (像 git-commit