Упражнение — подготовка ресурсов Azure
В этом упражнении показано, как настроить рабочий процесс автоматизации, чтобы подготавливать ресурсы Terraform.
Выполните доступ к примеру приложения.
В этом упражнении вы создадите репозиторий GitHub на основе шаблона, который содержит весь нужный код для подготовки Terraform к работе.
На сайте GitHub перейдите на главную страницу репозитория.
https://github.com/MicrosoftDocs/mslearn-java-petclinic-simplified
Над списком файлов выберите "Использовать этот шаблон", а затем выберите "Создать репозиторий".
В поле Repository name (Имя репозитория) введите уникальное имя репозитория. Обязательно соблюдайте соглашение об именовании, действующее для репозиториев GitHub.
Убедитесь, что выбран параметр Private , а затем выберите " Создать репозиторий".
Рабочий процесс
В каталоге проекта для созданного репозитория вы увидите каталог с именем 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/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 следующим образом:
Во встроенном текстовом редакторе 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" }
Выберите параметр Фиксировать для ваших изменений.
Проверка сборки GitHub Actions
В репозитории щелкните Actions (Действия), а затем выберите рабочий процесс TERRAFORM на панели слева.
В списке шагов убедитесь, что были активированы шаги Terraform init (Инициализация Terraform ), Terraform Plan (Планирование Terraform) и Terraform Validate (Проверка Terraform):
В списке шагов разверните Terraform Apply (Применение Terraform) и убедитесь, что выполняются следующие условия.
Решение Terraform создало ресурсы и отобразило URL-адрес экземпляра Azure.
Соответствующий экземпляр приложения Azure является общедоступным.
Следующие шаги
В следующем упражнении показано, как использовать GitHub Actions для развертывания примера приложения Spring Boot.
Настройка имени приложения и группы ресурсов Azure
В репозитории GitHub измените имена ресурсов Azure, выполнив следующее действие:
Во встроенном текстовом редакторе 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" }
Фиксация изменений
Создание конвейера Azure для подготовки ресурсов Terraform
В нашем проекте Azure DevOps мы создадим два отдельных конвейера для подготовки и сборки/развертывания. Конвейер подготовки создает ресурсы Azure, которые будут выпущены через конвейер сборки и развертывания позже.
Давайте создадим первый конвейер подготовки:
Выберите свою организацию и щелкните New project (Создать проект).
Укажите значения следующих параметров.
Параметр Описание Имя проекта Обязательное поле Описание Необязательно Visibility Выберите Private (Частный) Расширенные Управление версиями Выберите GIT Процесс рабочих элементов Выберите Basic (Базовый). Выберите "Создать проект", чтобы создать проект и открыть страницу приветствия.
Настройка подключения к службе конвейера Azure
Давайте дадим конвейеру Azure доступ к учетной записи Azure.
В Azure DevOps перейдите на страницу настроек проекта и откройте страницу Service connections (Подключения службы).
Выберите " Создать подключение службы" и выберите Azure Resource Manager, а затем нажмите кнопку "Далее".
Выберите субъект-службу (автоматически), а затем нажмите кнопку "Далее".
Укажите значения следующих параметров.
Параметр Описание Уровень области Выбор подписки Azure Отток подписок Выбор существующей подписки Azure Группа ресурсов Оставьте пустой, чтобы разрешить пользователям доступ ко всем ресурсам, определенным в подписке. Имя подключения Обязательный. Имя, которое будет использоваться для ссылки на это подключение к службе в свойствах задачи. Это имя не является именем подписки Azure. Выберите Сохранить, чтобы создать подключение.
Создание конвейера подготовки к работе
Внимание
Необходимые компоненты этого модуля необходимы для установки расширения Terraform Azure Pipelines. Если вы не установили его, конвейер не будет выполняться.
После настройки проекта и подключения к Azure необходимо создать конвейер Azure для подготовки ресурсов Terraform.
В Azure DevOps перейдите в проект, выберите "Конвейеры " в меню слева и выберите "Создать конвейер".
- На вкладке "Подключиться" выберите "GitHub" (YAML-файл).
- При появлении запроса на авторизацию доступа к GitHub введите учетные данные GitHub и утвердите доступ для Azure Pipelines с запрошенными привилегиями.
- На вкладке "Выбрать" выберите репозиторий GitHub, содержащий шаблон.
- Выберите " Настройка конвейера " на вкладке "Инвентаризация ".
- На вкладке "Настройка" выберите "Существующий YAML-файл Azure Pipelines".
- В поле пути выберите "/azuredevops/provision.yml"
- Нажмите кнопку "Продолжить", чтобы перейти на вкладку "Рецензирование " и просмотрите конвейер.
На экране 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: обязательные поля, необходимые в среде группы для хранения общего состояния.\
Перед сохранением и запуском конвейера необходимо добавить переменную, которая будет привязана к подключению службы:
- Выберите переменные (сверху справа) и добавьте переменную с именем serviceConnection со значением в качестве имени подключения к службе.
- Нажмите кнопку "ОК " (нижний правый угол), чтобы сохранить переменную.
Наконец, выберите run (выполнить) (в правом верхнем углу), чтобы сохранить и запустить конвейер.
Наблюдение за выполнением конвейера
После этого в Jobs (задания) отслеживайте все этапы процесса сборки.
По мере выполнения конвейера просмотрите, как первый этап Terraform, init, а затем второй этап, apply, переходят от синего цвета (выполняется) к зеленому (завершено). Вы можете выбирать этапы для отслеживания конвейера в действии.
Совет
Проверьте электронную почту. Возможно, вы уже получили уведомление о сборке с результатами выполнения. Эти уведомления можно использовать для того, чтобы определить, удачна ли или неудачна каждая сборка.
Следующие шаги
В следующем упражнении вы используете Azure Pipelines для создания и развертывания примера приложения Spring Boot.