Рубрики
Uncategorized

Развертывание .NET. Основное приложение для AWS EURACAL BEANTALK через Azure DevOps

В этом посте я покажу вам, как легко развернуть .NET Основное приложение для AWS упругой фасота. Помечено с AWS, Azure, DevOps.

Развертывание .NET. Основное приложение для AWS EURACAL BEANTALK через Azure DevOps

Введение

В другой жизни и моих двух предыдущих ролях я евангализировал Azure DevOps без беспокойства. В одной позиции мы не имели ничего с точки зрения инструментару за пределами очень устаревшей реализации Subversion Отказ В другой полосе добавить устаревшие версии Джира и Дженкинс на смесь. По крайней мере, в этом случае Jenkins и Subversion были несколько связаны, однако Джира осталась в холоде.

В любое время я бы демонстрировал DEVOPS Я столкнулся с теми же вопросами и критикой.

  • «Но это не будет работать с [вставить язык без Microsoft], будет ли это?»
  • » Это Microsoft, это никогда не будет работать вне их экосистемы! »
  • «Мы хотим принять наши приложения с Amazon, это не будет работать здесь».

Это были комментарии к дружелюбной стороне вещей. Иногда они были просто непрофессиональными (чтобы поставить его хорошо). Но как @DonovanBrown , — это не твоего папы Microsoft. «

В этом посте я покажу вам, как легко развернуть .NET Основное приложение для AWS Эластичный Beanstalk Отказ

Настройка среды AWS

Для начала вам нужно будет настроить эластичную среду Beanstalk AWS. Перед написанием этого поста я никогда не трогал AWS. Процесс довольно прямо вперед.

Войдите в консоль управления AWS, а затем искать «Эластичный Beanstalk»

Нажмите на Создать новое приложение Кнопка к верхнему правому углу. Модаль ниже появится. Введите имя для вашего приложения в Название приложения поле и нажмите на Создать кнопка.

Это приведет нас к разделу базового конфигурации. Я выбрал .СЕТЬ (Windows/IIS) для Платформа Однако, однако, вы можете запустить .NET Ядро большинства предложений Linux. Для Код приложения , выберите Пример приложения Поскольку мы будем развернуть наш фактический код с Azure DEVOPS. После того, как вы установили базовую конфигурацию, нажмите Создать приложение кнопка.

Это будет охватить создание нашей эластичной среды Beanstalk.

Как только создание будет завершено, он перенаправляет вас на приборную панель упругих Beanstalk, показанной ниже. Вы можете просмотреть приложение, нажав на URL в верхней части страницы.

Поздравляем, вы только что создали веб-приложение по умолчанию ASP.NET.

### Создание учетной записи AWS IAM

Далее вы создадите учетную запись, которую вы можете использовать для развертывания вашего приложения из Azure DEVOPS. Нажмите на раскрывающееся меню, связанное с вашим Имя учетной записи а затем выберите Мои учетные данные о безопасности Отказ

Модаль предупреждения будет всплыть, выберите Начните с IAM пользователей Отказ

Далее вы создадите группу безопасности. Введите «Azuredevops» для Название группы . Затем нажмите Следующий шаг Отказ

Это приводит вас к странице присоединения политики. Введите «awselazerBeanstalk» в поле поиска для фильтрации через политики. Затем выберите Awselazerbeanstalkfullaccess Отказ Нажмите Прикрепить политику продолжать.

Просмотрите настройки и нажмите Создать группу Отказ

Это приводит вас к экрану Добавить пользователя. Введите Имя пользователя Отказ Я использовал имя «AzuredevOps» для этого примера. Для Тип доступа Выберите Программный доступ . Затем нажмите Далее: Разрешения Отказ

Далее нам нужно установить разрешения на учетную запись. Мы делаем это, добавив пользователей в группы с прилагаемыми к ним политики. Мы разместим эту учетную запись в группе AzuredevOps, которые мы раньше создали. Нажмите Далее: Теги Отказ

Это приведет нас к странице тегов. В этом примере я не добавил никаких тегов. Нажмите Далее: Обзор Отказ

Просмотрите настройки вашей учетной записи, и если они правильно, нажмите Создать пользователя Отказ

Поздравляем, вы успешно создаете новую учетную запись пользователя. Следующая копия Доступ к ключу ID и Секретный ключ доступа Как мы будем хранить их в Azure Key Vault Отказ

### Создание Azure DevOps Service Connection для AWS

Следующий шаг — создать новый Сервисное соединение Внутри Azure DevOps для AWS. Это соединение будет использовать учетную запись, которую мы создали на предыдущем шаге.

Во-первых, перейдите к настройкам проектов, нажав кнопку «Настройки» к нижней части левого меню.

Затем прокрутите вниз до Трубопроводы и выберите Сервисные связи Отказ

Далее нажмите Создать сервисное соединение

Выберите AWS и нажмите Следующий

Заполните Доступ к ключу ID и Секретный ключ доступа От IAM пользователь, который вы создали в AWS.

Введите Имя подключения службы и проверьте Предоставить разрешение доступа на все трубопроводы Отказ Затем нажмите Сохранять.

Теперь вы создали новое обслуживание.

### Создание приложения

В этом посте мы развернум довольно простую .NET Основное приложение. Создать новый .NET CORE MVC приложение и внесите следующие изменения.

В Index.CHTML файл Замените существующий код следующим.

@{
    ViewData["Title"] = "Home Page";
}

Welcome

This demo is running .NET Core on @ViewData["CloudEnv"].

Learn about building Web apps with ASP.NET Core.

Тогда в Homecontroller Добавить Iconfiguration Property и добавьте его в конструктор.

private readonly ILogger _logger;

private readonly IConfiguration _configuration;

public HomeController(ILogger logger, IConfiguration configuration)
{
     _logger = logger;
     _configuration = configuration;
 }

Заменить Индекс Метод Homecontroller со следующим кодом.

« «.

public IActionResult Index()
{
ViewData["CloudEnv"] = _configuration["CloudEnv"];
return View();
}

Add the setting **CloudEnv** to appsettings.json. Not the prefix and postfix "\_\_" in the CloudEnv variable. We are tokenizing this variable so that the value can be replaced with a pipeline variable later on.



```
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "CloudEnv":  "__CloudEnv__"
}

Afterwards, add the CloudEnv setting to appsettings.Development.json

```

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"CloudEnv": "my local machine"
}

That's it for the application. Now on to the pipeline.

### Creating the Multi-Stage Pipeline

In this example we will create a multi-stage pipeline using YAML. The first stage will build the pipeline and the second will deploy it to AWS.

### Marketplace Extensions

The multi-stage pipeline we are creating requires two [Marketplace Extensions](https://docs.microsoft.com/en-us/azure/devops/marketplace-extensibility/?view=azure-devops). Install the following extensions into your project. Consult [this reference guide](https://docs.microsoft.com/en-us/azure/devops/marketplace/install-extension?view=azure-devops&tabs=browser) if you are having issues installing the extensions.

- [Replace Tokens](https://marketplace.visualstudio.com/items?itemName=qetza.replacetokens)
- [AWS Tools for Microsoft Visual Studio Team Services](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-vsts-tools)

### Creating the Initial Pipeline

First, we will create the basis for the pipeline.

In Azure DevOps select the **"Rocket Ship"** from the lefthand menu, then select **Pipelines**.

![](https://i2.wp.com/ikethe.dev/wp-content/uploads/2020/01/01-Go-to-Pipelines.png?w=843&ssl=1)Next, select **New pipeline**

![](https://i2.wp.com/ikethe.dev/wp-content/uploads/2020/01/02-Select-New-Pipeline.png?fit=843%2C81&ssl=1)Then select where your code is located. For this example my code is stored in Azure Repos Git. However, your code could be in GitHub or any other source control tool.

![](https://i2.wp.com/ikethe.dev/wp-content/uploads/2020/01/03-Select-Code-Location.png?w=843&ssl=1)Afterwards, select your repository.

![](https://i2.wp.com/ikethe.dev/wp-content/uploads/2020/01/04-Select-Repository.png?w=843&ssl=1)Then select **Starter pipeline**. This will create a basic pipeline with a couple of tasks.

![](https://i1.wp.com/ikethe.dev/wp-content/uploads/2020/01/05-Select-Starter-Pipeline.png?w=843&ssl=1)### Modifying the YAML

Before we begin, I would like to warn you that YAML can be very fickle and whitespaces matter. One misaligned space can cause the entire pipeline to fail.

To learn more about YAML pipelines [this reference guide](https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema#pipeline-structure) is an excellent resource.

### Initial Pipeline

The initial portion of our pipeline defines the trigger, which is defined as the master branch of our repository. Anytime master changes, our pipeline will automatically run.



```
trigger:
- master

Stage 1 – Build

The first stage of our pipeline downloads any dependencies and then builds the solution. It then creates then publishes the artifact that will be used in the second stage.

```

stages:

  • Этап: «построить» Переменные: Решение: ‘* / .sln ‘ BuildPlatform: «Любой CPU» BuildConfiguration: «Release» DisplayName: «построить» Работа:

    • Работа: «Build» DisplayName: «Build» Pool: VMImage: «Windows-Neighle» шаги:
    • Задача: NugetToolInstaller @ 1
    • Задача: NUGETCOMMAND @ 2 ВХОД: RESTORSELOSELOLOL: ‘$ (решение)’
    • Задача: vsbuild @ 1 Входные данные: решение: ‘$ (решение)’ msbuildargs: ‘Платформа: «$ (BuildPlatform)» Конфигурация:’ $ (BuildConfiguration) ‘
    • Задача: vStest @ 2 Входные данные: платформа: «$ (BuildPlatform)» Конфигурация: ‘$ (BuildConfiguration)’
    • Задача: publishbuildartifacts @ 1 входы: pathtopublish: ‘$ (build.artifactstagingdirectory)’ Artifactname: «Drop» PublishLocation: «Контейнер» « « `

Важно : При развертывании .NET Core приложение для AWS EURACAL BEANTALK, вы не можете использовать по умолчанию Msbuildargs Отказ По какой-то причине эластичный Beanstalk не может найти файл web.config, когда артефакт опубликован как zip-файл. Обратите внимание на Webpublishmethod =. Файловая система аргумент

Этап 2 — развертывание AWS

Второй этап трубопровода разворачивает артефакт с первого этапа к AWS.

« «.

  - stage: 'Deploy'
  displayName: 'Deploy'
  jobs:
  - deployment: DeployToAws
    displayName: 'Deploy To AWS Elastic Beanstalk'
    pool:
      vmImage: 'windows-latest'
    variables:
      CloudEnv: 'AWS Elastic Beanstalk'
    environment: 'Production'
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: replacetokens@3
            displayName: 'Replace Tokens'
            inputs:
              rootDirectory: '$(Pipeline.Workspace)/drop'
              targetFiles: '*/.json'
              tokenPrefix: ''
              tokenSuffix: '
'

          - task: BeanstalkDeployApplication@1
            displayName: 'Deploy to Elastic Beanstalk'
            inputs:
              awsCredentials: 'AWS Deployment Service Connection'
              regionName: 'us-east-2'
              applicationName: DotNetCoreDemo
              environmentName: 'Dotnetcoredemo-env'
              applicationType: aspnetCoreWindows
              dotnetPublishPath: '$(Pipeline.Workspace)/drop'


Notice in the deployment job we are setting a job level variable **CloudEnv**. We will use variable in a later task to replace our tokenized appsetting from earlier.



```
 - deployment: DeployToAws
     displayName: 'Deploy To AWS Elastic Beanstalk'
     pool:
       vmImage: 'windows-latest'
     variables:
       CloudEnv: 'AWS Elastic Beanstalk' 

Let's break down the tasks in this stage of the pipeline.

The first task, download, downloads the artifact we created in the previous build stage.

```

 - download: current
             artifact: drop

The next task, **replacetokens@3**, is the first Marketplace Extension we installed earlier. This tasks looks for any string with a prefix and suffix of "\_\_" and attempts to replace them with a variable defined in the pipeline. In this example, "AWS Elastic Beanstalk" replaces the value for CloudEnv in appsettings.json



```
 - task: replacetokens@3
            displayName: 'Replace Tokens'
            inputs:
              rootDirectory: '$(Pipeline.Workspace)/drop'
              targetFiles: '**/*.json'
              tokenPrefix: '__'
              tokenSuffix: '__' 

Important: The variable name must match the string without the prefix and suffix.

The final task, BeanstalkDeployApplication@1, is the second Marketplace Extension we installed earlier. This task deploys the artifact to AWS Elastic Beanstalk. Pay close attention to the inputs. The awsCredentials argument is the name of the service connection we created earlier. regionName, applicationName, and environmentName should match with the Elastic Beanstalk environment and application we originally created. The last setting, dotnetPublishPath, is the location of the artifact we downloaded.

```

 - task: BeanstalkDeployApplication@1
            displayName: 'Deploy to Elastic Beanstalk'
            inputs:
              awsCredentials: 'AWS Deployment Service Connection'
              regionName: 'us-east-2'
              applicationName: DotNetCoreDemo
              environmentName: 'Dotnetcoredemo-env'
              applicationType: aspnetCoreWindows
              dotnetPublishPath: '$(Pipeline.Workspace)/drop'

### The Entire Pipeline

Below is the complete multi-stage pipeline.



```
 trigger:
- master

stages:
- stage: 'Build'
  variables:
    solution: '**/*.sln'
    buildPlatform: 'Any CPU'
    buildConfiguration: 'Release'
  displayName: 'Build'
  jobs:
  - job: 'Build'
    displayName: 'Build'
    pool:  
      vmImage: 'windows-latest' 
    steps:
    - task: NuGetToolInstaller@1

    - task: NuGetCommand@2
      inputs:
        restoreSolution: '$(solution)'

    - task: VSBuild@1
      inputs:
        solution: '$(solution)'
        msbuildArgs: '/p:SkipInvalidConfigurations=true /p:DeployOnBuild=true /p:WebPublishMethod=FileSystem /p:publishUrl="$(build.artifactstagingdirectory)\\" /p:DeployDefaultTarget=WebPublish'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    - task: VSTest@2
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'

- stage: 'Deploy'
  displayName: 'Deploy'
  jobs:
  - deployment: DeployToAws
    displayName: 'Deploy To AWS Elastic Beanstalk'
    pool:
      vmImage: 'windows-latest'
    variables:
      CloudEnv: 'AWS Elastic Beanstalk'
    environment: 'Production'
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: replacetokens@3
            displayName: 'Replace Tokens'
            inputs:
              rootDirectory: '$(Pipeline.Workspace)/drop'
              targetFiles: '**/*.json'
              tokenPrefix: '__'
              tokenSuffix: '__'

          - task: BeanstalkDeployApplication@1
            displayName: 'Deploy to Elastic Beanstalk'
            inputs:
              awsCredentials: 'AWS Deployment Service Connection'
              regionName: 'us-east-2'
              applicationName: DotNetCoreDemo
              environmentName: 'Dotnetcoredemo-env'
              applicationType: aspnetCoreWindows
              dotnetPublishPath: '$(Pipeline.Workspace)/drop' 

At this point we can run the pipeline and it will deploy our application to our AWS Elastic Beanstalk environment.

Successful Deployment

As you can tell by the below screenshot the deployment was successful and the CloudEnv appsetting was replaced with the pipeline variable.

Оригинал: «https://dev.to/ikethedev/deploying-a-net-core-app-to-aws-elastic-beanstalk-via-azure-devops-5ab8»