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.
RUNNER_SECRET_STORE_MODE=env # default, developmentRUNNER_SECRET_STORE_MODE=aws # AWS Secrets ManagerRUNNER_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.
env: desarrollo
Sección titulada «env: desarrollo»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.
aws: AWS Secrets Manager
Sección titulada «aws: AWS Secrets Manager»RUNNER_SECRET_STORE_MODE=aws# RUNNER_SECRETS_MANAGER_REGION=us-east-1 # absent ⇒ SDK default resolution# RUNNER_SECRETS_MANAGER_PREFIX=whystack/ # prefixes the SecretIdResuelve 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.
vault: HashiCorp Vault (KV v2 y v1)
Sección titulada «vault: HashiCorp Vault (KV v2 y v1)»RUNNER_SECRET_STORE_MODE=vaultRUNNER_VAULT_ADDR=https://vault.example.com
# token authRUNNER_VAULT_AUTH=tokenRUNNER_VAULT_TOKEN=…
# or AppRole authRUNNER_VAULT_AUTH=approleRUNNER_VAULT_ROLE_ID=…RUNNER_VAULT_SECRET_ID=…
# or Kubernetes auth, the method that belongs in a clusterRUNNER_VAULT_AUTH=kubernetesRUNNER_VAULT_K8S_ROLE=whystack# optional; default belowRUNNER_VAULT_K8S_TOKEN_PATH=/var/run/secrets/tokens/vault/tokenAcceso 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_ADDRvault auth requires RUNNER_VAULT_TOKEN (token), RUNNER_VAULT_ROLE_ID+RUNNER_VAULT_SECRET_ID (approle) or RUNNER_VAULT_K8S_ROLE (kubernetes)Un secreto ausente no es un error
Sección titulada «Un secreto ausente no es un error»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"]}Alcance por connector
Sección titulada «Alcance por connector»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.