Environments are part of the project
Name dev, staging and production in one file. Each keeps its own state and its own lock, so two applies against different environments never contend. Values differ through variables, not through copied directories.
vars/production.yml
Mistakes fail before anything runs
The provider's schema declares what every attribute means, so a misspelled reference or a field pointed at the wrong kind of resource is a compile error that names the fix, not a create that dies after four resources already exist.
$ infrena validate
You pass the resource, not the id
Write vpc: ${vpc} and Infrena fills in whatever attribute the provider says that field refers to. You stop having to remember whether a given API wants an id, a name or an ARN.
subnet_id: ${public_subnet}
Values remember where they came from
Every value in a plan can say whether you wrote it, a module defaulted it, an environment overrode it or the provider supplied it. Resolution order is fixed and documented, and explicit configuration always beats an implicit default.
size: 10 [default, from provider default]
Adopt the infrastructure you already run
Discovery is read-only. It reports what exists and what each resource would be called, so a name collision shows up before it happens. Import then writes minimal configuration, and never writes a secret into it.
$ infrena import dev --generate
Three dependencies, everything else a plugin
Providers and state backends run as separate processes and ship separately, so the engine never grows an SDK. The AWS SDK lives in the AWS provider, not in your Infrena binary.
- plugin: aws