marinakr
Vault configuration best practice
Hi Friends,
I am about using libvault to read DATABASE_URL and other secrets.
I m going to use Vault.Auth.Kubernetes
I am not sure I am following mix release guide and ConfigProvider
Should I define a module VaultConfigProvider with codes like
def init(vault_config) when is_list(vault_config) do
vault_config
end
def load(config, vault_config) do
# We need to start any app we may depend on.
{:ok, _} = Application.ensure_all_started(:jason)
{:ok, vault} =
Vault.new(
engine: Vault.Engine.KVV2,
auth: Vault.Auth.Kubernetes,
http: Vault.HTTP.Tesla,
host: host
)
|> Vault.auth(%{role: role, jwt: jwt})
{:ok,
%{
"SECRET_KEY_BASE" => "..",
"DATABASE_URL" => "ecto://dbhost:5432/.."
} = json} = Vault.read(vault, "myapp/env")
Config.Reader.merge(
config,
my_app: [
some_value: json["DATABASE_URL"],
another_value: json["DATABASE_URL"],
]
)
and then remove all lines that get system env from releases.exs?
Is there the easiest way to get the vault secrets?
Where is the best place to define vault_config_provider.ex?
Marked As Solved
marinakr
So I decided to use runtime. exs in mix release
config/runtime.exs now looks like:
import Config
if config_env() == :prod do
{:ok, _} = Application.ensure_all_started(:jason)
{:ok, _} = Application.ensure_all_started(:hackney)
jwt =
System.get_env("JWT_TOKEN_PATH")
|> Kernel.||("/var/run/secrets/kubernetes.io/serviceaccount/token")
|> File.read!()
vault_host = System.fetch_env!("VAULT_ADDR")
vault_k8s_role = System.fetch_env!("VAULT_K8S_ROLE")
vault_prefix = System.fetch_env!("VAULT_PREFIX")
vault_env_path = System.get_env("VAULT_ENV_PATH") || "secrets"
{:ok, vault} =
Vault.new(
engine: Vault.Engine.KVV2,
auth: Vault.Auth.Kubernetes,
http: Vault.HTTP.Tesla,
host: vault_host
)
|> Vault.auth(%{role: vault_k8s_role, jwt: jwt})
{:ok, vault_secrets} = Vault.read(vault, "#{vault_prefix}/#{vault_env_path}")
################################################################################
## Release Config (with Vault secrets)
################################################################################
config :myapp, MS.Repo,
# ssl: true,
url: Map.fetch!(vault_secrets, "DATABASE_URL"),
pool_size: String.to_integer(vault_secrets["POOL_SIZE"]) || 10
...
end
and to include runtime.exs on release start runtime_config_path should be added to mix.exs:
releases: [
myapp_web: [
runtime_config_path: "config/runtime.exs",
version: "0.0.1",
applications: [
myapp_web: :permanent
...
So no additional config readers were used
2
Popular in Questions
In Ruby, I can go:
User.find_by(email: "foobar@email.com").update(email: "hello@email.com")
How can I do something similar in Elixir? ...
New
This should be a simple problem but I just can’t seem to figure it out. I have a standalone Elixir app that won’t find the database.
Dep...
New
As many of you may have realized by now (sorry for all the posts here) I’ve been working on a db problem where I’m trying to aggregate a ...
New
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
I will often find my self writing things similar to:
case some_value do
nil -> something()
"" -> something()
_ -> someth...
New
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
I am trying to run a deploy with docker and I successfully runned with this command:
docker build -t romenigld/blog-prod .
but when I t...
New
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors:
[WARN] - (starship::utils): Executing command ...
New
Hi everyone!
I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
I’ve been re-reading swift book again and noticed that multiline strings there don’t have a trailing line break, unlike in elixir
iex(2)...
New
Other popular topics
Here are few pieces of (common) Linux knowledge that we use for reasonably small one server apps. We use Ubuntu but this should work for ...
New
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
Hello all!
I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
I have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I'm writing a test for one of t...
New
What is most correct way to open, read and parse JSON file with poison?
For example if we have example.json file in root of some projec...
New
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this
"1000"
What is the ...
New
Hi,
I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list....
New
Hey,
Just curious what are the main benefits of Elixir compared to Clojure?
When is Elixir more useful than Clojure and vice versa?
Th...
New
I tried installing
elixir 1.11.2
erlang 23.3.4
via asdf in my zsh shell. Enabled the versions locally and globally.
When I list them ...
New
After calling mix ecto.create I get this error:
17:00:32.162 [error] GenServer #PID<0.412.0> terminating
** (Postgrex.Error) FATAL...
New








