すべてを自動化する (Azure Real-World Cloud Apps の構築)

作成者 : Rick AndersonTom Dykstra

Fix It プロジェクトのダウンロード または 電子書籍のダウンロード

Azure 電子書籍 を使用した Real World Cloud Apps の構築 は、Scott Guthrie が開発したプレゼンテーションに基づいています。 クラウド向けの Web アプリの開発を成功させるために役立つ 13 のパターンとプラクティスについて説明します。 電子書籍の概要については、 最初の章を参照してください。

最初の 3 つのパターンは、実際にはソフトウェア開発プロジェクトに適用されますが、特にクラウド プロジェクトに適用されます。 このパターンは、開発タスクの自動化に関するパターンです。 手動プロセスは遅く、エラーが発生しやすいため、これは重要なトピックです。可能な限り多くの自動化は、高速で信頼性が高く、アジャイルなワークフローを設定するのに役立ちます。 オンプレミス環境では自動化が困難または不可能な多くのタスクを簡単に自動化できるため、クラウド開発では特に重要です。 たとえば、新しい Web サーバーとバックエンド VM、データベース、BLOB ストレージ (ファイル ストレージ)、キューなど、テスト環境全体を設定できます。

DevOps ワークフロー

"DevOps" という用語がますます聞こえます。この用語は、ソフトウェアを効率的に開発するために開発タスクと運用タスクを統合する必要があることを認識して開発されました。 有効にするワークフローの種類は、アプリを開発し、デプロイし、その運用使用状況から学習し、学習した内容に応じて変更し、サイクルを迅速かつ確実に繰り返すことができるワークフローです。

一部の成功したクラウド開発チームは、ライブ環境に 1 日に複数回デプロイします。 Azure チームは 2 ~ 3 か月ごとにメジャー更新プログラムをデプロイしましたが、現在は 2 ~ 3 日ごとにマイナー更新プログラムをリリースし、メジャー リリースは 2 ~ 3 週間ごとにリリースしています。 その頻度に入ることは、顧客からのフィードバックに対する反応を高めるのに本当に役立ちます。

そのためには、反復可能で信頼性が高く、予測可能で、サイクル時間が少ない開発とデプロイのサイクルを有効にする必要があります。

DevOps ワークフロー

つまり、機能のアイデアがある期間と、顧客が機能を使用してフィードバックを提供するまでの期間は、できるだけ短くする必要があります。 最初の 3 つのパターン (すべてを自動化する、ソース管理、継続的インテグレーションと配信) はすべて、そのようなプロセスを有効にするために推奨されるベスト プラクティスに関するものです。

Azure 管理スクリプト

この電子書籍の概要では、Web ベースのコンソールである Azure 管理ポータルを確認しました。 管理ポータルを使用すると、Azure にデプロイしたすべてのリソースを監視および管理できます。 Web アプリや VM などのサービスを作成および削除したり、それらのサービスを構成したり、サービス操作を監視したりするための簡単な方法です。 これは優れたツールですが、それを使用することは手動のプロセスです。 任意のサイズの運用アプリケーション (特にチーム環境) を開発する場合は、Azure を学習して探索するためにポータル UI を使用し、繰り返し実行するプロセスを自動化することをお勧めします。

管理ポータルまたは Visual Studio から手動で実行できるほとんどすべての操作は、REST 管理 API を呼び出すことで行うこともできます。 Windows PowerShellを使用してスクリプトを記述することも、ChefPuppet などのオープンソースフレームワークを使用することもできます。 Mac または Linux 環境で Bash コマンド ライン ツールを使用することもできます。 Azure には、これらすべての異なる環境用のスクリプト API があり、スクリプトではなくコードを記述する場合に備えて .NET 管理 API を備えています。

Fix It アプリでは、テスト環境を作成し、その環境にプロジェクトをデプロイするプロセスを自動化するWindows PowerShellスクリプトをいくつか作成しました。これらのスクリプトの内容の一部を確認します。

環境作成スクリプト

最初に見るスクリプトの名前は New-AzureWebsiteEnv.ps1です。 テスト用に Fix It アプリをデプロイできる Azure 環境が作成されます。 このスクリプトで実行されるメインタスクは次のとおりです。

  • Web アプリを作成する。
  • ストレージ アカウントを作成します。 (後の章で説明するように、BLOB とキューに必要です)。
  • SQL Database サーバーと 2 つのデータベース (アプリケーション データベースとメンバーシップ データベース) を作成します。
  • アプリがストレージ アカウントとデータベースにアクセスするために使用する設定を Azure に格納します。
  • デプロイの自動化に使用する設定ファイルを作成します。

スクリプトを実行する

Note

この章のこの部分では、スクリプトの例と、スクリプトを実行するために入力するコマンドを示します。 これはデモであり、スクリプトを実行するために知る必要があるすべてを提供するわけではありません。 詳細な操作方法については、「 付録: 修正サンプル アプリケーション」を参照してください。

Azure サービスを管理する PowerShell スクリプトを実行するには、Azure PowerShell コンソールをインストールし、Azure サブスクリプションを操作するように構成する必要があります。 セットアップが完了したら、次のようなコマンドを使用して Fix It 環境作成スクリプトを実行できます。

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

パラメーターはName、データベース アカウントとストレージ アカウントの作成時に使用する名前を指定しSqlDatabasePassword、 パラメーターには、SQL Database用に作成される管理者アカウントのパスワードを指定します。 使用できるパラメーターは他にもあります。これについては後で説明します。

PowerShell ウィンドウ

スクリプトが完了すると、管理ポータルで作成された内容を確認できます。 次の 2 つのデータベースがあります。

データベース

ストレージ アカウント:

ストレージ アカウント

Web アプリ:

Web サイト

Web アプリの [ 構成 ] タブで、Fix It アプリ用に設定されたストレージ アカウント設定と 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 を使用して手動で設定していた場合、それほど自信を持つことができませんでした。

スクリプトを見る

実際には、この作業を行うスクリプトが 3 つあります。 コマンド ラインから 1 つを呼び出すと、他の 2 つが自動的に使用されて、一部のタスクが実行されます。

  • 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                      
    )

次の 2 つのパラメーターが必要です。

  • スクリプトによって作成される Web アプリの名前。 (これは URL にも使用されます。 <name>.azurewebsites.net
  • スクリプトによって作成されるデータベース サーバーの新しい管理ユーザーのパスワード。

オプションのパラメーターを使用すると、データ センターの場所 (既定値は "米国西部")、データベース サーバー管理者名 (既定値は "dbuser")、およびデータベース サーバーのファイアウォール規則を指定できます。

Web アプリの作成

スクリプトで最初に行うことは、 コマンドレットを呼び出して Web アプリを New-AzureWebsite 作成し、それに Web アプリ名と場所パラメーター値を渡すことです。

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

ストレージ アカウントを作成する

次に、メイン スクリプトは、ストレージ アカウント名に "*websitename>*<storage" を指定し、Web アプリと同じデータ センターの場所を指定して、New-AzureStorage.ps1スクリプトを実行します。

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

New-AzureStorage.ps1 コマンドレットを 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 アドレスを取得し、開発マシンがサーバーに接続して管理できるようにファイアウォール規則を設定します。 その後、データベース作成スクリプトでは、いくつかの手順を実行してデータベースを設定します。

  • コマンドレットを使用してサーバーを New-AzureSqlDatabaseServer 作成します。

    $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -AdministratorLoginPassword $Password -Location $Location
    
  • 開発マシンがサーバーを管理し、Web アプリがサーバーに接続できるようにするファイアウォール規則を作成します。

    # 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 アプリでは、個別のメンバーシップデータベースとアプリケーション データベースが使用されます。 メンバーシップとアプリケーション データの両方を 1 つのデータベースに配置することもできます。

アプリの設定と接続文字列を格納する

Azure には、Web.config ファイル内の コレクションまたは コレクションの読み取 appSettings りを試みたときに、アプリケーションに返される内容を自動的にオーバーライドする設定と connectionStrings 接続文字列を格納できる機能があります。 これは、デプロイ時に Web.config変換 を適用する代わりに使用します。 詳細については、この電子書籍 で後述する「Azure に機密データを格納 する」を参照してください。

環境作成スクリプトは、アプリケーションが Azure で実行されるときにストレージ アカウントとconnectionStringsデータベースにアクセスするために必要なすべての appSettings 値と 値を 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 は、 監視と テレメトリに関する章で示すテレメトリ フレームワークです。 環境作成スクリプトでは、Web アプリも再起動して、New Relic の設定が確実に取得されるようにします。

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

デプロイの準備

プロセスの最後に、環境作成スクリプトは 2 つの関数を呼び出して、デプロイ スクリプトによって使用されるファイルを作成します。

これらの関数の 1 つは、発行プロファイル (<websitename.pubxml> ファイル) を作成します。 このコードは Azure REST API を呼び出して発行設定を取得し、その情報を .publishsettings ファイルに保存します。 次に、そのファイルの情報とテンプレート ファイル (pubxml.template) を使用して、発行プロファイルを含む .pubxml ファイルを作成します。 この 2 段階のプロセスでは、Visual Studio で実行する操作をシミュレートします。 .publishsettings ファイルをダウンロードし、それをインポートして発行プロファイルを作成します。

もう 1 つの関数は、別のテンプレート ファイル (website-environment.template) を使用して、デプロイ スクリプトが .pubxml ファイルと共に使用する設定を含むwebsite-environment.xml ファイルを作成します。

トラブルシューティングとエラー処理

スクリプトはプログラムのようなものです。失敗する可能性があり、エラーとその原因についてできるだけ多くのことを知りたい場合。 このため、環境作成スクリプトは変数の値を VerbosePreference から SilentlyContinue に変更し Continue 、すべての詳細メッセージが表示されるようにします。 また、変数の 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 ファイルから Web アプリの名前を取得します。

[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 呼び出して、Web サイトの URL に対する既定のブラウザーを開きます。

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

次のようなコマンドを使用して、デプロイ スクリプトを実行できます。

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

完了すると、ブラウザーが開き、URL でクラウドで実行されているサイトが <websitename>.azurewebsites.net 表示されます。

Windows Azure にデプロイされた It アプリを修正する

まとめ

これらのスクリプトを使用すると、同じオプションを使用して同じ手順が常に同じ順序で実行されることを確信できます。 これにより、チームの各開発者が何かを見逃したり、何かを混乱させたり、別のチーム メンバーの環境や運用環境で実際に同じように動作しないカスタムを自分のマシンにデプロイしたりしないようにすることができます。

同様の方法で、REST API、Windows PowerShell スクリプト、.NET 言語 API、または Linux または Mac で実行できる Bash ユーティリティを使用して、管理ポータルで実行できるほとんどの Azure 管理機能を自動化できます。

次の では、ソース コードを見て、ソース コード リポジトリにスクリプトを含めるのが重要な理由を説明します。

リソース