Упражнение — подготовка ресурсов Azure

Завершено

В этом упражнении показано, как настроить рабочий процесс автоматизации, чтобы подготавливать ресурсы Terraform.

Выполните доступ к примеру приложения.

В этом упражнении вы создадите репозиторий GitHub на основе шаблона, который содержит весь нужный код для подготовки Terraform к работе.

  1. На сайте GitHub перейдите на главную страницу репозитория.

    https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
    
  2. Над списком файлов выберите "Использовать этот шаблон", а затем выберите "Создать репозиторий".

    Снимок экрана с кнопкой Use this template (Использовать этот шаблон) на главной странице mslearn-java-petclinic-simplified.

  3. В поле Repository name (Имя репозитория) введите уникальное имя репозитория. Обязательно соблюдайте соглашение об именовании, действующее для репозиториев GitHub.

  4. Убедитесь, что выбран параметр Private , а затем выберите " Создать репозиторий".

    Снимок экрана с кнопкой Create repository from template (Создать репозиторий из шаблона) на странице Create a new repository from (Создание нового репозитория из).

Рабочий процесс

В каталоге проекта для созданного репозитория вы увидите каталог с именем terraform и в нем файл с именем main.tf.

Давайте подробнее рассмотрим разделы, которые вам пригодятся для определения конфигурации модуля.

  • Поставщик: файл конфигурации Terraform начинается со спецификации поставщика. При использовании Azure укажите поставщика Azure (azurerm) в блоке поставщика.
  • Terraform: версия Terraform, с которой вы работаете.
  • Данные: получает данные из существующих служб.
  • Локальные значения: создает новые переменные с помощью функций и выражений.
  • Ресурс: описывает ресурсы и зависимости.
  • Модуль: повторное использование и абстракция сложности.

Чтобы подготовить к работе приложение и базу данных, достаточно включить разделы Provider и Resource.

Затем откройте файл main.tf и просмотрите структуру и комментарии:

provider "azurerm" {
  version = "=2.20.0"
  features {}
}

# Creates a resource group
resource "azurerm_resource_group" "main" {
  name     = var.resource_group
  location = var.location

  tags = {
    "Terraform" = "true"
  }
}

resource "random_password" "password" {
  length = 32
  special = true
  override_special = "_%@"
}

# Creates a MySQL server
resource "azurerm_mysql_server" "main" {
  name                              = "${azurerm_resource_group.main.name}-mysql-server"
  location                          = azurerm_resource_group.main.location
  resource_group_name               = azurerm_resource_group.main.name

  administrator_login               = "petclinic"
  administrator_login_password      = random_password.password.result

  sku_name   = "B_Gen5_1"
  storage_mb = 5120
  version    = "5.7"
  auto_grow_enabled                 = true
  backup_retention_days             = 7
  geo_redundant_backup_enabled      = false
  infrastructure_encryption_enabled = false
  public_network_access_enabled     = true
  ssl_enforcement_enabled           = true
  ssl_minimal_tls_version_enforced  = "TLS1_2"
}

# The database that your application will use
resource "azurerm_mysql_database" "main" {
  name                = "${azurerm_resource_group.main.name}_mysql_db"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  charset             = "utf8"
  collation           = "utf8_unicode_ci"
}

# Enables the 'Allow access to Azure services' check box
resource "azurerm_mysql_firewall_rule" "main" {
  name                = "${azurerm_resource_group.main.name}-mysql-firewall"
  resource_group_name = azurerm_resource_group.main.name
  server_name         = azurerm_mysql_server.main.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

# Creates the plan that the service uses
resource "azurerm_app_service_plan" "main" {
  name                = "${var.application_name}-plan"
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  kind                = "Linux"
  reserved            = true

  sku {
    tier = "PremiumV2"
    size = "P1v2"
  }
}

# Creates the service definition
resource "azurerm_app_service" "main" {
  name                = var.application_name
  location            = azurerm_resource_group.main.location
  resource_group_name = azurerm_resource_group.main.name
  app_service_plan_id = azurerm_app_service_plan.main.id
  https_only          = true

  site_config {
    always_on        = true
    linux_fx_version = "JAVA|8-jre8"
  }

  # Contains application-specific environment variables
  app_settings = {
    "WEBSITES_ENABLE_APP_SERVICE_STORAGE" = "false"

    "SPRING_PROFILES_ACTIVE"     = "mysql"
    "SPRING_DATASOURCE_URL"      = "jdbc:mysql://${azurerm_mysql_server.main.fqdn}:3306/${azurerm_mysql_database.main.name}?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
    "SPRING_DATASOURCE_USERNAME" = "${azurerm_mysql_server.main.administrator_login}@${azurerm_mysql_server.main.name}"
    "SPRING_DATASOURCE_PASSWORD" = azurerm_mysql_server.main.administrator_login_password
  }
}

Настройка рабочего процесса для GitHub Actions с помощью Terraform

Давайте предоставим рабочему процессу GitHub доступ к учетной записи Azure.

В Azure CLI создайте субъект-службу, выполнив следующую команду:

Внимание

Замените <yourServicePrincipalName> на имя субъекта-службы, который вы хотите использовать

az ad sp create-for-rbac --name "<yourServicePrincipalName>" --role contributor --scopes /subscriptions/<subscriptionId> --sdk-auth

Предыдущая команда возвращает следующий код JSON. Скопируйте его для использования на следующем шаге:

{
  "clientId": "XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "clientSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "subscriptionId": "XXXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXXXX",
  "tenantId": "XXXXXXXX-XXXXX-XXXX-XXXX-XXXXXXXXXXX",
  ...
}

Секреты в GitHub

В репозитории GitHub есть компонент Secrets (Секреты), который позволяет хранить конфиденциальные сведения, используемые в Terraform для аутентификации в Azure.

После создания необходимых идентификаторов и секрета, как описано на предыдущем шаге, их нужно добавить в хранилище Secrets в проекте GitHub.

В этом упражнении вам нужно сохранить следующие секреты:

  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_SUBSCRIPTION_ID
  • AZURE_TENANT_ID

Чтобы сохранить секреты, перейдите в вилку репозитория GitHub, выберите "Параметры", а затем выберите "Секреты и переменные", а затем выберите "Действия" на левой панели.

Создайте четыре секрета, используя значения, возвращенные при создании субъекта-службы.

Не забудьте, что секреты нужно сохранять без кавычек (""), как показано на следующем снимке экрана:

Снимок экрана: сохраненные секреты на панели секреты в разделе параметров в GitHub.

Файл рабочего процесса

Внутри каталога проекта находится каталог с именем .github/workflows. В нем расположен файл с именем main.yml.

Файл main.yml является рабочим процессом GitHub. Он использует секрет, который вы только что настроили, для развертывания приложения в подписке Azure.

В файле рабочего процесса, main.yml, находится следующее содержимое:

name: TERRAFORM

on:
  push:
    branches: [ main ]
    paths:
    - 'terraform/**'
  pull_request:
    branches: [ main ]
    paths:
    - 'terraform/**'

  workflow_dispatch:
jobs:
  terraform:
    runs-on: ubuntu-latest

    env:
      ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      ARM_CLIENT_SECRET: ${{secrets.AZURE_CLIENT_SECRET}}
      ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
      ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}

    defaults:
      run:
        working-directory: ./terraform
    steps:
      - uses: actions/checkout@v2

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1

      - name: Terraform Init
        run: terraform init

      - name: Terraform Plan
        run: terraform plan

      - name: Terraform Apply
        run: terraform apply -auto-approve

Этот рабочий процесс выполняет следующие действия:

  • проверяет, правильно ли отформатирована конфигурация;
  • создает план для каждого запроса на вытягивание;
  • активирует конфигурацию при обновлении файлов в каталоге terraform.

Примечание.

Вы можете активировать рабочий процесс GitHub Actions, перейдя в раздел Actions (Действия), выбрав рабочий процесс Terraform и щелкнув Re-run existing Jobs (Повторно запустить существующие задания).

Активация рабочего процесса

Затем в репозитории активируйте действие GitHub следующим образом:

  1. Во встроенном текстовом редакторе GitHub или любом удобном редакторе измените файл terraform/variables.tf следующим образом:

    a. Вместо "CHANGE_ME_RESOURCE_GROUP" укажите имя группы ресурсов.
    b. Вместо "CHANGE_ME_APP_NAME" укажите имя приложения. Убедитесь, что это имя уникальное.

    variable "resource_group" {
      description = "The resource group"
      default = "CHANGE_ME_RESOURCE_GROUP"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. Выберите параметр Фиксировать для ваших изменений.

Проверка сборки GitHub Actions

  1. В репозитории щелкните Actions (Действия), а затем выберите рабочий процесс TERRAFORM на панели слева.

  2. В списке шагов убедитесь, что были активированы шаги Terraform init (Инициализация Terraform ), Terraform Plan (Планирование Terraform) и Terraform Validate (Проверка Terraform):

    Снимок экрана: результаты выполнения рабочего процесса Terraform.

  3. В списке шагов разверните Terraform Apply (Применение Terraform) и убедитесь, что выполняются следующие условия.

  • Решение Terraform создало ресурсы и отобразило URL-адрес экземпляра Azure.

  • Соответствующий экземпляр приложения Azure является общедоступным.

    Снимок экрана: общедоступность экземпляра приложения Azure.

Следующие шаги

В следующем упражнении показано, как использовать GitHub Actions для развертывания примера приложения Spring Boot.

Настройка имени приложения и группы ресурсов Azure

В репозитории GitHub измените имена ресурсов Azure, выполнив следующее действие:

  1. Во встроенном текстовом редакторе GitHub или любом удобном редакторе измените файл terraform/variables.tf следующим образом:

    a. Вместо "<CHANGE_ME_RESOURCE_GROUP>" укажите имя группы ресурсов.
    b. Вместо "<CHANGE_ME_APP_NAME>" укажите имя приложения. Убедитесь, что это имя уникальное.

    variable "resource_group" {
      description = "The resource group"
      default = "<CHANGE_ME_RESOURCE_GROUP>"
    }
    
    variable "application_name" {
      description = "The Spring Boot application name"
      default     = "CHANGE_ME_APP_NAME"
    }
    
    variable "location" {
      description = "The Azure location where all resources in this example should be created"
      default     = "westeurope"
    }
    
  2. Фиксация изменений

Создание конвейера Azure для подготовки ресурсов Terraform

В нашем проекте Azure DevOps мы создадим два отдельных конвейера для подготовки и сборки/развертывания. Конвейер подготовки создает ресурсы Azure, которые будут выпущены через конвейер сборки и развертывания позже.

Давайте создадим первый конвейер подготовки:

  1. Выберите свою организацию и щелкните New project (Создать проект).

  2. Укажите значения следующих параметров.

    Параметр Описание
    Имя проекта Обязательное поле
    Описание Необязательно
    Visibility Выберите Private (Частный)
    Расширенные
    Управление версиями Выберите GIT
    Процесс рабочих элементов Выберите Basic (Базовый).
  3. Выберите "Создать проект", чтобы создать проект и открыть страницу приветствия.

Снимок экрана, показывающий новую форму проекта Azure.

Настройка подключения к службе конвейера Azure

Давайте дадим конвейеру Azure доступ к учетной записи Azure.

  1. В Azure DevOps перейдите на страницу настроек проекта и откройте страницу Service connections (Подключения службы).

  2. Выберите " Создать подключение службы" и выберите Azure Resource Manager, а затем нажмите кнопку "Далее".

  3. Выберите субъект-службу (автоматически), а затем нажмите кнопку "Далее".

  4. Укажите значения следующих параметров.

    Параметр Описание
    Уровень области Выбор подписки Azure
    Отток подписок Выбор существующей подписки Azure
    Группа ресурсов Оставьте пустой, чтобы разрешить пользователям доступ ко всем ресурсам, определенным в подписке.
    Имя подключения Обязательный. Имя, которое будет использоваться для ссылки на это подключение к службе в свойствах задачи. Это имя не является именем подписки Azure.
  5. Выберите Сохранить, чтобы создать подключение.

Создание конвейера подготовки к работе

Внимание

Необходимые компоненты этого модуля необходимы для установки расширения Terraform Azure Pipelines. Если вы не установили его, конвейер не будет выполняться.

После настройки проекта и подключения к Azure необходимо создать конвейер Azure для подготовки ресурсов Terraform.

В Azure DevOps перейдите в проект, выберите "Конвейеры " в меню слева и выберите "Создать конвейер".

  1. На вкладке "Подключиться" выберите "GitHub" (YAML-файл).
  2. При появлении запроса на авторизацию доступа к GitHub введите учетные данные GitHub и утвердите доступ для Azure Pipelines с запрошенными привилегиями.
  3. На вкладке "Выбрать" выберите репозиторий GitHub, содержащий шаблон.
  4. Выберите " Настройка конвейера " на вкладке "Инвентаризация ".
  5. На вкладке "Настройка" выберите "Существующий YAML-файл Azure Pipelines".
  6. В поле пути выберите "/azuredevops/provision.yml"
  7. Нажмите кнопку "Продолжить", чтобы перейти на вкладку "Рецензирование " и просмотрите конвейер.

Снимок экрана, показывающий новую форму конвейера Azure.

На экране Review your pipeline YAML (Проверка конвейера YAML) рассмотрим файл YAML, который будет использоваться для создания конвейера.

name: Provision Resources

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:

# Initialize the Terraform environment and bind to your Service Connection
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'init'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendServiceArm: $(serviceConnection)
    backendAzureRmResourceGroupName: $(serviceConnection)
    backendAzureRmStorageAccountName: $(serviceConnection)
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'

# Apply the Terraform config and deploy to Azure
- task: TerraformTaskV1@0
  inputs:
    provider: 'azurerm'
    command: 'apply'
    workingDirectory: $(Build.Repository.LocalPath)/terraform
    backendAzureRmContainerName: 'tfstate'
    backendAzureRmKey: 'tf/terraform.tfstate'
    environmentServiceNameAzureRM: $(serviceConnection)

Рассмотрим некоторые поля, используемые в этой конфигурации:

  • serviceConnection: подключение службы Azure PipeLine к настройке ранее
  • команда: команда рабочего процесса Terraform: инициализация или применение
  • backendAzure: обязательные поля, необходимые в среде группы для хранения общего состояния.\

Перед сохранением и запуском конвейера необходимо добавить переменную, которая будет привязана к подключению службы:

  1. Выберите переменные (сверху справа) и добавьте переменную с именем serviceConnection со значением в качестве имени подключения к службе.
  2. Нажмите кнопку "ОК " (нижний правый угол), чтобы сохранить переменную.

Снимок экрана, на котором отображается новая переменная субъекта-службы.

Наконец, выберите run (выполнить) (в правом верхнем углу), чтобы сохранить и запустить конвейер.

Наблюдение за выполнением конвейера

После этого в Jobs (задания) отслеживайте все этапы процесса сборки.

По мере выполнения конвейера просмотрите, как первый этап Terraform, init, а затем второй этап, apply, переходят от синего цвета (выполняется) к зеленому (завершено). Вы можете выбирать этапы для отслеживания конвейера в действии.

Снимок экрана, показывающий новый запуск конвейера Azure.

Совет

Проверьте электронную почту. Возможно, вы уже получили уведомление о сборке с результатами выполнения. Эти уведомления можно использовать для того, чтобы определить, удачна ли или неудачна каждая сборка.

Следующие шаги

В следующем упражнении вы используете Azure Pipelines для создания и развертывания примера приложения Spring Boot.