Adding environment vars to .NET Aspire services
| CommentsHave you heard about .NET Aspire yet? If not, go read, then maybe watch. It’s okay I’ll wait.
Ok, great now that you have some grounding, I’m going to share some tips time-to-time of things that I find delightful that may not be obvious. In this example I’m using the default .NET Aspire application template and added an ASP.NET Web API with enlisting into the orchestration. What does that mean exactly? Well the AppHost project (orchestrator) now has a reference to the project like so:
var builder = DistributedApplication.CreateBuilder(args); builder.AddProject<Projects.WebApplication1>("webapplication1"); builder.Build().Run();
When I run the AppHost it launches all my services, etc. Yes this is a VERY simple case and only one service…I’m here to make a point, stay with me.
If in my service I add some Aspire components they may come with their own configuration information. Things like connection strings or configuration options for the components. A lot of times these will result in environment variables at deploy time that the components will read. You can see this if you run and inspect the environment variables of the app:
But what if I have a configuration/variable that I need to set that isn’t coming from a component? I want that to be a part of the application model so that the orchestrator puts things in the right places, but also deployment tooling is aware of my whole config needs. No problem, here’s a quick tip if you haven’t discovered it yet!
I want a config value in my app as MY_ENV_CONFIG_VAR…a very important variable. It is a value my API needs as you can see in this super important endpoint:
app.MapGet("/somerandomconfigvar", () => { var config = builder.Configuration.GetValue<string>("MY_ENV_CONFIG_VAR"); return config; });
How can I get this in my Aspire environment so the app model is aware, deployment manifests are aware, etc. Easy. In the AppHost change your AddProject line to add a WithEnvironment() call specifying the variable/value to set. Like this:
var builder = DistributedApplication.CreateBuilder(args); builder.AddProject<Projects.WebApplication1>("webapplication1") .WithEnvironment("MY_ENV_CONFIG_VAR", "Hello world!"); builder.Build().Run();
Now when I launch the orchestrator runs all my services and adds them to the environment variables for that app:
And when I produce a deployment manifest, that information is stamped as well for deployment tools to reason with and set in their configuration way.
{ "resources": { "webapplication1": { "type": "project.v0", "path": "..\\WebApplication1\\WebApplication1.csproj", "env": { "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EXCEPTION_LOG_ATTRIBUTES": "true", "OTEL_DOTNET_EXPERIMENTAL_OTLP_EMIT_EVENT_LOG_ATTRIBUTES": "true", "MY_ENV_CONFIG_VAR": "Hello world!" }, "bindings": { "http": { "scheme": "http", "protocol": "tcp", "transport": "http" }, "https": { "scheme": "https", "protocol": "tcp", "transport": "http" } } } } }
Pretty cool, eh? Anyhow, just a small tip to help you on your .NET Aspire journey.
Please enjoy some of these other recent posts...
Comments