Referencia del modo pull

¿Qué hace envilder cuando lo ejecutas sin --push ni exec? Lee envilder.json, obtiene cada secreto mapeado de AWS SSM Parameter Store o Azure Key Vault y escribe los valores en .env. Un archivo existente se actualiza en su sitio, las claves que el archivo de mapeo no declara se quedan como están, y un secreto que no existe se omite con un aviso.

Requisitos previos

  • La CLI de envilder.
  • Un archivo de mapeo, envilder.json por defecto, que asocia cada variable a un identificador de secreto.
  • Acceso de lectura a todos los secretos mapeados: ssm:GetParameter en AWS (más kms:Decrypt cuando un parámetro usa una clave administrada por el cliente), o el permiso Get de secretos en Azure Key Vault, por ejemplo con el rol Key Vault Secrets User.
  • Credenciales que el SDK del proveedor pueda encontrar: un perfil de AWS, una sesión SSO o variables de entorno, o un inicio de sesión de Azure como az login o una identidad administrada.

Sinopsis

envilder [--map=<file>] [--envfile=<file>] \
  [--provider=aws|azure] [--vault-url=<url>] [--profile=<name>]

Pull es el modo por defecto: no hay ningún subcomando pull. Ejecuta envilder sin opciones para leer envilder.json y escribir .env en el directorio actual. Añadir --push, o --key, --value y --secret-path, cambia al modo push, y envilder exec es un subcomando aparte.

Opciones

OpciónPor defectoDescripción
--mapenvilder.json en el directorio actualArchivo de mapeo que se lee. La ejecución se detiene si el archivo no existe o el valor está vacío.
--envfile.envArchivo que se escribe. Se crea si no existe y se actualiza en su sitio si existe. Su directorio tiene que existir.
--provider$config.provider y, si no, awsaws o azure, en mayúsculas o minúsculas. Cualquier otro valor detiene la ejecución antes de leer ningún secreto.
--vault-url$config.vaultUrlURL de Key Vault, por ejemplo https://my-vault.vault.azure.net. Obligatoria con azure.
--profile$config.profile y, si no, la cadena de credenciales por defecto de AWSPerfil de AWS con nombre. Con azure se ignora y se muestra un aviso.

Una opción que recibe una ruta o un nombre nunca acepta un valor que empiece por -. En envilder --map --envfile=.env, --map no tiene valor, así que la ejecución se detiene con error: option '--map <path>' argument missing en lugar de leer --envfile=.env como ruta. envilder --help lista todas las opciones.

Cómo se combinan $config y las opciones

Cada ajuste sale de la primera fuente que lo define: la opción, después $config en el archivo de mapeo y después el valor por defecto. Una opción sustituye solo el campo que nombra, así que el resto de campos de $config se siguen aplicando. Toma este archivo de producción:

envilder.prod.jsonjson
{
  "$config": { "provider": "aws", "profile": "prod-account" },
  "DB_PASSWORD": "/my-app/prod/db-password"
}
envilder.prod.jsonjson
{
  "$config": {
    "provider": "azure",
    "vaultUrl": "https://my-app-prod.vault.azure.net"
  },
  "DB_PASSWORD": "my-app-prod-db-password"
}

El primer comando usa la configuración del archivo. El segundo sustituye un campo y mantiene el resto:

envilder --map=envilder.prod.json --envfile=.env.prod
envilder --map=envilder.prod.json --envfile=.env.prod --profile=ci-readonly

El segundo comando lee los mismos parámetros con el perfil ci-readonly. El proveedor sigue saliendo de $config.

envilder --map=envilder.prod.json --envfile=.env.prod
envilder --map=envilder.prod.json --envfile=.env.prod \
  --vault-url=https://my-app-dr.vault.azure.net

El segundo comando lee los mismos nombres de secreto de otro vault. El proveedor sigue saliendo de $config.

Reglas de precedencia completas en la referencia del archivo de mapeo

Ejemplo: actualizar un .env existente

El archivo de mapeo declara cuatro variables. En el vault, SENTRY_DSN no existe y FEATURE_FLAG está vacío. El proyecto ya tiene un archivo .env:

envilder.jsonjson
{
  "DB_PASSWORD": "/my-app/dev/db-password",
  "API_TOKEN": "/my-app/dev/api-token",
  "SENTRY_DSN": "/my-app/dev/sentry-dsn",
  "FEATURE_FLAG": "/my-app/dev/feature-flag"
}
.envdotenv
# Local settings
LOG_LEVEL=debug
DB_PASSWORD=old-password
SENTRY_DSN=https://old-dsn.example.com/1

Ejecuta envilder desde la raíz del proyecto. Salida esperada con AWS:

envilder
☁ AWS identity · account=123456789012 · region=eu-west-1 · profile=default

🪙  RESOLVING SECRETS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  ✓ DB_PASSWORD         → ***************ord
  ✓ API_TOKEN           → ***************c21
  ✗ SENTRY_DSN           secret not found (path: *******************dsn) — skipped
  ⚠ FEATURE_FLAG         no value found (path: *********************lag) — skipped

⭐ LEVEL CLEARED  —  2/4 secrets loaded · .env written

Con Azure no se muestra la línea de identidad de AWS; el resto es igual. Los valores van enmascarados: uno de más de 10 caracteres muestra los 3 últimos, uno más corto se oculta entero, y las rutas muestran sus 3 últimos caracteres. Las líneas omitidas son avisos en stderr; el resto va a stdout.

El archivo .env después:

.envdotenv
# Local settings
LOG_LEVEL=debug
DB_PASSWORD=local-dev-password
SENTRY_DSN=https://old-dsn.example.com/1
API_TOKEN=dev-token-7f3a9c21

Cómo se actualiza un .env existente

  • Una variable mapeada que ya está en el archivo se sustituye en su sitio: la misma línea, el mismo comentario en línea y las mismas comillas cuando todavía representan el valor nuevo.
  • Una línea que ya tiene el valor correcto no se reescribe, así que una ejecución sin nada nuevo deja el archivo idéntico byte a byte.
  • Se conservan las líneas que el archivo de mapeo no declara (LOG_LEVEL en el ejemplo), los comentarios, las líneas en blanco, el orden y los saltos de línea.
  • Las variables que todavía no están en el archivo se añaden al final. Un archivo nuevo termina con un salto de línea.
  • Un secreto omitido conserva el valor que el archivo ya tenía (SENTRY_DSN en el ejemplo). Envilder nunca elimina una línea.
  • Antes de escribir, Envilder vuelve a leer el resultado como lo hace dotenv. Si se perdiera o cambiara algún valor, no escribe nada y se detiene con un error que nombra las variables, nunca los valores.

Las comillas, los valores multilínea y el único valor que un archivo .env no puede contener se describen en qué puede contener un secreto

⚠️
El archivo .env contiene los valores reales de los secretos. Añádelo a .gitignore y bórralo cuando ya no lo necesites, o usa envilder exec para evitar el archivo.

Secretos que faltan, vacíos o que fallan

Un secreto que no existe (ParameterNotFound en AWS SSM, 404 en Key Vault) o cuyo valor está vacío se omite con un aviso. Los demás secretos se escriben igualmente, el resumen cuenta solo los resueltos (2/4 en el ejemplo) y el código de salida es 0.

Cualquier otro fallo, como un acceso denegado, credenciales que faltan o un error de red, detiene la ejecución. Envilder lista cada variable afectada con su ruta enmascarada y el motivo, no toca el archivo .env y sale con 1:

💥 GAME OVER — some secrets could not be fetched
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  ✗ API_TOKEN           → ******************ken

  ⮕ WHY?
     User: arn:aws:sts::123456789012:assumed-role/dev/session is not authorized to perform: ssm:GetParameter on resource: arn:aws:ssm:eu-west-1:123456789012:parameter/my-app/dev/api-token …

Cuando una sesión SSO de AWS ha caducado y stdin y stdout son un terminal, Envilder pregunta Run 'aws sso login --profile dev' now? [y/N]. Si aceptas y el inicio de sesión funciona, lo vuelve a intentar una vez. En CI, o si lo rechazas, muestra el comando que hay que ejecutar y sale con 1. Si un secreto que falta también debe detener la ejecución, usa envilder exec: nunca arranca un comando con un conjunto de secretos incompleto.

Errores habituales

MensajeSolución
No map file found. Provide --map or create envilder.json in the current directory.Ejecuta envilder desde el directorio que contiene envilder.json, o pasa --map=ruta/al/archivo.json.
Failed to read map file: config/envilder.jsonEl archivo indicado con --map no existe o no se puede leer. Las rutas relativas parten del directorio actual.
Invalid JSON in parameter map file: envilder.jsonCorrige la sintaxis JSON del archivo de mapeo. Una coma final o un comentario es la causa habitual.
Could not load credentials from any providersEl SDK de AWS no ha encontrado credenciales. Ejecuta aws configure o aws sso login, o pasa --profile con un perfil configurado.
User: arn:aws:sts::123456789012:assumed-role/dev/session is not authorized to perform: ssm:GetParameter on resource: …Las credenciales funcionan pero no pueden leer ese parámetro. Permite ssm:GetParameter sobre su ARN, más kms:Decrypt para una clave administrada por el cliente.
vaultUrl is required when using Azure provider. Set it in $config.vaultUrl in your map file or via --vault-url flag.Añade "vaultUrl": "https://<nombre-del-vault>.vault.azure.net" a $config, o pasa --vault-url.
Your AWS SSO session for profile "dev" ran out of lives.Ejecuta aws sso login --profile dev y vuelve a ejecutar envilder. En un terminal, Envilder se ofrece a iniciar la sesión por ti.
Cannot represent the value for "API_TOKEN" in a dotenv-compatible format without data lossEl valor no se puede escribir en un archivo .env sin cambiarlo, y no se ha escrito nada. Lee ese secreto con envilder exec o un SDK, o guárdalo codificado (por ejemplo en base64).