Què és Envilder?
Envilder és un sistema de resolució de configuració basat en un model. Defineixes un mapeig JSON entre noms de variables i rutes de secrets al núvol, i Envilder els resol de forma consistent: via la CLI per a desenvolupament local, la GitHub Action per a CI/CD o els SDKs de runtime per a l'inici de l'aplicació. Funciona amb AWS SSM Parameter Store i Azure Key Vault.
Sense Envilder, els equips fragmenten la gestió de secrets entre eines i etapes. L'entorn local utilitza fitxers .env, CI/CD llegeix d'integracions amb vaults, producció té el seu propi mètode. Això provoca desfasament de configuració, credencials filtrades i incorporacions lentes.
Amb Envilder, un model de mapeig és la font única de veritat. Els secrets es resolen des del teu vault al núvol sota demanda: mateix contracte, mateix comportament, ja sigui executant la CLI localment, la GitHub Action en CI o un SDK a l'inici de l'app.
Requisits
- Node.js v20+ – Descarregar
- AWS CLI (per AWS SSM) – Guia d'instal·lació
- Azure CLI (per Azure Key Vault) – Guia d'instal·lació
Instal·lació
Credencials del núvol
AWS (per defecte)
Envilder utilitza les teves credencials AWS CLI. Configura el perfil per defecte:
aws configure O utilitza un perfil amb nom:
aws configure --profile dev-account
# Then pass it to envilder
envilder --map=envilder.json --envfile=.env --profile=dev-account Azure Key Vault
Envilder utilitza Azure Default Credentials. Inicia sessió amb:
az login Proporciona l'URL del vault via $config al fitxer de mapeig o el flag --vault-url.
Permisos IAM
AWS
El teu usuari o rol IAM necessita:
| Operació | Permís |
|---|---|
| Pull | ssm:GetParameter |
| Push | ssm:PutParameter |
Exemple de política IAM:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["ssm:GetParameter", "ssm:PutParameter"],
"Resource": "arn:aws:ssm:us-east-1:123456789012:parameter/myapp/*"
}]
} Azure
| Operació | Permís |
|---|---|
| Pull | Get |
| Push | Set |
Recomanat: assigna Key Vault Secrets Officer via RBAC:
az role assignment create \
--role "Key Vault Secrets Officer" \
--assignee {YOUR_OBJECT_ID} \
--scope /subscriptions/{SUB}/resourceGroups/{RG}/providers/Microsoft.KeyVault/vaults/{VAULT} Per accés només de lectura, Key Vault Secrets User és suficient.
Fitxer de mapeig
El fitxer de mapeig (envilder.json) és el nucli d'Envilder. És un fitxer JSON que mapeja noms de variables d'entorn (claus) a rutes de secrets (valors) al teu proveïdor al núvol.
Format bàsic (AWS SSM, per defecte)
Quan no hi ha secció $config, Envilder utilitza AWS SSM Parameter Store per defecte. Els valors han de ser rutes de paràmetres SSM vàlides (normalment començant amb /):
{
"API_KEY": "/myapp/prod/api-key",
"DB_PASSWORD": "/myapp/prod/db-password",
"SECRET_TOKEN": "/myapp/prod/secret-token"
} Això genera:
API_KEY={value from /myapp/prod/api-key}
DB_PASSWORD={value from /myapp/prod/db-password}
SECRET_TOKEN={value from /myapp/prod/secret-token} La secció $config
Afegeix una clau $config al teu fitxer de mapeig per declarar quin proveïdor al núvol utilitzar i la seva configuració. Envilder llegeix $config per la configuració i tracta totes les altres claus com a mapeigs de secrets.
Opcions de $config
| Clau | Tipus | Per defecte | Descripció |
|---|---|---|---|
provider | "aws" | "azure" | "aws" | Proveïdor al núvol a utilitzar |
vaultUrl | string | — | URL d'Azure Key Vault (requerit quan el proveïdor és "azure") |
profile | string | — | Perfil AWS CLI per a configuracions multi-compte (només AWS) |
AWS SSM amb perfil
Per utilitzar un perfil AWS CLI específic (útil per a configuracions multi-compte), afegeix profile a $config:
{
"$config": {
"provider": "aws",
"profile": "prod-account"
},
"API_KEY": "/myapp/prod/api-key",
"DB_PASSWORD": "/myapp/prod/db-password"
} Això indica a Envilder que utilitzi el perfil prod-account del teu fitxer ~/.aws/credentials en lloc del perfil per defecte.
Azure Key Vault
Per Azure Key Vault, estableix provider a "azure" i proporciona el vaultUrl:
{
"$config": {
"provider": "azure",
"vaultUrl": "https://my-vault.vault.azure.net"
},
"API_KEY": "myapp-prod-api-key",
"DB_PASSWORD": "myapp-prod-db-password"
} Diferències clau per proveïdor
| AWS SSM | Azure Key Vault | |
|---|---|---|
| Format de ruta de secret | Rutes de paràmetres amb barres/myapp/prod/api-key | Noms amb guionsmyapp-prod-api-key |
| $config requerit | Cap (AWS és per defecte) | provider + vaultUrl |
| $config opcional | profile | — |
| Autenticació | Credencials AWS CLI | Azure Default Credentials |
Múltiples entorns
Un patró comú és tenir un fitxer de mapeig per entorn. L'estructura és la mateixa, només canvien les rutes dels secrets:
{
"$config": {
"provider": "aws",
"profile": "dev-account"
},
"API_KEY": "/myapp/dev/api-key",
"DB_PASSWORD": "/myapp/dev/db-password"
} {
"$config": {
"provider": "aws",
"profile": "prod-account"
},
"API_KEY": "/myapp/prod/api-key",
"DB_PASSWORD": "/myapp/prod/db-password"
} Després obté el correcte:
# Development
envilder --map=config/dev/envilder.json --envfile=.env.dev
# Production
envilder --map=config/prod/envilder.json --envfile=.env.prod Sobreescriure $config amb flags CLI
Els flags CLI sempre tenen prioritat sobre els valors de $config. Això et permet establir valors per defecte al fitxer i sobreescriure'ls per invocació:
# Uses $config from the map file as-is
envilder --map=envilder.json --envfile=.env
# Overrides provider and vault URL, ignoring $config
envilder --provider=azure \
--vault-url=https://other-vault.vault.azure.net \
--map=envilder.json --envfile=.env
# Overrides just the AWS profile
envilder --map=envilder.json --envfile=.env --profile=staging-account Ordre de prioritat: flags CLI / inputs GHA → $config al fitxer de mapeig → per defecte (AWS).
Comanda pull
Descarrega secrets del teu proveïdor al núvol i genera un fitxer .env local.
envilder --map=envilder.json --envfile=.env Opcions
| Opció | Descripció |
|---|---|
--map | Ruta al fitxer JSON de mapeig |
--envfile | Ruta on escriure el .env |
--provider | aws (per defecte) o azure |
--vault-url | URL d'Azure Key Vault |
--profile | Perfil AWS CLI a utilitzar |
Exemples
# Default (AWS SSM)
envilder --map=envilder.json --envfile=.env
# With AWS profile
envilder --map=envilder.json --envfile=.env --profile=prod-account
# Azure via $config in map file
envilder --map=envilder.azure.json --envfile=.env
# Azure via CLI flags
envilder --provider=azure \
--vault-url=https://my-vault.vault.azure.net \
--map=envilder.json --envfile=.env Sortida
# Generated by Envilder
API_KEY=abc123
DB_PASSWORD=secret456 Comanda push
Puja variables d'entorn d'un fitxer .env local al teu proveïdor al núvol utilitzant un fitxer de mapeig.
envilder --push --envfile=.env --map=envilder.json Opcions
| Opció | Descripció |
|---|---|
--push | Activa el mode push (requerit) |
--envfile | Ruta al teu fitxer .env local |
--map | Ruta al JSON de mapeig de paràmetres |
--provider | aws (per defecte) o azure |
--vault-url | URL d'Azure Key Vault |
--profile | Perfil AWS CLI (només AWS) |
Exemples
# Push to AWS SSM
envilder --push --envfile=.env --map=envilder.json
# With AWS profile
envilder --push --envfile=.env.prod --map=envilder.json --profile=prod-account
# Azure via $config in map file
envilder --push --envfile=.env --map=envilder.azure.json
# Azure via CLI flags
envilder --push --provider=azure \
--vault-url=https://my-vault.vault.azure.net \
--envfile=.env --map=envilder.json Pujar variable individual
Puja una variable d'entorn individual directament sense cap fitxer.
envilder --push --key=API_KEY --value={SECRET} --secret-path=/myapp/api/key Opcions
| Opció | Descripció |
|---|---|
--push | Activa el mode push (requerit) |
--key | Nom de la variable d'entorn |
--value | Valor a emmagatzemar |
--secret-path | Ruta completa del secret al teu proveïdor al núvol |
--provider | aws (per defecte) o azure |
--vault-url | URL d'Azure Key Vault |
--profile | Perfil AWS CLI (només AWS) |
.NET SDK
Carrega secrets directament a la teva aplicació .NET a l'inici. Façana d'una línia, constructor fluent, integració amb IConfiguration o control programàtic total.
Instal·lació
dotnet add package Envilder Una línia: resoldre + injectar
Resol secrets del fitxer de mapeig i injecta'ls a Environment en una sola crida:
using Envilder;
// Resolve secrets and inject into Environment
Env.Load("envilder.json");
var dbPassword = Environment.GetEnvironmentVariable("DB_PASSWORD"); Resoldre sense injectar
Obté secrets com un diccionari sense modificar l'entorn:
using Envilder;
var secrets = Env.ResolveFile("envilder.json");
var dbPassword = secrets["DB_PASSWORD"]; Constructor fluent amb sobreescriptures
Sobreescriu la configuració del proveïdor de manera programàtica amb l'API fluent:
using Envilder;
var secrets = Env.FromMapFile("envilder.json")
.WithProvider(SecretProviderType.Azure)
.WithVaultUrl("https://my-vault.vault.azure.net")
.Resolve();
// Or inject directly
Env.FromMapFile("envilder.json")
.WithProfile("staging")
.Inject(); Càrrega basada en entorn
Encamina la càrrega de secrets segons el teu entorn actual. Cada entorn mapeja al seu fitxer de secrets:
using Envilder;
var env = Environment.GetEnvironmentVariable("APP_ENV") ?? "development";
Env.Load(env, new Dictionary<string, string?>
{
["production"] = "prod-secrets.json",
["development"] = "dev-secrets.json",
["test"] = null, // no secrets loaded
}); Validació de secrets
Validació opcional que assegura que tots els secrets resolts tenen valors no buits:
using Envilder;
var secrets = Env.ResolveFile("envilder.json");
secrets.ValidateSecrets(); // throws SecretValidationException if any value is empty Via IConfiguration (ASP.NET)
Afegeix Envilder com a font de configuració a la teva aplicació ASP.NET:
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddEnvilder("envilder.json");
var app = builder.Build(); Avançat: control programàtic total
Analitza el fitxer de mapeig, resol secrets i injecta'ls a les variables d'entorn:
using Envilder;
var secrets = await Env.ResolveFileAsync("envilder.json");
EnvilderClient.InjectIntoEnvironment(secrets); Python SDK
Carrega secrets directament a la teva aplicació Python a l'inici. Configuració en una línia o control detallat amb el constructor fluent.
Instal·lació
uv add envilder
# or
pip install envilder Inici ràpid: una línia
Carrega secrets des d'un fitxer de mapeig i injecta'ls a l'entorn:
from envilder import Envilder
Envilder.load('envilder.json') Càrrega basada en entorn
Recomanat per a aplicacions multi-entorn. Mapeja cada entorn al seu fitxer de secrets:
from envilder import Envilder
import os
env = os.getenv('APP_ENV', 'development')
Envilder.load(env, {
'production': 'prod-secrets.json',
'development': 'dev-secrets.json',
'test': None,
}) Resoldre sense injectar
Obté secrets com un diccionari sense modificar l'entorn:
secrets = Envilder.resolve_file('envilder.json') Constructor fluent amb sobreescriptures
Sobreescriu la configuració del proveïdor de manera programàtica amb l'API fluent:
from envilder import Envilder, SecretProviderType
secrets = (
Envilder.from_map_file('envilder.json')
.with_provider(SecretProviderType.AZURE)
.with_vault_url('https://my-vault.vault.azure.net')
.resolve()
) Validació de secrets
Validació opcional que assegura que tots els secrets resolts tenen valors no buits:
from envilder import Envilder, validate_secrets
secrets = Envilder.resolve_file('envilder.json')
validate_secrets(secrets) # raises SecretValidationError if any value is empty Node.js SDK
Carrega secrets directament a la teva aplicació Node.js a l'inici. API asíncrona amb façana d'una línia o constructor fluent per a control total.
Instal·lació
npm install @envilder/sdk Inici ràpid: una línia
Carrega secrets des d'un fitxer de mapeig i injecta'ls a process.env:
import { Envilder } from '@envilder/sdk';
// Resolve secrets and inject into process.env
await Envilder.load('envilder.json');
const dbPassword = process.env.DB_PASSWORD; Resoldre sense injectar
Obté secrets com un Map sense modificar l'entorn:
import { Envilder } from '@envilder/sdk';
const secrets = await Envilder.resolveFile('envilder.json');
const dbPassword = secrets.get('DB_PASSWORD'); Constructor fluent amb sobreescriptures
Sobreescriu la configuració del proveïdor de manera programàtica amb l'API fluent:
import { Envilder, SecretProviderType } from '@envilder/sdk';
const secrets = await Envilder.fromMapFile('envilder.json')
.withProvider(SecretProviderType.Azure)
.withVaultUrl('https://my-vault.vault.azure.net')
.resolve();
// Or inject directly
await Envilder.fromMapFile('envilder.json')
.withProfile('staging')
.inject(); Càrrega basada en entorn
Recomanat per a aplicacions multi-entorn. Mapeja cada entorn al seu fitxer de secrets:
import { Envilder } from '@envilder/sdk';
const env = process.env.APP_ENV ?? 'development';
await Envilder.load(env, {
production: 'prod-secrets.json',
development: 'dev-secrets.json',
test: null, // no secrets loaded
}); Validació de secrets
Validació opcional que assegura que tots els secrets resolts tenen valors no buits:
import { Envilder, validateSecrets } from '@envilder/sdk';
const secrets = await Envilder.resolveFile('envilder.json');
validateSecrets(secrets); // throws SecretValidationError if any value is empty Configuració de GitHub Action
La GitHub Action d'Envilder obté secrets d'AWS SSM o Azure Key Vault en fitxers .env durant el teu workflow CI/CD. No cal compilar. L'action està pre-construïda i llesta per utilitzar des de GitHub Marketplace.
Prerequisits
- AWS: Configura credencials amb aws-actions/configure-aws-credentials
- Azure: Configura credencials amb azure/login
- Un envilder.json al teu repositori
La GitHub Action només suporta el mode pull (sense push).
Exemple bàsic de workflow
name: Deploy Application
on:
push:
branches: [main]
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1
- name: Pull Secrets from AWS SSM
uses: macalbert/envilder/github-action@v0
with:
map-file: config/envilder.json
env-file: .env
- uses: actions/setup-node@v6
with:
node-version: "20.x"
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm deploy Workflow multi-entorn
name: Deploy to Environment
on:
workflow_dispatch:
inputs:
environment:
description: 'Target environment'
required: true
type: choice
options: [dev, staging, production]
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-24.04
environment: ${{ inputs.environment }}
steps:
- uses: actions/checkout@v5
- uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
aws-region: us-east-1
- name: Pull ${{ inputs.environment }} secrets
uses: macalbert/envilder/github-action@v0
with:
map-file: config/${{ inputs.environment }}/envilder.json
env-file: .env
- uses: actions/setup-node@v6
with:
node-version: "20.x"
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm deploy Workflow d'Azure Key Vault
name: Deploy with Azure Key Vault
on:
push:
branches: [main]
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v5
- name: Azure Login
uses: azure/login@v2
with:
client-id: ${{ secrets.AZURE_CLIENT_ID }}
tenant-id: ${{ secrets.AZURE_TENANT_ID }}
subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
- name: Pull Secrets from Azure Key Vault
uses: macalbert/envilder/github-action@v0
with:
map-file: config/envilder.json
env-file: .env
provider: azure
vault-url: https://my-vault.vault.azure.net
- uses: actions/setup-node@v6
with:
node-version: "20.x"
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm deploy Inputs i outputs de l'Action
Inputs
| Input | Requerit | Per defecte | Descripció |
|---|---|---|---|
map-file | Sí | — | Ruta al fitxer JSON de mapeig |
env-file | Sí | — | Ruta al fitxer .env a generar |
provider | No | aws | aws o azure |
vault-url | No | — | URL d'Azure Key Vault |
Outputs
| Output | Descripció |
|---|---|
env-file-path | Ruta al fitxer .env generat |
Prioritat de configuració
Quan hi ha múltiples fonts de configuració, Envilder les resol en aquest ordre (el més alt guanya):
Això vol dir que --provider=azure a la CLI sobreescriurà "provider": "aws" a $config.
Configuració d'Azure Key Vault
Comprova quin model d'accés utilitza el teu vault:
az keyvault show --name {VAULT_NAME} \
--query properties.enableRbacAuthorization true→ true → Azure RBAC (recomanat)false/null→ false / null → Vault Access Policy (clàssic)
Opció A: Azure RBAC (recomanat)
az role assignment create \
--role "Key Vault Secrets Officer" \
--assignee {YOUR_OBJECT_ID} \
--scope /subscriptions/{SUB}/resourceGroups/{RG}/providers/Microsoft.KeyVault/vaults/{VAULT} Opció B: Vault Access Policy
az keyvault set-policy \
--name {VAULT_NAME} \
--object-id {YOUR_OBJECT_ID} \
--secret-permissions get set list Per accés només de lectura, get list és suficient. Afegeix set per push.