Elixir 在凤凰/长生不老药中,你在哪里储存秘密?推荐在哪里?

Elixir 在凤凰/长生不老药中,你在哪里储存秘密?推荐在哪里?,elixir,phoenix-framework,Elixir,Phoenix Framework,您是否使用环境变量或prod.secret.exs存储密码、api密钥等?什么是经验法则?我觉得它们或多或少是一样的,因此不知道该用哪一个 请注意,我不想通过合并第三方服务使其复杂化 我的代码中的库。我想要一个开箱即用的解决方案,最好是。环境变量 它是否是凤凰/长生不老药并不重要 根据一套称为 12因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。Env-vars很容易在部署之间进行更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码repo的可能性很小;与自定义

您是否使用环境变量或
prod.secret.exs
存储密码、api密钥等?什么是经验法则?我觉得它们或多或少是一样的,因此不知道该用哪一个

请注意,我不想通过合并第三方服务使其复杂化 我的代码中的库。我想要一个开箱即用的解决方案,最好是。

环境变量

它是否是凤凰/长生不老药并不重要

根据一套称为

12因素应用程序将配置存储在环境变量中(通常缩写为env vars或env)。Env-vars很容易在部署之间进行更改,而无需更改任何代码;与配置文件不同,它们被意外签入代码repo的可能性很小;与自定义配置文件或其他配置机制(如Java系统属性)不同,它们是语言和操作系统无关的标准


参考资料:

如此快速和简单-对于小型混合/Phoenix项目,我通常使用
dev/test/prod.secret.exs
文件,然后使用
Application.get_env(:key,:value)
,例如-my
{env}.secret.exs
文件可以如下所示:

config :my_app, api_key: "1234567890"
然后在代码的某个地方:

def do_stuff do
  api_key = Application.get_env(:my_app, :api_key)
end
当然,主配置文件应该包含一个导入:

import_config "#{Mix.env}.secret.exs"
什么是真正重要的-不要忘记将您的机密文件添加到
.gitignore


对于需要更多安全性的更大项目,我会使用env变量。请检查这一点。

对我来说,这是两者的混合,取决于我是否希望该值在运行时发生变化。对于保持相当静态的东西,如API键,我使用
prod.secrets.exs.
之所以使用它,是因为这样我可以在配置应用程序的方式上保持一致。对于其他一切,我都在使用配置文件,我想对我的秘密也这样做。我还可以将机密文件放入不同的版本控制系统中,这样我就有了对该文件所做更改的历史记录以及更改人。我还可以使编写代码的人不需要读取机密文件。在部署时,有权进行部署的人可以运行一个脚本,将机密文件拉入,然后创建一个发布。该版本被部署到Amazon,秘密被隐藏。还有一些错误情况可能会导致应用程序将其环境转储到您的日志系统,而您的所有秘密都以明文形式存在


这样做的缺点是配置是静态的。对机密的任何更改都意味着运行另一个版本。如果您有一个特性标志,比如说
DEBUG=true
,那么您不希望运行另一个版本来启用调试。这就是环境变量发挥作用的地方。只需更改环境,您的应用程序将开始调试。但是,如果要使用环境变量,则应该在要使用它的模块中调用
System.get_env
。我在调用
系统时被咬了一口。将_env
放入我的
prod.secrets.exs
文件,结果是我的应用程序使用当时存在的环境变量编译,而更改不会动态应用。

为什么在
dev
环境中会有秘密?!隐藏可以在环境之间共享的API密钥?可能有各种原因。在dev中,您可能连接到一个开发数据库,该数据库周围的限制更少,或者具有更开放的访问权限,但在prod中,您将使用一个生产数据库服务器。因此,您需要开发环境的秘密。当然,如果您已经编写了应用程序来从应用程序配置中提取凭据,那么您需要在其中包含一些值,即使在dev中也是如此。