infrastructure as code for azure
Post on 13-Jul-2015
3.087 Views
Preview:
TRANSCRIPT
Speaker's
3
{
"objectType": "User",
“displayName”: “青木 賢太郎",
"mail": "aoki-kentaro@mki.co.jp",
“company”: “三井情報株式会社",
"onPremisesSecurityIdentifier": null,
"odata.type": "Microsoft.DirectoryServices.User"
}
MKI
Speaker's
{
"name" : "Keiji Kamebuchi",
"corporation" : "pnop Inc.",
"mail" : "kamebuchi@pnop.co.jp",
"web" : "http://buchizo.wordpress.com/",
"twitter" : "@kosmosebi",
}
4
buchizo@kosmosebi
Senior Fellow
どうすればいいの
• 自動化するといいよね
• 誰が何度やっても同じ結果にしよう
7
• プログラムのようにコーディングして
• コンピューターに実行・チェックさせればいい
• Infrastructure as Code
Infrastructureって?
• アプリケーションを動かすための基盤(※このセッションでの狭義)
• ハードウェア、ネットワーク、OS、ミドルウェア…
10
OS Middleware Application
Infrastructure
Immutable Infrastructure / Disposable Components
• Immutable (不変の)
• Disposable (使い捨てな)
• Disposable は重要– 継続的インテグレーションや継続的改善がしやすい
– 気軽に破棄できないと展開やライフサイクルに影響
– 永続化されるデータを外部へ(ログなど)
12
冪等性(べき等性)
• 冪等:ある操作を1度行っても複数回行っても同じ結果(効果)になること
• PowerShell DSCなど多くの宣言的な構成ツールは冪等性が担保されている
– ⇒ 何度実行しても同じ構成になることを保証
13
Command Line Interface
• Azure PowerShell– PowerShell Cmdlets
– Windows PowerShell 3.0 / .NET Framework 4.5 が必要
• Azure クロスプラットフォーム CLI– Azure xplat CLI
– Node.js が必要
17
使う前に
• Add-AzureAccount
– 対話ログオン
– xplat CLIの場合: azure login
• Import-AzurePublishSettingsFile– 証明書を使った資格情報の設定
– xplat CLIの場合: azure account import
18
その他
• Azure Management REST API
– 言語非依存
– Azure PowerShellやxplat CLIが利用– http://msdn.microsoft.com/ja-jp/library/azure/ee460799.aspx
19
全体像(展開時)
20
システム全体
OS
アプリケーション
インフラ
Azureネイティブ 3rd Party
Azure Resource Manager
Azure Automation
Azure PowerShell / xplat CLI
Azure
Managem
ent R
EST A
PI
Azure VM Extension
Kubernetes
Orchestration
Configuration
Bootstrapping
Azure Resource Manager
• Azureのサービスやインスタンスなどをリソースとして扱うための機能
– 機能単位ではなく論理的なリソースとして纏めて管理できる
– 役割ベースの管理(RBAC)やタグ
• 使用するリソースを記述したテンプレートを用いて宣言的にAzure上に構成可能
– テンプレートはJSON形式
23
利用時の注意点• Azure PowerShellのモードを切り替える
– Switch-AzureMode -Name AzureResourceManager– 戻す場合は Switch-AzureMode -Name AzureServiceManagement
• Azure xplat CLIの場合– azure config mode arm– 戻す場合は azure config mode asm
• 必ず対話ログオンが必要– Add-AzureAccount または azure login など
• 現状まだ利用できるリソースやドキュメントは少ない– Azureをフル活用するまでもう暫く時間が必要
• 監視等との連携や有機的に接続するにはまだまだ分断されている• 関連ツール等含めて今後の展開に期待
24
コマンド集• 利用可能なギャラリーのテンプレート一覧で取得
– Get-AzureResourceGroupGalleryTemplate | Sort-Object -Unique Publisher
• テンプレートの取得– Save-AzureResourceGroupGalleryTemplate -Identity OutercurveFoundation.OrchardCMS.0.3.2-preview -
Path .¥
• 作成例$RGPassword = ConvertTo-SecureString "pass" -asplaintext -force
$RGNonSecurePassword = "pass"
$DCLocation = "Japan West"
New-AzureResourceGroup -GalleryTemplateIdentity Acquiacom.AcquiaDrupal7SQL.0.2.1-preview `
-Name "GoAzureRG" -Location $DCLocation -DeploymentName GoAzureD -Tag@(@{Name="Event";Value="GoAzure"}) `
-siteName "GoAzureD" -hostingPlanName GoAzureRGPlan -siteLocation $DCLocation
-sku Free -workerSize 0 -serverName goazuresrv03 -serverLocation $DCLocation `
-administratorLogin username -administratorLoginPassword $RGPassword `
-databaseName goazurergdb `
-webDeploy_DatabaseUsername username -webDeploy_DatabasePassword $RGNonSecurePassword
25
デモ用のべた書きなのでこういうことはしないこと
Azure Automation
• Windows PowerShell Workflow構文で記述されたRunbookをスケジュールに従って実行できる
• 定型処理などAzure上でホスト・実行
27
その他のツールなど• SystemCenter 2012 R2 Orchestrator*
– オーケストレーション– Azureも対象
• Service Management Automation*
– Windows Azure Pack用
• Vagrant, Knife azure (Chef), msopentech/windowsazure (Puppet)– 仮想マシンのデプロイ・破棄など
• Release Management for Visual Studio– デプロイフローの管理・DSCやChefなどを使ったデプロイ– Azureもオンプレミスも対象
• Ubuntu Juju• Serfなど
* Azure AutomationのRunbookと互換
29
現状
• 仮想ネットワークや他のAzureサービスとの連携などまだまだ仕組みとして弱い
– ARMで使用できるリソース種別がまだ少ない
• Azure Management APIやAzurePowerShellなどで構成
• ツールや目的に合った粒度と線引きを
30
コンテナと構成ツール
• コンテナ– Dockerなどのコンテナ化技術を使った構成と
アプリケーション配布
• 構成ツール– Azure標準イメージ(+カスタムイメージ)に
仮想マシン拡張(VM Extension)を使用した構成
• 標準以外も使うことは可能ですが割愛
32
Application
コンテナと構成ツール
33
Azure VM
OS (CoreOS/Ubuntu)
コンテナ コンテナ
Azure VM
OS (Windows/Linux)
VM Extensions
Chef ExtensionPuppet Extension
PowerShell DSC Extension
ApplicationApplication
VM Extensions
Docker Extension
※ Dockerの場合
シーケンス概要
34
仮想マシンのデプロイ
実行環境の準備(仮想ネットワーク/ストレージなど)
Extensionの実行コンテナの配置
OS起動
Orchestration /Bootstrap
Configuration
Docker
• コンテナを実行・配布するための仕組み• Linux/Windows [Preview]
• Docker Hub on Azure はまだ…• Azureだと2パターン
– Docker Extensionを使ってDocker Engineをインストール
– Dockerネイティブなイメージを利用
• Dockerコマンドでコンテナを展開することでコード化が容易に
35
仮想マシン
or
VM Extensions
Docker Extension Docker Engine
Docker on Azure
コンテナApplication
コンテナApplication
コンテナの展開
アプリケーション
Dockerfile
Docker on Azure スクリプト#!/bin/bash
sudo apt-get -y update
sudo apt-get -y upgrade
sudo apt-get -y install git
sudo apt-get -y install docker.io
sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
sudo git clone https://github.com/KentaroAOKI/goazure2015dockerdemo.git
sudo docker build -t goazure2015 goazure2015dockerdemo
sudo docker run -d -t -p 8080:5004 goazure2015
37
Custom Script Extension用(LFにすること)
Docker on Azure スクリプトFROM microsoft/aspnetRUN apt-get -qq update && apt-get -qqy install gitRUN mkdir /appWORKDIR /appRUN git clone https://github.com/buchizo/goazure.gitWORKDIR /app/goazureRUN kpm restoreEXPOSE 5004ENTRYPOINT ["k", "kestrel"]
38
Dockerfile
Docker on Azure スクリプト$PublishSettingsFile = ".¥goazure.publishsettings"$SubscriptionName = "Converted buchizo MSDN 2nd"$StorageAccountName = "goazure"
$InstanceName = "GoAzureDocker01"$CloudServiceName = "GoAzureDocker01"$AdminAccountName = "azureuser"$AdminAccountPassword = "Password1!"$VmLocation = "Japan West"
Import-AzurePublishSettingsFile $PublishSettingsFileSelect-AzureSubscription -SubscriptionName $SubscriptionNameSet-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName
$OSImage = (Get-AzureVMImage | Where { $_.ImageFamily -eq " Ubuntu Server 14.10" } | sort PublishedDate -Descending | Select-Object -First 1)$ImageName = $OSImage.ImageName$CustomScriptExtension = Get-AzureVMAvailableExtension | Where { $_.ExtensionName -eq "CustomScriptForLinux" } $TimeStamp = (Get-Date).Ticks$PublicConfiguration = '{"fileUris":["http://goazure.blob.core.windows.net/docker/dockerbuild.sh"], "commandToExecute": "shdockerbuild.sh", "timestamp": "' + $TimeStamp + '" }'
$VmConfig = New-AzureVMConfig -Name $InstanceName -ImageName $ImageName -InstanceSize "Basic_A1" -Verbose `| Add-AzureProvisioningConfig -Linux -LinuxUser $AdminAccountName -Password $AdminAccountPassword -Verbose `| Set-AzureVMExtension -ExtensionName $CustomScriptExtension.ExtensionName -Publisher $CustomScriptExtension.Publisher -
Version $CustomScriptExtension.Version -PublicConfiguration $PublicConfiguration `| Add-AzureEndpoint -Name "web" -LocalPort 8080 -PublicPort 80 -Protocol tcp
New-AzureVM -ServiceName $CloudServiceName -Location $VmLocation -VMs $VmConfig -Verbose -WaitForBoot
39
パラメーター等(ベタ書きの場合)
準備
仮想マシンの構成
Dockerの構成用
仮想マシンの作成
Dockerの設定
デモ用のべた書きなのでこういうことはしないこと
Chef Extension• Chef Clientのインストール・構成を行う
• Windows/Linux(各ディストリビューション用)にExtensionが存在– Set-AzureVMChefExtension -Windows または -Linux
– azure vm extension で指定
• Client.rbと検証用PEMファイル、実行するRun Listを指定する
41
Chef Server
仮想マシン
Chef Extension
Chef Client
適用
Client.rb
cookbook(Pull)
Puppet Extension
42
• PuppetのAgentを利用
• Windows: ExtensionでPuppet Masterを指定
• Linux: Custom Script ExtensionでPuppet Agentの構成
仮想マシン
Puppet Extension
Puppet Master
manifest(Pull)
Puppet Agent
適用
構成
PowerShell DSC Extension
43
PowerShell DSCExtension
仮想マシン
BlobストレージConfiguration
ファイル
LCM
適用
Push
• あらかじめConfigurationファイルをBlobに置いておく
– 実際は使用するResourceなども含めた固めたZipファイル
• Extensionで指定すればPushで適用
• 他の要件の場合はCustom Script Extensionで対応
PowerShell DSC Extension
• 対象OS:Windows Server 2012 / Windows Server 2012 R2
• Windows Management Framework 5.0 Preview Release November 2014を使用
44
Sample #1$PublishSettingsFile = ".¥your.publishsettings"
$SubscriptionName = "your subscription name"
$StorageAccountName = "storage account name"
$InstanceName = "GoAzureSrv01"
$CloudServiceName = "GoAzureSrv01"
$AdminAccountName = "azureuser"
$AdminAccountPassword = "password"
$PuppetMasterFqdn = "buchipm.cloudapp.net"
$VmLocation = "Japan West"
Import-AzurePublishSettingsFile $PublishSettingsFile
Select-AzureSubscription -SubscriptionName $SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName
$OSImage = (Get-AzureVMImage | Where { $_.ImageFamily -eq "Windows Server 2012 R2 Datacenter" } | sort PublishedDate -Descending| Select-Object -First 1)
$ImageName = $OSImage.ImageName
$VmConfig = New-AzureVMConfig -Name $InstanceName -ImageName $ImageName -InstanceSize "Basic_A1" -Verbose `
| Add-AzureProvisioningConfig -Windows -AdminUsername $AdminAccountName -Password $AdminAccountPassword -Verbose `
| Set-AzureVMBGInfoExtension -Verbose `
| Set-AzureVMPuppetExtension -Verbose -PuppetMasterServer $PuppetMasterFqdn
New-AzureVM -ServiceName $CloudServiceName -Location $VmLocation -VMs $VmConfig -Verbose -WaitForBoot
45
準備
仮想マシンの構成
仮想マシンの作成
Puppetの構成(Puppet Masterの指定)
パラメーター等(ベタ書きの場合)
デモ用のべた書きなのでこういうことはしないこと
Sample #2$PublishSettingsFile = ".¥your.publishsettings"
$SubscriptionName = "your subscription name"
$StorageAccountName = "storage account name"
$InstanceName = "GoAzureSrv02"
$CloudServiceName = "GoAzureSrv02"
$AdminAccountName = "azureuser"
$AdminAccountPassword = "password"
$VmLocation = "Japan West"
Import-AzurePublishSettingsFile $PublishSettingsFile
Select-AzureSubscription -SubscriptionName $SubscriptionName
Set-AzureSubscription -SubscriptionName $SubscriptionName -CurrentStorageAccountName $StorageAccountName
$OSImage = (Get-AzureVMImage | Where { $_.ImageFamily -eq "Windows Server 2012 R2 Datacenter" } | sort PublishedDate -Descending | Select-Object -First 1)
$ImageName = $OSImage.ImageName
$VmConfig = New-AzureVMConfig -Name $InstanceName -ImageName $ImageName -InstanceSize "Basic_A1" -Verbose `
| Add-AzureProvisioningConfig -Windows -AdminUsername $AdminAccountName -Password $AdminAccountPassword -Verbose `
| Set-AzureVMBGInfoExtension -Verbose `
| Set-AzureVMDscExtension -ConfigurationArchive "goazuredsc.ps1.zip" -ConfigurationName "WebServerInstall" -Verbose -ContainerName "dsc" -Force `
| Add-AzureEndpoint -Name "web" -LocalPort 8080 -PublicPort 80 -Protocol tcp
New-AzureVM -ServiceName $CloudServiceName -Location $VmLocation -VMs $VmConfig -Verbose -WaitForBoot
47
パラメーター等(ベタ書きの場合)
準備
仮想マシンの構成
仮想マシンの作成
PowerShell DSCの構成(Configurationの指定)
デモ用のべた書きなのでこういうことはしないこと
Sample #2 Configuration
48
Configuration WebServerInstall
{Import-DscResource -Module xWebAdministration, xNetworking$progressPreference = 'silentlyContinue'
Invoke-WebRequest -Urihttp://goazure.blob.core.windows.net/dsc/Web.zip -OutFileD:¥web.zip
Node $AllNodes.NodeName{
LocalConfigurationManager{
ConfigurationMode = "ApplyAndAutoCorrect"RebootNodeIfNeeded = $true
}
WindowsFeature InstalledIIS{
Name = "Web-Server"Ensure = "Present"IncludeAllSubFeature = $true
}Windowsfeature InstalledAspNet45{
Name = "Web-Asp-Net45"Ensure = "Present"
}xWebsite TestWebSite{
Name = "TestWebSite"PhysicalPath = "C:¥approot"State = "Started"
BindingInfo = MSFT_xWebBindingInformation{
Protocol = "HTTP"Port = 8080
}Ensure = "Present"DependsOn = "[Archive]AppFiles"
}Archive AppFiles{
Ensure = "Present"Path = "D:¥web.zip"Destination = "C:¥approot"DependsOn = "[WindowsFeature]InstalledIIS"
}xFirewall 'Allow HTTP'{
Name = 'Allow HTTP'DisplayName = 'Allow HTTP'DisplayGroup = 'Custom'Ensure = 'Present'Access = 'Allow'State = 'Enabled'Profile = ('Any')Direction = 'InBound'Protocol = 'TCP'LocalPort = '8080'Description = ''
}}
}
ちゃんとリソースにすべきところ
その他• Custom Script Extension
– Windows/Linuxで使えるExtension– CustomScriptExtension と CustomScriptForLinux
• Ansible– 現状はAzure標準サポートではない(手間かければ構成することは可能)
• Octopus Deploy– PowerShell DSCと組み合わせてアプリケーション配布– Extensionはありそうで無い(ドキュメントにはあるが…謎)
• Vagrant, Knife azure (Chef), msopentech/windowsazure (Puppet)– 仮想マシンの立ち上げ部分からサポート
• パッケージマネージャ– OneGet、Web Platform InstallerやChocolateyなど– Linuxはディストリ付属が標準的(yumとか)
• Bootstrapと構成に必要な「何か」だけ設定すれば比較的自由
50
Azure Cloud Servicesの場合
• Windowsのみ対象
• Startup Taskで構成
– PowerShellやBATで構成(=Code)
• 基本的にPaaSのためメリットを潰さないように
• Cloud Servicesを展開するためのCode
51
Azure Websites/Mobile Services
• PaaSなので構成できる要素は極小
• アプリケーションの構成などが主なターゲット– どのようにアプリケーションを展開するか等
– SCMと連携させる? ビルドツールと連携?
• アプリケーションを展開・連携させるためのCode
52
悩ましい点
• 資格情報の管理– どのようにコードと切り離すか
– 権限は限定的にしたい(RBACなど)
– Azure Key Vault [Public Preview]
• テスト– コードが正しく動作するか = インフラが正しい
状態か
– テストの自動化とテスト駆動インフラ
54
展開をどうするか
• いわゆるBlue-Green Deploymentなど
• アプリケーションを「いつ」「どうやって」展開するか
– 利用環境や粒度、ツール、頻度(ライフサイクル)などで考慮
– インフラのサイクルとアプリケーションのサイクルを分けるのか揃えるのか
55
まとめ
• できるところからコード化しよう– メンテナンス重要! 資産を負債にしない!– 版管理は大事(GitなどのSCMで集約)
• コード化しシステムを織り成すのは文化– 文化を熟成しよう
• 真似から始めよう• よそはよそ、うちはうち、目的に合った文化に
– 枝葉はプラットフォーム固有• Azure固有の部分と全体像をうまく取り扱おう
56
Appendix• CLI
– Azure PowerShell
• http://azure.microsoft.com/ja-jp/documentation/articles/install-configure-powershell/
– Azure xplat cli
• http://azure.microsoft.com/ja-jp/documentation/articles/xplat-cli/
• Azure Management REST API– http://msdn.microsoft.com/ja-jp/library/azure/ee460799.aspx
• TechNet – Azure Automation Script resources– http://goo.gl/Fhu8dY
• Azure VM Extensions and Features– http://msdn.microsoft.com/en-us/library/azure/dn606311.aspx
• Azure Key Vault– http://azure.microsoft.com/en-us/services/key-vault/
– http://blogs.technet.com/b/kv/archive/2015/01/09/azure-key-vault-step-by-step.aspx
58
top related