Автоматизация всего (сборка Real-World облачных приложений с помощью Azure)

Рик Андерсон(Rick Anderson),Том Дайкстра (Tom Dykstra)

Скачать проект fix it или скачать электронную книгу

Электронная книга Building Real World Cloud Apps with Azure (Создание реальных облачных приложений с помощью Azure ) основана на презентации, разработанной Скоттом Гатри. В ней описано 13 шаблонов и методик, которые помогут вам успешно разрабатывать веб-приложения для облака. Введение в электронную книгу см. в первой главе.

Первые три шаблона, которые мы рассмотрим, применяются к любому проекту разработки программного обеспечения, но особенно к облачным проектам. Этот шаблон предназначен для автоматизации задач разработки. Это важная тема, так как ручные процессы выполняются медленно и подвержены ошибкам; Автоматизация как можно больше из них помогает настроить быстрый, надежный и гибкий рабочий процесс. Это уникально важно для облачной разработки, так как вы можете легко автоматизировать многие задачи, которые трудно или невозможно автоматизировать в локальной среде. Например, можно настроить целые тестовые среды, включая новые веб-серверы и серверные виртуальные машины, базы данных, хранилище BLOB-объектов (хранилище файлов), очереди и т. д.

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

Все чаще вы слышите термин "DevOps". Термин разработан из признания того, что вы должны интегрировать задачи разработки и эксплуатации для эффективной разработки программного обеспечения. Рабочий процесс, который вы хотите включить, — это рабочий процесс, в котором можно разрабатывать приложение, развертывать его, учиться на его использовании в рабочей среде, изменять его в ответ на полученные знания, а также быстро и надежно повторять цикл.

Некоторые успешные команды разработчиков облачных решений развертываются несколько раз в день в активной среде. Команда Azure развертывала основное обновление каждые 2–3 месяца, но теперь она выпускает незначительные обновления каждые 2–3 дня, а основные — каждые 2–3 недели. Получение этой частоты действительно помогает вам реагировать на отзывы клиентов.

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

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

Иными словами, период времени между тем, когда у вас есть идея для функции и когда клиенты используют ее и предоставление обратной связи, должен быть как можно короче. Первые три шаблона — автоматизация всего, система управления версиями, непрерывная интеграция и доставка — это все рекомендации, которые мы рекомендуем использовать для реализации такого процесса.

Скрипты управления Azure

Во введении к этой электронной книге вы увидели веб-консоль — портал управления Azure. Портал управления позволяет отслеживать все ресурсы, развернутые в Azure, и управлять ими. Это простой способ создания и удаления служб, таких как веб-приложения и виртуальные машины, настройки этих служб, мониторинга работы служб и т. д. Это отличный инструмент, но его использование выполняется вручную. Если вы собираетесь разработать рабочее приложение любого размера, особенно в командной среде, рекомендуем пройти через пользовательский интерфейс портала, чтобы изучить и изучить Azure, а затем автоматизировать процессы, которые вы будете выполнять повторно.

Почти все, что можно сделать вручную на портале управления или из Visual Studio, можно также выполнить, вызвав REST API управления. Скрипты можно создавать с помощью Windows PowerShell или платформы открытый код, например Chef или Puppet. Вы также можете использовать программу командной строки Bash в среде Mac или Linux. В Azure есть API-интерфейсы сценариев для всех этих сред, а также API управления .NET на случай, если вы хотите написать код, а не скрипт.

Для приложения Fix It мы создали несколько скриптов Windows PowerShell, которые автоматизируют процессы создания тестовой среды и развертывания проекта в этой среде, и рассмотрим некоторые из содержимого этих скриптов.

Скрипт создания среды

Первый скрипт, который мы рассмотрим, называется New-AzureWebsiteEnv.ps1. Она создает среду Azure, в которой можно развернуть приложение Fix It для тестирования. Ниже перечислены main задачи, выполняемые этим скриптом.

  • Создание веб-приложения.
  • Создайте учетную запись хранения. (Требуется для больших двоичных объектов и очередей, как показано в последующих главах.)
  • Создайте сервер База данных SQL и две базы данных: базу данных приложения и базу данных членства.
  • Храните параметры в Azure, которые приложение будет использовать для доступа к учетной записи хранения и базам данных.
  • Создайте файлы параметров, которые будут использоваться для автоматизации развертывания.

Выполнение скрипта

Примечание

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

Чтобы запустить скрипт PowerShell, который управляет службами Azure, необходимо установить консоль Azure PowerShell и настроить ее для работы с подпиской Azure. После настройки можно запустить скрипт создания среды Fix It с помощью следующей команды:

.\New-AzureWebsiteEnv.ps1 -Name <websitename> -SqlDatabasePassword <password>

Параметр Name указывает имя, которое будет использоваться при создании базы данных и учетных записей хранения, а SqlDatabasePassword параметр задает пароль для учетной записи администратора, которая будет создана для База данных SQL. Есть и другие параметры, которые мы рассмотрим позже.

Окно PowerShell

После завершения скрипта на портале управления вы увидите, что было создано. Вы найдете две базы данных:

Базы данных

Учетная запись хранения:

Учетная запись хранения

И веб-приложение:

Веб-сайт

На вкладке Настройка веб-приложения можно увидеть, что в нем настроены параметры учетной записи хранения и строки подключения к базе данных SQL для приложения Исправить.

appSettings и connectionStrings

Папка автоматизации теперь также содержит <файл имя>_сайта.pubxml . В этом файле хранятся параметры, которые MSBuild будет использовать для развертывания приложения в только что созданной среде Azure. Пример:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>MSDeploy</WebPublishMethod>
    <SiteUrlToLaunchAfterPublish>http://fixitdemo.azurewebsites.net</SiteUrlToLaunchAfterPublish>
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <MSDeployServiceURL>waws-prod-bay-003.publish.azurewebsites.windows.net:443</MSDeployServiceURL>
    <DeployIisAppPath>fixitdemo</DeployIisAppPath>
    <RemoteSitePhysicalPath />
    <SkipExtraFilesOnServer>True</SkipExtraFilesOnServer>
    <MSDeployPublishMethod>WMSVC</MSDeployPublishMethod>
    <EnableMSDeployBackup>True</EnableMSDeployBackup>
    <UserName>$fixitdemo</UserName>
    <PublishDatabaseSettings></PublishDatabaseSettings>
  </PropertyGroup>
</Project>

Как видите, скрипт создал полную тестовую среду, и весь процесс выполняется примерно за 90 секунд.

Если кто-то другой в вашей команде хочет создать тестовую среду, он может просто запустить скрипт. Это не только быстрая работа, но и уверенность в том, что они используют среду, идентичную той, которую вы используете. Вы не могли бы быть уверены в этом, если бы все настраивали вещи вручную с помощью пользовательского интерфейса портала управления.

Ознакомьтесь со сценариями

На самом деле есть три сценария, которые выполняют эту работу. Вы вызываете один из команд из командной строки, и он автоматически использует два других для выполнения некоторых задач:

  • New-AzureWebSiteEnv.ps1 — это скрипт main.

    • New-AzureStorage.ps1 создает учетную запись хранения.
    • New-AzureSql.ps1 создает базы данных.

Параметры в скрипте main

Скрипт main New-AzureWebSiteEnv.ps1определяет несколько параметров:

[CmdletBinding(PositionalBinding=$True)]
Param(
    [Parameter(Mandatory = $true)]
    [ValidatePattern("^[a-z0-9]*$")]
    [String]$Name,                             
    [String]$Location = "West US",             
    [String]$SqlDatabaseUserName = "dbuser",   
    [String]$SqlDatabasePassword,              
    [String]$StartIPAddress,                   
    [String]$EndIPAddress                      
    )

Требуются два параметра:

  • Имя веб-приложения, создаваемого скриптом. (Он также используется для URL-адреса: <name>.azurewebsites.net.)
  • Пароль для нового пользователя с правами администратора сервера базы данных, создаваемого скриптом.

Необязательные параметры позволяют указать расположение центра обработки данных (по умолчанию — "Западная часть США"), имя администратора сервера базы данных (по умолчанию — "dbuser") и правило брандмауэра для сервера базы данных.

Создание веб-приложения

Первое, что делает скрипт, — это создание веб-приложения путем вызова командлета New-AzureWebsite и передачи ему имени веб-приложения и значений параметров расположения:

# Create a new website
$website = New-AzureWebsite -Name $Name -Location $Location -Verbose

Создание учетной записи хранения

Затем скрипт main запускает скрипт New-AzureStorage.ps1, указав "*<имя_>веб-сайта*хранилище" в качестве имени учетной записи хранения и то же расположение центра обработки данных, что и веб-приложение.

$storageAccountName = $Name + "storage"
 
$storage = $scriptPath\New-AzureStorage.ps1" -Name $storageAccountName -Location $Location

New-AzureStorage.ps1 вызывает New-AzureStorageAccount командлет для создания учетной записи хранения и возвращает имя учетной записи и значения ключа доступа. Эти значения потребуются приложению для доступа к большим двоичным объектам и очередям в учетной записи хранения.

# Create a new storage account
New-AzureStorageAccount -StorageAccountName $Name -Location $Location -Verbose
 
# Get the access key of the storage account
$key = Get-AzureStorageKey -StorageAccountName $Name
 
# Generate the connection string of the storage account
$connectionString = "BlobEndpoint=http://$Name.blob.core.windows.net/;QueueEndpoint=http://$Name.queue.core.windows.net/;TableEndpoint=http://$Name.table.core.windows.net/;AccountName=$Name;AccountKey=$primaryKey"
 
#Return a hashtable of storage account values
Return @{AccountName = $Name; AccessKey = $key.Primary; ConnectionString = $connectionString}

Может потребоваться не всегда создавать новую учетную запись хранения; Можно улучшить скрипт, добавив параметр, который при необходимости направляет его на использование существующей учетной записи хранения.

Создание баз данных

Затем скрипт main запускает скрипт создания базы данных ,New-AzureSql.ps1, после настройки имен базы данных и правил брандмауэра по умолчанию:

$sqlAppDatabaseName = "appdb"
$sqlMemberDatabaseName = "memberdb"
$sqlDatabaseServerFirewallRuleName = $Name + "rule"
# Create a SQL Azure database server, app and member databases
$sql = $scriptPath\New-AzureSql.ps1 `
    -AppDatabaseName $sqlAppDatabaseName `
    -MemberDatabaseName $sqlMemberDatabaseName `
    -UserName $SqlDatabaseUserName `
    -Password $SqlDatabasePassword `
    -FirewallRuleName $sqlDatabaseServerFirewallRuleName `
    -StartIPAddress $StartIPAddress `
    -EndIPAddress $EndIPAddress `
    -Location $Location

Скрипт создания базы данных получает IP-адрес компьютера разработки и задает правило брандмауэра, чтобы компьютер разработки смог подключаться к серверу и управлять им. Затем скрипт создания базы данных выполняет несколько шагов для настройки баз данных:

  • Создает сервер с помощью командлета New-AzureSqlDatabaseServer .

    $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -AdministratorLoginPassword $Password -Location $Location
    
  • Создает правила брандмауэра, позволяющие компьютеру разработки управлять сервером и разрешать веб-приложению подключаться к нему.

    # Create a SQL Azure database server firewall rule for the IP address of the machine in which this script will run
    # This will also allowlist all the Azure IP so that the website can access the database server
    New-AzureSqlDatabaseServerFirewallRule -ServerName $databaseServerName -RuleName $FirewallRuleName -StartIpAddress $StartIPAddress 
    -EndIpAddress $EndIPAddress -Verbose
    New-AzureSqlDatabaseServerFirewallRule -ServerName $databaseServer.ServerName -AllowAllAzureServices 
    -RuleName "AllowAllAzureIP" -Verbose
    
  • Создает контекст базы данных, включающий имя сервера и учетные данные, с помощью командлета New-AzureSqlDatabaseServerContext .

    # Create a database context which includes the server name and credential
    # These are all local operations. No API call to Azure
    $credential = New-PSCredentialFromPlainText -UserName $UserName -Password $Password
    $context = New-AzureSqlDatabaseServerContext -ServerName $databaseServer.ServerName -Credential $credential
    

    New-PSCredentialFromPlainText — это функция в скрипте, которая вызывает ConvertTo-SecureString командлет для шифрования пароля и возвращает PSCredential объект того же типа, что Get-Credential и командлет.

  • Создает базу данных приложения и базу данных членства с помощью командлета New-AzureSqlDatabase .

    # Use the database context to create app database
    New-AzureSqlDatabase -DatabaseName $AppDatabaseName -Context $context -Verbose
     
    # Use the database context to create member database
    New-AzureSqlDatabase -DatabaseName $MemberDatabaseName -Context $context -Verbose
    
  • Вызывает локально определенную функцию для создания строки подключения для каждой базы данных. Приложение будет использовать эти строки подключения для доступа к базам данных.

    $appDatabaseConnectionString = Get-SQLAzureDatabaseConnectionString -DatabaseServerName $databaseServerName -DatabaseName $AppDatabaseName -UserName $UserName -Password $Password
    $memberDatabaseConnectionString = Get-SQLAzureDatabaseConnectionString -DatabaseServerName $databaseServerName -DatabaseName $MemberDatabaseName -UserName $UserName -Password $Password
    

    Get-SQLAzureDatabaseConnectionString — это функция, определенная в скрипте, которая создает строку подключения из предоставленных ей значений параметров.

    Function Get-SQLAzureDatabaseConnectionString
    {
        Param(
            [String]$DatabaseServerName,
            [String]$DatabaseName,
            [String]$UserName,
            [String]$Password
        )
    
        Return "Server=tcp:$DatabaseServerName.database.windows.net,1433;Database=$DatabaseName;User ID=$UserName@$DatabaseServerName;Password=$Password;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;"
    }
    
  • Возвращает хэш-таблицу с именем сервера базы данных и строками подключения.

    Return @{ `
        Server = $databaseServer.ServerName; UserName = $UserName; Password = $Password; `
        AppDatabase = @{Name = $AppDatabaseName; ConnectionString = $appDatabaseConnectionString}; `
        MemberDatabase = @{Name = $MemberDatabaseName; ConnectionString = $memberDatabaseConnectionString} `
    }
    

Приложение Fix It использует отдельные базы данных членства и приложения. Кроме того, можно поместить данные членства и приложения в одну базу данных.

Параметры приложения Магазина и строки подключения

В Azure есть функция, позволяющая хранить параметры и строки подключения, которые автоматически переопределяют то, что возвращается приложению при попытке прочитать appSettings коллекции или connectionStrings в файле Web.config. Это альтернатива применению преобразованийWeb.config при развертывании . Дополнительные сведения см. в разделе Хранение конфиденциальных данных в Azure далее в этой электронной книге.

Скрипт создания среды хранит в Azure все appSettings значения и connectionStrings , необходимые приложению для доступа к учетной записи хранения и базам данных при запуске в Azure.

# Configure app settings for storage account and New Relic
$appSettings = @{ `
    "StorageAccountName" = $storageAccountName; `
    "StorageAccountAccessKey" = $storage.AccessKey; `
    "COR_ENABLE_PROFILING" = "1"; `
    "COR_PROFILER" = "{71DA0A04-7777-4EC6-9643-7D28B46A8A41}"; `
    "COR_PROFILER_PATH" = "C:\Home\site\wwwroot\newrelic\NewRelic.Profiler.dll"; `
    "NEWRELIC_HOME" = "C:\Home\site\wwwroot\newrelic" `
}
# Configure connection strings for appdb and ASP.NET member db
$connectionStrings = ( `
    @{Name = $sqlAppDatabaseName; Type = "SQLAzure"; ConnectionString = $sql.AppDatabase.ConnectionString}, `
    @{Name = "DefaultConnection"; Type = "SQLAzure"; ConnectionString = $sql.MemberDatabase.ConnectionString}
)
# Add the connection string and storage account name/key to the website
Set-AzureWebsite -Name $Name -AppSettings $appSettings -ConnectionStrings $connectionStrings

New Relic — это платформа телеметрии, которую мы продемонстрируем в разделе Мониторинг и телеметрия . Скрипт создания среды также перезапускает веб-приложение, чтобы убедиться, что оно выбрало параметры New Relic.

# Restart the website to let New Relic hook kick in
Restart-AzureWebsite -Name $websiteName

Подготовка к развертыванию

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

Одна из этих функций создает профиль публикации (<файл имя_>сайта.pubxml ). Код вызывает REST API Azure для получения параметров публикации и сохраняет сведения в файле PUBLISHSETTINGS . Затем он использует сведения из этого файла вместе с файлом шаблона (pubxml.template) для создания PUBXML-файла , содержащего профиль публикации. Этот двухэтапный процесс имитирует действия в Visual Studio: скачивание файла .publishsettings и импорт его для создания профиля публикации.

Другая функция использует другой файл шаблона (website-environment.template) для создания файлаwebsite-environment.xml , содержащего параметры, которые будет использовать скрипт развертывания вместе с PUBXML-файлом .

Устранение неполадок и обработка ошибок

Скрипты похожи на программы: они могут завершиться сбоем, и когда они делают, вы хотите знать как можно больше о сбое и о том, что его вызвало. По этой причине скрипт создания среды изменяет значение переменной VerbosePreference с SilentlyContinue на Continue , чтобы отображались все подробные сообщения. Он также изменяет значение переменной ErrorActionPreference с Continue на Stop, чтобы скрипт остановился даже при возникновении неустранимых ошибок:

# Set the output level to verbose and make the script stop on error
$VerbosePreference = "Continue"
$ErrorActionPreference = "Stop"

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

# Mark the start time of the script execution
$startTime = Get-Date

После завершения работы скрипт отображает затраченное время:

# Mark the finish time of the script execution
$finishTime = Get-Date
# Output the time consumed in seconds
Write-Output ("Total time used (seconds): {0}" -f ($finishTime - $startTime).TotalSeconds)

Для каждой операции с ключом скрипт записывает подробные сообщения, например:

Write-Verbose "[Start] creating $websiteName website in $Location location"
$website = New-AzureWebsite -Name $websiteName -Location $Location -Verbose
Write-Verbose "[Finish] creating $websiteName website in $Location location"

Скрипт развертывания

То, что скрипт New-AzureWebsiteEnv.ps1 делает при создании среды, скрипт Publish-AzureWebsite.ps1 делает для развертывания приложения.

Скрипт развертывания получает имя веб-приложения из файлаwebsite-environment.xml , созданного скриптом создания среды.

[Xml]$envXml = Get-Content "$scriptPath\website-environment.xml"
$websiteName = $envXml.environment.name

Он получает пароль пользователя развертывания из файла PUBLISHSETTINGS :

[Xml]$xml = Get-Content $scriptPath\$websiteName.publishsettings 
$password = $xml.publishData.publishProfile.userPWD[0]
$publishXmlFile = Join-Path $scriptPath -ChildPath ($websiteName + ".pubxml")

Он выполняет команду MSBuild , которая выполняет сборку и развертывание проекта:

& "$env:windir\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" $ProjectFile `
    /p:VisualStudioVersion=12.0 `
    /p:DeployOnBuild=true `
    /p:PublishProfile=$publishXmlFile `
    /p:Password=$password

Если вы указали параметр в Launch командной строке, он вызывает Show-AzureWebsite командлет , чтобы открыть браузер по умолчанию для URL-адреса веб-сайта.

If ($Launch)
{
    Show-AzureWebsite -Name $websiteName
}

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

.\Publish-AzureWebsite.ps1 ..\MyFixIt\MyFixIt.csproj -Launch

После этого откроется браузер с веб-сайтом, запущенным в облаке по <websitename>.azurewebsites.net URL-адресу.

Исправление приложения, развернутого в Windows Azure

Итоги

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

Аналогичным образом можно автоматизировать большинство функций управления Azure, которые можно выполнять на портале управления, с помощью REST API, Windows PowerShell скриптов, API языка .NET или служебной программы Bash, которую можно запускать в Linux или Mac.

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

Ресурсы