모든 항목 자동화(Azure를 사용하여 Real-World Cloud Apps 빌드)

작성자 : Rick Anderson, Tom Dykstra

수정 프로젝트 다운로드 또는 전자책 다운로드

Azure 전자책 을 사용하여 Real World Cloud Apps 빌드 는 Scott Guthrie가 개발한 프레젠테이션을 기반으로 합니다. 클라우드용 웹앱을 성공적으로 개발하는 데 도움이 될 수 있는 13개의 패턴과 사례를 설명합니다. 전자책에 대한 소개는 첫 번째 장을 참조하세요.

처음 세 가지 패턴은 실제로 모든 소프트웨어 개발 프로젝트, 특히 클라우드 프로젝트에 적용됩니다. 이 패턴은 개발 작업을 자동화하는 것입니다. 수동 프로세스가 느리고 오류가 발생하기 쉽기 때문에 중요한 항목입니다. 최대한 많이 자동화하면 빠르고 안정적이며 민첩한 워크플로를 설정할 수 있습니다. 온-프레미스 환경에서 자동화하기 어렵거나 불가능한 많은 작업을 쉽게 자동화할 수 있으므로 클라우드 개발에 매우 중요합니다. 예를 들어 새 웹 서버 및 백 엔드 VM, 데이터베이스, Blob Storage(파일 스토리지), 큐 등을 비롯한 전체 테스트 환경을 설정할 수 있습니다.

DevOps 워크플로

"DevOps"라는 용어가 점점 더 들립니다. 소프트웨어를 효율적으로 개발하기 위해 개발 및 운영 작업을 통합해야 한다는 인식에서 개발된 용어입니다. 사용하려는 워크플로 종류는 앱을 개발하고, 배포하고, 프로덕션 사용에서 배우고, 배운 내용에 따라 변경하고, 주기를 빠르고 안정적으로 반복할 수 있는 워크플로입니다.

일부 성공적인 클라우드 개발 팀은 하루에 여러 번 라이브 환경에 배포합니다. Azure 팀은 2~3개월마다 주요 업데이트를 배포했지만 지금은 2~3일마다 사소한 업데이트와 2~3주마다 주요 릴리스를 릴리스합니다. 이러한 흐름에 들어가면 고객 피드백에 응답하는 데 도움이 됩니다.

이렇게 하려면 반복 가능하고 안정적이며 예측 가능하며 주기 시간이 짧은 개발 및 배포 주기를 사용하도록 설정해야 합니다.

DevOps 워크플로

즉, 기능에 대한 아이디어가 있는 시점과 고객이 기능을 사용하고 피드백을 제공하는 시점 사이의 기간은 가능한 한 짧아야 합니다. 모든 것, 소스 제어 및 지속적인 통합 및 배달을 자동화하는 처음 세 가지 패턴은 이러한 종류의 프로세스를 사용하도록 설정하기 위해 권장하는 모범 사례에 관한 것입니다.

Azure 관리 스크립트

이 전자책 소개에서 웹 기반 콘솔인 Azure 관리 포털을 확인했습니다. 관리 포털을 사용하면 Azure에 배포한 모든 리소스를 모니터링하고 관리할 수 있습니다. 웹앱 및 VM과 같은 서비스를 만들고 삭제하고, 해당 서비스를 구성하고, 서비스 작업을 모니터링하는 쉬운 방법입니다. 그것은 좋은 도구, 하지만 그것을 사용 하 여 수동 프로세스. 모든 크기, 특히 팀 환경에서 프로덕션 애플리케이션을 개발하려는 경우 Azure를 알아보고 탐색한 다음 반복적으로 수행할 프로세스를 자동화하기 위해 포털 UI를 살펴보는 것이 좋습니다.

관리 포털 또는 Visual Studio에서 수동으로 수행할 수 있는 거의 모든 작업은 REST 관리 API를 호출하여 수행할 수도 있습니다. Windows PowerShell 사용하여 스크립트를 작성하거나 Chef 또는 Puppet과 같은 오픈 소스 프레임워크를 사용할 수 있습니다. Mac 또는 Linux 환경에서 Bash 명령줄 도구를 사용할 수도 있습니다. Azure에는 다양한 환경에 대한 스크립팅 API가 있으며 스크립트 대신 코드를 작성하려는 경우 .NET 관리 API 가 있습니다.

수정 앱의 경우 테스트 환경을 만들고 해당 환경에 프로젝트를 배포하는 프로세스를 자동화하는 몇 가지 Windows PowerShell 스크립트를 만들었으며 해당 스크립트의 일부 내용을 검토합니다.

환경 만들기 스크립트

살펴보겠습니다 첫 번째 스크립트 이름은 New-AzureWebsiteEnv.ps1합니다. 테스트를 위해 수정 앱을 에 배포할 수 있는 Azure 환경을 만듭니다. 이 스크립트에서 수행하는 기본 작업은 다음과 같습니다.

  • 웹앱 만들기
  • 스토리지 계정을 만듭니다. (이후 챕터에서 볼 수 있듯이 Blob 및 큐에 필요합니다.)
  • SQL Database 서버와 애플리케이션 데이터베이스와 멤버 자격 데이터베이스의 두 데이터베이스를 만듭니다.
  • 앱이 스토리지 계정 및 데이터베이스에 액세스하는 데 사용할 설정을 Azure에 저장합니다.
  • 배포를 자동화하는 데 사용할 설정 파일을 만듭니다.

스크립트 실행

참고

챕터의 이 부분에서는 스크립트의 예제와 스크립트를 실행하기 위해 입력한 명령을 보여 줍니다. 이 데모는 스크립트를 실행하기 위해 알아야 할 모든 것을 제공하지 않습니다. 단계별 방법 지침은 부록: 수정 샘플 애플리케이션을 참조하세요.

Azure 서비스를 관리하는 PowerShell 스크립트를 실행하려면 Azure PowerShell 콘솔을 설치하고 Azure 구독에서 작동하도록 구성해야 합니다. 설정되면 다음과 같은 명령을 사용하여 수정 환경 만들기 스크립트를 실행할 수 있습니다.

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

매개 변수는 Name 데이터베이스 및 스토리지 계정을 만들 때 사용할 이름을 지정하고 매개 변수는 SqlDatabasePassword SQL Database 만들 관리자 계정의 암호를 지정합니다. 나중에 살펴보겠습니다. 사용할 수 있는 다른 매개 변수가 있습니다.

PowerShell 창

스크립트가 완료되면 관리 포털에서 생성된 내용을 볼 수 있습니다. 다음 두 개의 데이터베이스를 찾을 수 있습니다.

데이터베이스

스토리지 계정:

스토리지 계정

그리고 웹앱:

웹 사이트

웹앱에 대한 구성 탭에서 수정 앱에 대해 스토리지 계정 설정 및 SQL 데이터베이스 연결 문자열이 설정되어 있음을 확인할 수 있습니다.

appSettings 및 connectionStrings

이제 Automation 폴더에는 <websitename.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초 후에 수행됩니다.

팀의 다른 사용자가 테스트 환경을 만들려는 경우 스크립트를 실행할 수 있습니다. 속도가 빠를 뿐만 아니라 사용 중인 환경과 동일한 환경을 사용하고 있다고 확신할 수도 있습니다. 모든 사용자가 관리 포털 UI를 사용하여 수동으로 설정하는 경우 그다지 확신할 수 없었습니다.

스크립트 살펴보기

실제로 이 작업을 수행하는 세 가지 스크립트가 있습니다. 명령줄에서 하나를 호출하고 다른 두 개를 자동으로 사용하여 일부 작업을 수행합니다.

  • New-AzureWebSiteEnv.ps1 기본 스크립트입니다.

    • New-AzureStorage.ps1 스토리지 계정을 만듭니다.
    • New-AzureSql.ps1 데이터베이스를 만듭니다.

기본 스크립트의 매개 변수

기본 스크립트는 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"), 데이터베이스 서버에 대한 방화벽 규칙을 지정할 수 있습니다.

웹앱 만들기

스크립트에서 가장 먼저 수행하는 작업은 cmdlet을 New-AzureWebsite 호출하여 웹앱 이름 및 위치 매개 변수 값을 전달하여 웹앱을 만드는 것입니다.

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

스토리지 계정 만들기

그런 다음 기본 스크립트는 스토리지 계정 이름에 대해 "*<websitename>*storage"를 지정하고 웹앱과 동일한 데이터 센터 위치를 지정하는New-AzureStorage.ps1스크립트를 실행합니다.

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

New-AzureStorage.ps1 cmdlet을 New-AzureStorageAccount 호출하여 스토리지 계정을 만들고 계정 이름과 액세스 키 값을 반환합니다. 스토리지 계정의 Blob 및 큐에 액세스하려면 애플리케이션에 이러한 값이 필요합니다.

# 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}

항상 새 스토리지 계정을 만들려는 것은 아닙니다. 필요에 따라 기존 스토리지 계정을 사용하도록 지시하는 매개 변수를 추가하여 스크립트를 향상시킬 수 있습니다.

데이터베이스 만들기

그런 다음 기본 스크립트는 기본 데이터베이스 및 방화벽 규칙 이름을 설정한 후 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 주소를 검색하고 개발 머신이 서버에 연결하고 관리할 수 있도록 방화벽 규칙을 설정합니다. 그런 다음 데이터베이스 만들기 스크립트는 데이터베이스를 설정하는 몇 가지 단계를 수행합니다.

  • cmdlet을 사용하여 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
    
  • cmdlet을 사용하여 서버 이름 및 자격 증명을 포함하는 데이터베이스 컨텍스트를 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 는 cmdlet을 호출 ConvertTo-SecureString 하여 암호를 암호화하고 cmdlet이 반환하는 것과 동일한 형식의 PSCredential 개체를 반환하는 스크립트의 Get-Credential 함수입니다.

  • cmdlet을 사용하여 애플리케이션 데이터베이스 및 멤버 자격 데이터베이스를 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에는 Web.config 파일에서 또는 connectionStrings 컬렉션을 읽으 appSettings 려고 할 때 애플리케이션에 반환되는 항목을 자동으로 재정의하는 설정 및 연결 문자열을 저장할 수 있는 기능이 있습니다. 배포할 때 Web.config 변환을 적용하는 대안입니다. 자세한 내용은 이 전자책의 뒷부 분에 있는 Azure에 중요한 데이터 저장 을 참조하세요.

환경 만들기 스크립트는 Azure에서 실행할 때 애플리케이션이 스토리지 계정 및 데이터베이스에 액세스하는 데 필요한 모든 appSettingsconnectionStrings 값을 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

배포 준비

프로세스가 끝나면 환경 만들기 스크립트는 두 함수를 호출하여 배포 스크립트에서 사용할 파일을 만듭니다.

이러한 함수 중 하나는 게시 프로필(<websitename.pubxml> 파일)을 만듭니다. 이 코드는 Azure REST API를 호출하여 게시 설정을 가져와 서 .publishsettings 파일에 정보를 저장합니다. 그런 다음, 해당 파일의 정보를 템플릿 파일(pubxml.template)과 함께 사용하여 게시 프로필이 포함된 .pubxml 파일을 만듭니다. 이 2단계 프로세스는 Visual Studio에서 수행하는 작업을 시뮬레이션합니다. .publishsettings 파일을 다운로드하고 가져오기를 사용하여 게시 프로필을 만듭니다.

다른 함수는 다른 템플릿 파일(website-environment.template)을 사용하여 배포 스크립트가 .pubxml 파일과 함께 사용할 설정을 포함하는 website-environment.xml 파일을 만듭니다.

문제 해결 및 오류 처리

스크립트는 프로그램과 같습니다. 실패할 수 있으며, 실패의 원인과 원인에 대해 최대한 알고 싶을 때입니다. 이러한 이유로 환경 만들기 스크립트는 변수 값을 VerbosePreference 에서 로 SilentlyContinueContinue 변경하여 모든 자세한 메시지가 표시됩니다. 또한 스크립트가 종료하지 않는 오류가 발생하는 경우에도 중지되도록 변수 값을 ErrorActionPreference 에서 ContinueStop로 변경합니다.

# 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 지정한 경우 cmdlet을 Show-AzureWebsite 호출하여 기본 브라우저를 웹 사이트 URL로 엽니다.

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

다음과 같은 명령을 사용하여 배포 스크립트를 실행할 수 있습니다.

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

그리고 완료되면 브라우저가 열리고 URL에서 클라우드 <websitename>.azurewebsites.net 에서 실행되는 사이트가 열립니다.

Windows Azure에 배포된 앱 수정

요약

이러한 스크립트를 사용하면 동일한 옵션을 사용하여 동일한 단계가 항상 동일한 순서로 실행될 것이라고 확신할 수 있습니다. 이렇게 하면 팀의 각 개발자가 다른 팀 구성원의 환경이나 프로덕션에서 실제로 동일한 방식으로 작동하지 않는 무언가를 놓치지 않거나 사용자 지정 항목을 자신의 컴퓨터에 배포하지 않도록 할 수 있습니다.

마찬가지로 REST API, Windows PowerShell 스크립트, .NET 언어 API 또는 Linux 또는 Mac에서 실행할 수 있는 Bash 유틸리티를 사용하여 관리 포털에서 수행할 수 있는 대부분의 Azure 관리 기능을 자동화할 수 있습니다.

다음 챕터에서는 소스 코드를 살펴보고 소스 코드 리포지토리에 스크립트를 포함하는 것이 중요한 이유를 설명합니다.

리소스