Impostare il nome dell'environment ASP.NET Core di un AWS Beanstalk

pubblicato da il 24/07/2020 alle 7:53

ASP.NET Core  AWS 

Introduzione

Tra le feature introdotte da ASP.NET Core più apprezzate figura sicuramente la possibilità di utilizzare il valore della variabile di ambiente ASPNETCORE_ENVIRONMENT per selezionare la variante del file appSettings.json da utilizzare: ad esempio, impostando la suddetta variabile al valore AWS sarà possibile far utilizzare a runtime il file appSettings.AWS.json quale contenitore della configurazione applicativa.

Si supponga, ad esempio, di avere due ambienti di esecuzione chiamati, rispettivamente, Development (sostanzialmente, la nostra macchina di sviluppo) ed AWS (l'ambiente di produzione): sfruttando questa funzionalità, sarà possibile impostare tutte le opzioni di configurazione comuni ad entrambi gli ambienti di esecuzione nel file appSettings.json e poi predisporre un file ad hoc per ogni ambiente contenenti i setting specifici ad ogni ambiente avendo l'accortezza di comporre il nome dei file specifici agli ambienti seguendo la regola: appSettings.[NOME_AMBIENTE].json.

I file di configurazione

Predisponiamo quindi 3 file:

appSettings.json
Opzioni valide per tutti gli ambienti
appSettings.AWS.json
Opzioni valide se la variabile d'ambiente ASPNETCORE_ENVIRONMENT è impostata al valore AWS
appSettings.Development.json
Opzioni valide se la variabile d'ambiente ASPNETCORE_ENVIRONMENT è impostata al valore Development

 

A puro titolo di esempio, il contenuto dei suddetti file potrebbe essere il seguente:

file appSettings.json
{
    "AllowedHosts": "*",
    "MiaOpzione": "None"
}

file appSettings.AWS.json
{
    "MiaOpzione": "ValoreAWS"
}

file appSettings.Development.json
{
    "MiaOpzione": "ValoreDev"
}

Configurare AWS Elastic Beanstalk

La console di AWS Elastic Beanstalk non offre un supporto diretto per impostare tale variabile ma è possibile farlo, come descritto dalla documentazione, eseguendo un comando di configurazione successivamente alla creazione della istanza dell'abiente di esecuzione.

Per creare il comando, occorre creare nella root del progetto un folder chiamato .ebextensions e, al suo interno, un file di testo chiamato command.config avente il seguente contenuto:

commands:
  01_create_env_variable:
    command: "powershell.exe [Environment]::SetEnvironmentVariable('ASPNETCORE_ENVIRONMENT', 'AWS', 'Machine')"

Poichè il file deve contenere un contenuto YAML valido si presti attenzione alla indentazione, che deve essere effettuata con il carattere SPACE.

E' ora necessario assicurarsi che il file sia incluso durante la pubblicazione della applicazione: per far ciò, modificheremo il file csproj della nostra applicazione introducendo la seguente sezione:

<ItemGroup>
    <None Include=".ebextensions\command.config">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
</ItemGroup>

E' sufficiente, a questo punto, effettuare la distribuzione della applicazione nel Beanstalk usando l'AWS Toolkit per Visual Studio (versioni 2017, 2019 o Code); ove occorresse pubblicare multiple applicazioni all'interno dello stesso Beanstalk, sarà sufficiente seguire le istruzioni incluse dal tip precedentemente pubblicato.

Leggere le opzioni di configurazione

Impostata la variabile di ambiente, potremo quindi usare le interfacce IWebHostEnvironment e IConfiguration di ASP.NET Core per ricavare, rispettivamente, il nome di ASPNETCORE_ENVIRONMENT e della opzione MiaOpzione leggendola dal file opportuno.

Tali interfacce sono disponibili ovunque sia supportata la funzionalità di dependency injection offerta out of the box da ASP.NET Core; ad esempio, nel caso di una action di un controller, potremo utilizzare il codice seguente:

public class HomeController : Controller
{
    public IActionResult Index([FromServices] IWebHostEnvironment environment, [FromServices] IConfiguration configuration)
    {
        var environmentName = environment.EnvironmentName;
        var valoreMiaOpzione = configuration["MiaOpzione"];
    }
}