Her Şeyi Otomatikleştirme (Azure ile Real-World Cloud Apps Oluşturma)

Tarafından Rick Anderson, Tom Dykstra

Fix It Project'i indirin veya E-kitap indirin

Azure ile Gerçek Dünya Bulut Uygulamaları Oluşturma e-kitabı, Scott Guthrie tarafından geliştirilen bir sunuyu temel alır. Bulut için web uygulamalarını başarıyla geliştirmenize yardımcı olabilecek 13 desen ve uygulama açıklanmaktadır. E-kitap tanıtımı için ilk bölüme bakın.

Bakacağımız ilk üç desen, yazılım geliştirme projelerine, özellikle de bulut projelerine uygulanır. Bu düzen, geliştirme görevlerini otomatikleştirmeye yöneliktir. El ile işlemler yavaş ve hataya açık olduğundan bu önemli bir konudur; mümkün olduğunca çoğunu otomatikleştirmek hızlı, güvenilir ve çevik bir iş akışı ayarlamanıza yardımcı olur. Şirket içi ortamda otomatikleştirilmesi zor veya imkansız olan birçok görevi kolayca otomatikleştirebildiğiniz için bulut geliştirme için benzersiz bir öneme sahiptir. Örneğin, yeni web sunucusu ve arka uç VM'leri, veritabanları, blob depolama (dosya depolaması), kuyruklar vb. gibi tüm test ortamlarını ayarlayabilirsiniz.

DevOps İş Akışı

Giderek "DevOps" terimini duyarsınız. Bu terim, yazılımı verimli bir şekilde geliştirmek için geliştirme ve operasyon görevlerini tümleştirmeniz gereken bir tanıma göre geliştirilmiştir. Etkinleştirmek istediğiniz iş akışı türü, bir uygulama geliştirebileceğiniz, dağıtabileceğiniz, üretim kullanımından öğrenebileceğiniz, öğrendiklerine yanıt olarak değiştirebileceğiniz ve döngüyü hızlı ve güvenilir bir şekilde tekrarlayabileceğiniz bir iş akışıdır.

Bazı başarılı bulut geliştirme ekipleri canlı bir ortama günde birden çok kez dağıtılır. Azure ekibi eskiden 2-3 ayda bir büyük bir güncelleştirme dağıtırken, şimdi 2-3 günde bir küçük güncelleştirmeler ve 2-3 haftada bir büyük sürümler yayınlar. Bu tempoya girmek, müşteri geri bildirimlerine yanıt vermenizi gerçekten kolaylaştırır.

Bunu yapmak için yinelenebilir, güvenilir, öngörülebilir ve düşük döngü süresine sahip bir geliştirme ve dağıtım döngüsünü etkinleştirmeniz gerekir.

DevOps iş akışı

Başka bir deyişle, bir özellik hakkında fikir sahibi olduğunuz ve müşterilerin bu özelliği kullandığı ve geri bildirim sağladığı zaman arasındaki sürenin olabildiğince kısa olması gerekir. her şeyi otomatikleştirme, kaynak denetimi, sürekli tümleştirme ve teslim gibi ilk üç düzen, bu tür bir süreci etkinleştirmek için önerdiğimiz en iyi yöntemlerle ilgili.

Azure yönetim betikleri

Bu e-kitap tanıtımında web tabanlı konsol olan Azure Yönetim Portalı'nı gördünüz. Yönetim portalı, Azure'da dağıttığınız tüm kaynakları izlemenize ve yönetmenize olanak tanır. Web uygulamaları ve VM'ler gibi hizmetleri oluşturmanın ve silmenin, bu hizmetleri yapılandırmanın, hizmet işlemini izlemenin ve benzeri işlemlerin kolay bir yoludur. Harika bir araçtır, ancak el ile gerçekleştirilen bir işlemdir. Her boyutta ve özellikle de ekip ortamında herhangi bir boyutta bir üretim uygulaması geliştirecekseniz, Azure'ı öğrenmek ve keşfetmek için portal kullanıcı arabirimini incelemenizi ve tekrar tekrar gerçekleştirdiğiniz işlemleri otomatikleştirmenizi öneririz.

Yönetim portalında veya Visual Studio'dan el ile yapabileceğiniz neredeyse her şey REST yönetim API'sini çağırarak da yapılabilir. Windows PowerShell kullanarak betik yazabileceğiniz gibi Chef veya Puppet gibi bir açık kaynak çerçevesi de kullanabilirsiniz. Mac veya Linux ortamında Bash komut satırı aracını da kullanabilirsiniz. Azure'da tüm bu farklı ortamlar için betik API'leri vardır ve betik yerine kod yazmak istemeniz durumunda bir .NET yönetim API'sine sahiptir.

Düzelt uygulaması için test ortamı oluşturma ve projeyi bu ortama dağıtma işlemlerini otomatik hale getiren bazı Windows PowerShell betikleri oluşturduk ve bu betiklerin bazı içeriğini gözden geçireceğiz.

Ortam oluşturma betiği

Bakacağımız ilk betik New-AzureWebsiteEnv.ps1olarak adlandırılır. Test için Düzelt uygulamasını dağıtabileceğiniz bir Azure ortamı oluşturur. Bu betiğin gerçekleştirdiği ana görevler şunlardır:

  • Bir web uygulaması oluşturun.
  • Depolama hesabı oluşturma. (Sonraki bölümlerde göreceğiniz gibi bloblar ve kuyruklar için gereklidir.)
  • bir SQL Veritabanı sunucusu ve iki veritabanı oluşturun: uygulama veritabanı ve üyelik veritabanı.
  • Uygulamanın depolama hesabına ve veritabanlarına erişmek için kullanacağı Azure'da depolama ayarları.
  • Dağıtımı otomatikleştirmek için kullanılacak ayar dosyaları oluşturun.

Betiği çalıştırın

Not

Bölümün bu bölümünde betik örnekleri ve bunları çalıştırmak için girdiğiniz komutlar gösterilir. Bu bir tanıtımdır ve betikleri çalıştırmak için bilmeniz gereken her şeyi sağlamaz. Adım adım nasıl yapılır yönergeleri için bkz. Ek: Düzelt Örnek Uygulaması.

Azure hizmetlerini yöneten bir PowerShell betiği çalıştırmak için Azure PowerShell konsolunu yüklemeniz ve Azure aboneliğinizle çalışacak şekilde yapılandırmanız gerekir. Ayarladıktan sonra, Aşağıdakine benzer bir komutla Düzelt ortam oluşturma betiğini çalıştırabilirsiniz:

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

Name parametresi veritabanı ve depolama hesaplarını oluştururken kullanılacak adı, parametresi ise SqlDatabasePassword SQL Veritabanı için oluşturulacak yönetici hesabının parolasını belirtir. Daha sonra inceleyebileceğimiz başka parametreler de vardır.

PowerShell penceresi

Betik tamamlandıktan sonra yönetim portalında nelerin oluşturulduğunu görebilirsiniz. İki veritabanı bulacaksınız:

Veritabanları

Depolama hesabı:

Depolama hesabı

Ve bir web uygulaması:

Web sitesi

Web uygulamasının Yapılandır sekmesinde, depolama hesabı ayarlarının ve Düzelt uygulaması için SQL veritabanı bağlantı dizelerinin ayarlandığını görebilirsiniz.

appSettings ve connectionStrings

Otomasyon klasörü artık bir <websitename.pubxml> dosyası da içeriyor. Bu dosya, MSBuild'in uygulamayı yeni oluşturulan Azure ortamına dağıtmak için kullanacağı ayarları depolar. Örnek:

<?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>

Gördüğünüz gibi betik tam bir test ortamı oluşturmuştur ve tüm işlem yaklaşık 90 saniye içinde gerçekleştirilir.

Takımınızdaki başka biri test ortamı oluşturmak isterse betiği çalıştırabilir. Hızlı olmakla kalmaz, aynı zamanda kullandığınız ortamla aynı ortamı kullandıklarından da emin olabilirler. Yönetim portalı kullanıcı arabirimini kullanarak herkesin işleri el ile ayarlaması durumunda bu kadar emin olamazdınız.

Betiklere bir bakış

Aslında bu işi yapacak üç betik vardır. Komut satırından birini çağırırsınız ve bazı görevleri gerçekleştirmek için otomatik olarak diğer ikisini kullanır:

  • New-AzureWebSiteEnv.ps1 ana betiktir.

    • New-AzureStorage.ps1 depolama hesabını oluşturur.
    • New-AzureSql.ps1 veritabanlarını oluşturur.

Ana betikteki parametreler

New-AzureWebSiteEnv.ps1ana betiği çeşitli parametreleri tanımlar:

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

İki parametre gereklidir:

  • Betiğin oluşturduğu web uygulamasının adı. (Url için de kullanılır: <name>.azurewebsites.net.)
  • Betiğin oluşturduğu veritabanı sunucusunun yeni yönetici kullanıcısının parolası.

İsteğe bağlı parametreler, veri merkezi konumunu (varsayılan olarak "Batı ABD" olarak adlandırılır), veritabanı sunucusu yönetici adını ("dbuser" olarak adlandırılır) ve veritabanı sunucusu için bir güvenlik duvarı kuralını belirtmenizi sağlar.

Web uygulaması oluşturma

Betiğin yaptığı ilk şey, cmdlet'ini New-AzureWebsite çağırarak web uygulamasını oluşturmak ve buna web uygulaması adı ve konum parametresi değerlerini geçirmektir:

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

Depolama hesabını oluşturma

Ardından ana betik , depolama hesabı adı için "*<web sitesiadı>*depolama" ve web uygulamasıyla aynı veri merkezi konumunu belirterekNew-AzureStorage.ps1betiğini çalıştırır.

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

New-AzureStorage.ps1 depolama hesabını oluşturmak için cmdlet'ini çağırır New-AzureStorageAccount ve hesap adını ve erişim anahtarı değerlerini döndürür. Uygulamanın depolama hesabındaki bloblara ve kuyruklara erişmek için bu değerlere ihtiyacı olacaktır.

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

Her zaman yeni bir depolama hesabı oluşturmak istemeyebilirsiniz; betiği, isteğe bağlı olarak mevcut bir depolama hesabını kullanmaya yönlendiren bir parametre ekleyerek geliştirebilirsiniz.

Veritabanlarını oluşturma

Ardından ana betik, varsayılan veritabanı ve güvenlik duvarı kural adlarını ayarladıktan sonra New-AzureSql.ps1veritabanı oluşturma betiğini çalıştırır:

$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

Veritabanı oluşturma betiği, geliştirme makinesinin IP adresini alır ve geliştirme makinesinin sunucuya bağlanabilmesi ve sunucuyu yönetebilmesi için bir güvenlik duvarı kuralı ayarlar. Veritabanı oluşturma betiği daha sonra veritabanlarını ayarlamak için birkaç adımdan geçer:

  • cmdlet'ini New-AzureSqlDatabaseServer kullanarak sunucuyu oluşturur.

    $databaseServer = New-AzureSqlDatabaseServer -AdministratorLogin $UserName -AdministratorLoginPassword $Password -Location $Location
    
  • Geliştirme makinesinin sunucuyu yönetmesini ve web uygulamasının ona bağlanmasını sağlamak için güvenlik duvarı kuralları oluşturur.

    # 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'ini kullanarak sunucu adını ve kimlik bilgilerini içeren bir veritabanı bağlamı New-AzureSqlDatabaseServerContext oluşturur.

    # 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, betikte parolayı ConvertTo-SecureString şifrelemek için cmdlet'ini çağıran ve cmdlet'in döndürdüğü aynı türde bir nesne döndüren Get-Credential bir PSCredential işlevdir.

  • cmdlet'ini kullanarak New-AzureSqlDatabase uygulama veritabanını ve üyelik veritabanını oluşturur.

    # 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
    
  • Her veritabanı için bir bağlantı dizesi oluşturmak üzere yerel olarak tanımlanmış bir işlevi çağırır. Uygulama veritabanlarına erişmek için bu bağlantı dizelerini kullanır.

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

    Get-SQLAzureDatabaseConnectionString, betikte tanımlanan ve ona sağlanan parametre değerlerinden bağlantı dizesini oluşturan bir işlevdir.

    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;"
    }
    
  • Veritabanı sunucusu adını ve bağlantı dizelerini içeren bir karma tablo döndürür.

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

Düzelt uygulaması ayrı üyelik ve uygulama veritabanları kullanır. Hem üyelik hem de uygulama verilerini tek bir veritabanına koymak da mümkündür.

Uygulama ayarlarını ve bağlantı dizelerini depolama

Azure, Web.config dosyasındaki veya connectionStrings koleksiyonlarını okumaya appSettings çalıştığında uygulamaya döndürülenleri otomatik olarak geçersiz kılan ayarları ve bağlantı dizelerini depolamanızı sağlayan bir özelliğe sahiptir. Bu, dağıttığınızda Web.config dönüştürmeleri uygulamanın bir alternatifidir. Daha fazla bilgi için bu e-kitabın ilerleyen bölümlerindeki Hassas verileri Azure'da depolama konusuna bakın.

Ortam oluşturma betiği, Azure'da çalıştırıldığında uygulamanın depolama hesabına ve veritabanlarına erişmesi için gereken tüm appSettings ve connectionStrings değerlerini Azure'da depolar.

# 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 , İzleme ve Telemetri bölümünde gösterdiğimiz bir telemetri çerçevesidir. Ortam oluşturma betiği, New Relic ayarlarını aldığından emin olmak için web uygulamasını da yeniden başlatır.

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

Dağıtım için hazırlanma

İşlemin sonunda ortam oluşturma betiği, dağıtım betiği tarafından kullanılacak dosyaları oluşturmak için iki işlevi çağırır.

Bu işlevlerden biri bir yayımlama profili (<websiteadı.pubxml> dosyası) oluşturur. Kod, yayımlama ayarlarını almak için Azure REST API'sini çağırır ve bilgileri bir .publishsettings dosyasına kaydeder. Ardından, yayımlama profilini içeren .pubxml dosyasını oluşturmak için bu dosyadaki bilgileri bir şablon dosyası (pubxml.template) ile birlikte kullanır. Bu iki adımlı işlem, Visual Studio'da yaptığınız işlemlerin benzetimini yapar: bir .publishsettings dosyası indirin ve bunu içeri aktararak bir yayımlama profili oluşturun.

Diğer işlev, dağıtım betiğinin .pubxml dosyasıyla birlikte kullanacağı ayarları içeren birwebsite-environment.xml dosyası oluşturmak için başka bir şablon dosyası (website-environment.template) kullanır.

Sorun giderme ve hata işleme

Betikler programlara benzer: başarısız olabilirler ve ne zaman hata ve buna neyin neden olduğu hakkında olabildiğince çok şey bilmek istersiniz. Bu nedenle, ortam oluşturma betiği değişkenin VerbosePreferenceSilentlyContinueContinue değerini olarak değiştirerek tüm ayrıntılı iletilerin görüntülenmesini sağlar. Ayrıca değişkenin ErrorActionPreferenceContinueStopdeğerini olarak değiştirir, böylece betik sonlandırıcı olmayan hatalarla karşılaştığında bile durur:

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

Betik, herhangi bir çalışma yapmadan önce başlangıç saatini depolar ve böylece işlem tamamlandığında geçen süreyi hesaplayabilir:

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

Betik, çalışmasını tamamladıktan sonra geçen süreyi görüntüler:

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

Her anahtar işlemi için betik ayrıntılı iletiler yazar, örneğin:

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"

Dağıtım betiği

New-AzureWebsiteEnv.ps1 betiğinin ortam oluşturma için yaptığı işlem, Publish-AzureWebsite.ps1 betiği uygulama dağıtımı için yapar.

Dağıtım betiği, ortam oluşturma betiği tarafından oluşturulan website-environment.xml dosyasından web uygulamasının adını alır.

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

Dağıtım kullanıcı parolasını .publishsettings dosyasından alır:

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

Projeyi derleyen ve dağıtan MSBuild komutunu yürütür:

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

Komut satırında parametresini Launch belirttiyseniz, varsayılan tarayıcınızı web sitesi URL'sine açmak için cmdlet'ini çağırır Show-AzureWebsite .

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

Dağıtım betiğini aşağıdakine benzer bir komutla çalıştırabilirsiniz:

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

İşlem tamamlandığında tarayıcı açılır ve url'de <websitename>.azurewebsites.net site bulutta çalışır.

Windows Azure'a dağıtılan Bt uygulamasını düzeltme

Özet

Bu betiklerle, aynı adımların her zaman aynı seçenekler kullanılarak aynı sırada yürütüleceğinden emin olabilirsiniz. Bu, ekipteki her geliştiricinin bir şeyi kaçırmamasını veya bir şeyi bozmamasını ya da başka bir ekip üyesinin ortamında veya üretim ortamında aynı şekilde çalışmayan özel bir şeyi kendi makinesine dağıtmamasını sağlamaya yardımcı olur.

Benzer şekilde REST API, Windows PowerShell betikleri, .NET dil API'sini veya Linux veya Mac üzerinde çalıştırabileceğiniz bash yardımcı programını kullanarak yönetim portalında gerçekleştirebileceğiniz çoğu Azure yönetim işlevini otomatikleştirebilirsiniz.

Sonraki bölümde kaynak koduna göz atacak ve betiklerinizi kaynak kod deponuza eklemenin neden önemli olduğunu açıklayacağız.

Kaynaklar