4
votes

Stocker la chaîne de connexion pour asp.net core 2 sur aws eb

J'ai déployé l'application .net core 2 sur aws eb. J'ai besoin de serveurs de staging, de qa et de prod, et je ne sais pas comment gérer les chaînes de connexion? Est-il possible de le stocker dans des variables env sur eb? Ou est-il possible de créer env pour ces trois instances et d'avoir un fichier application.json différent pour chacune?


0 commentaires

4 Réponses :


2
votes

Vous pouvez utiliser modèle d'options dans ASP.NET Core

Exemple, vous avez appsetting.json comme celui-ci

public Startup(
            IConfiguration configuration,
            IHostingEnvironment hostingEnvironment)
        {
            _configuration = configuration;
            _hostingEnvironment = hostingEnvironment;

            var builder = new ConfigurationBuilder();

            if (_hostingEnvironment.IsDevelopment())
            {
                builder.AddUserSecrets<Startup>();
            }
            else
            {
                builder
                    .SetBasePath(hostingEnvironment.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
            }
        }

Je devrai définir une classe de modèle comme celle-ci pour stocker des informations p>

private readonly IOptions<WebAppUrl> _webAppUrl;

public EmailSender(IOptions<WebAppUrl> _webAppUrl)
{
  _webAppUrl = _webAppUrl;
}

_webAppUrl.Value.Staging;
_webAppUrl.Value.Qa;
_webAppUrl.Value.Prod;

Nous avons donc la structure de configuration. La dernière chose dont nous avons besoin est de vous inscrire dans Startup.cs

services.Configure (configuration.GetSection ("WebAppUrl"));

Vous pouvez donc utiliser comme ça

XXX

Ok, voici comment Microsoft a configuré plusieurs appsetting.json fichier . Vous pouvez jeter un oeil à parce que c'est un article assez long

Voici comment je configure en utilisant le fichier json basé sur l'environnement

public class WebAppUrl
{
  public string Staging { get; set; }
  public string Qa { get; set; }
  public string Prod { get; set; }
}


1 commentaires

Cela fait partie de la solution possible. Le principal problème est de créer des variables env sur le beanstalk élastique pour l'application de base .net, d'une manière ou d'une autre, eb ne peut pas le gérer. PS Comme je l'ai lu, la meilleure pratique consiste à le stocker dans différents fichiers appsettings.json ( appsettings.Stanging.json , appsettings.Qa.json . ..)



1
votes

Voici une approche utilisant des ebextensions et des métadonnées d'instance:

Utilisez ebextensions pour gérer la personnalisation du serveur avant le démarrage de votre application.

  • Votre instance doit avoir un rôle doté de l'autorisation ec2: DescribeTags .
  • Configurez votre application EB pour définir une tag a>.
  • Soit vous disposez d'un fichier de configuration d'application avec des chaînes de connexion par environnement, soit vous utilisez quelque chose comme AWS Secrets Manager (votre rôle d'instance aura besoin d'une autorisation pour ce service) pour contenir vos chaînes de connexion (meilleure sécurité).
  • Le code de l'application utilise une variable d'environnement pour sélectionner la chaîne de connexion correcte dans le fichier de configuration ou dans le gestionnaire de secrets.
  • Vous déployez votre application avec un fichier init.config dans le dossier .ebextensions à la racine.
  • Le fichier init.config lit les métadonnées de l'instance pour déterminer l'environnement et définir la variable d'environnement.
  • Votre application démarre, lit la variable, extrait la chaîne de connexion et se connecte à la base de données correcte.

L'exemple ci-dessous est init.config pour l'instance Windows avec PowerShell, mais peut être adapté à bash + aws cli.

La première étape écrit un script PowerShell. Le script lit la balise Environment et écrit la valeur dans une variable à l'échelle de la machine pour que l'application puisse la récupérer. La deuxième étape appelle le script.

files:
  "c:/cfn/init.ps1":
    content: |
      $instanceDoc = Invoke-RestMethod 'http://169.254.169.254/latest/dynamic/instance-identity/document'
      $nameTagList = Get-EC2Tag -Region ($instanceDoc.region) -Filter @{name='resource-type';value='instance'},@{name='resource-id';value=$instanceDoc.instanceId},@{name='tag:Environment';value='*'} | Select -First 1
      $envName = $nameTagList.Value
      [Environment]::SetEnvironmentVariable("APP_ENV", $envName, [EnvironmentVariableTarget]::Machine
container_commands:
  00-invoke-init:
    command: powershell.exe -nologo -noprofile -file "c:\cfn\init.ps1"


0 commentaires

0
votes

Donc, il y a un problème avec la gestion des variables env à partir de Elastic Beanstalk pour l'application principale .net.

Voici la réponse (hack) comment forcer l'application à obtenir vos variables d'environnement Variables d'environnement AWS Elastic Beanstalk dans ASP.NET Core 1.0

Ainsi, toutes les données sensibles telles que la chaîne de connexion doivent se trouver sur des variables env élastiques beanstalk. D'autres peuvent être dans appsettings.Staging.json , appsettings.Qa.json , etc.

N'oubliez pas d'ajouter ASPNETCORE_ENVIRONMENT var dans les variables d'environnement.


1 commentaires

Tout comme ce que je viens de mettre à jour avec ma réponse. Pouvez-vous accepter cela. Merci



0
votes

Je suggérerais de mettre la configuration dans le magasin de paramètres d'AWS System Manager. Le package NuGet Amazon.Extensions.Configuration.SystemsManager ajoute Parameter Store en tant que fournisseur de configuration au système de configuration .NET. Voici un article de blog pour plus d'informations. https://aws.amazon .com / blogs / developer / net-core-configuration-provider-for-aws-systems-manager /


0 commentaires