Ir al contenido

Secret stores

El runner lee las credenciales de tus servicios desde tu secret manager, en el boot, y las mantiene solo en memoria. No se escribe nada en disco, y nada queda bajo custodia fuera de tu infraestructura.

Ventana de terminal
RUNNER_SECRET_STORE_MODE=env # default, development
RUNNER_SECRET_STORE_MODE=aws # AWS Secrets Manager
RUNNER_SECRET_STORE_MODE=vault # HashiCorp Vault (KV v2 or v1)

Los tres backends implementan la misma interfaz mínima, get(name), así que cambiar de uno a otro no cambia nada más en el runner.

Lee del entorno del proceso. Es el valor por defecto, y Compose lo alimenta por pass-through: el valor viene del shell, inyectado por tu secret manager o por runner.secrets.env vía npm run dev:runner:file.

Sirve para desarrollo local. En producción, prefiere uno de los dos de abajo.

Ventana de terminal
RUNNER_SECRET_STORE_MODE=aws
# RUNNER_SECRETS_MANAGER_REGION=us-east-1 # absent ⇒ SDK default resolution
# RUNNER_SECRETS_MANAGER_PREFIX=whystack/ # prefixes the SecretId

Resuelve mediante la cadena de credenciales por defecto del SDK (IAM role, workload identity, IRSA), sin claves estáticas. Es el camino natural para un runner en EKS o ECS.

PREFIX antepone un prefijo al SecretId, así que un secreto llamado DD_API_KEY con el prefijo whystack/ se busca como whystack/DD_API_KEY.

Ventana de terminal
RUNNER_SECRET_STORE_MODE=vault
RUNNER_VAULT_ADDR=https://vault.example.com
# token auth
RUNNER_VAULT_AUTH=token
RUNNER_VAULT_TOKEN=…
# or AppRole auth
RUNNER_VAULT_AUTH=approle
RUNNER_VAULT_ROLE_ID=…
RUNNER_VAULT_SECRET_ID=…
# or Kubernetes auth, the method that belongs in a cluster
RUNNER_VAULT_AUTH=kubernetes
RUNNER_VAULT_K8S_ROLE=whystack
# optional; default below
RUNNER_VAULT_K8S_TOKEN_PATH=/var/run/secrets/tokens/vault/token

Acceso HTTP a la API del KV. La versión del mount (v2 o v1) se detecta en la primera lectura, así que un mount v1 ya no se confunde con un secreto ausente. Opciones adicionales:

Variable Por defecto Para qué
RUNNER_VAULT_NAMESPACE ninguno Vault Enterprise.
RUNNER_VAULT_KV_MOUNT secret Mount del KV. v2 y v1 se detectan automáticamente.
RUNNER_VAULT_KV_FIELD value Qué campo del secreto devolver.
RUNNER_VAULT_PREFIX '' Antepone un prefijo a la ruta lógica.

El esquema rechaza la configuración incompleta en el boot:

RUNNER_SECRET_STORE_MODE=vault requires RUNNER_VAULT_ADDR
vault auth requires RUNNER_VAULT_TOKEN (token), RUNNER_VAULT_ROLE_ID+RUNNER_VAULT_SECRET_ID (approle) or RUNNER_VAULT_K8S_ROLE (kubernetes)

En los dos backends remotos, “no encontrado” (ResourceNotFoundException en AWS, 404 en Vault) se resuelve como undefined, no como una excepción.

Eso es lo que hace funcionar el modelo lazy: configuras solo los connectors que usas, y los demás simplemente salen del served set. Un secreto ausente no tumba el boot.

La señal está en el log de boot:

connector not served {connectorId: "azion", missing: ["AZION_TOKEN"]}

El runtime limita el alcance del secret store por connector: cada uno ve solo los secretos que declaró en su propio manifest. Un connector no puede leer la credencial de otro, aunque corra en el mismo proceso. Es la primera de las cuatro garantías del runtime.