Infrastructure as Code for
Azure
GoAzure 2015 / 2015.01.16
JAZUG 青木 賢太郎
JAZUG 亀渕 景司
Ver 1.3
Agenda
• Infrastructure as Code概論
• Azureでの基本
• システム全体
• インスタンス単位
• まとめ
2
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
大事なお知らせ
5
• このセッションは 2015/01/16 時点の情報を
基にしています
• 最新情報はWebで❕
こんな経験ありませんか?
• 手順書見ながらインストール
– 手順書が古い / どれが最新か分からない
– 行間を読まないといけない(漏れ・ミス)
• 人力チェック!
• 毎回何か違う…
6
どうすればいいの
• 自動化するといいよね
• 誰が何度やっても同じ結果にしよう
7
• プログラムのようにコーディングして
• コンピューターに実行・チェックさせればいい
• Infrastructure as Code
Goal
• Azureにおける Infrastructure as
Codeを知る
• Azureのインフラをコードで
制御する術を知る
8
最初に
• Infrastructureって?
• Infrastructure as Codeって?
• Immutable?冪等性?
9
Infrastructureって?
• アプリケーションを動かすための基盤
(※このセッションでの狭義)
• ハードウェア、ネットワーク、OS、ミドルウェア…
10
OS Middleware Application
Infrastructure
Infrastructure as Code
• ハードウェア・ネットワークなどプラットフォームの仮
想化により、ソフトウェア的に定義できる
= コードのようにインフラを定義できる
11
Immutable Infrastructure /
Disposable Components
• Immutable (不変の)
• Disposable (使い捨てな)
• Disposable は重要
– 継続的インテグレーションや継続的改善がしやすい
– 気軽に破棄できないと展開やライフサイクルに影響
– 永続化されるデータを外部へ(ログなど)
12
冪等性(べき等性)
• 冪等:ある操作を1度行っても複数回行っ
ても同じ結果(効果)になること
• PowerShell DSCなど多くの宣言的な構成
ツールは冪等性が担保されている
– ⇒ 何度実行しても同じ構成になることを保証
13
手続きと宣言
• 手続き的
– 逐次処理を記述
• 宣言的
– どのようにしたいかを記述
– ChefのレシピやPowerShell DSCの
Configurationなど
14
システムのライフサイクル
15
• 粒度の差はあれど大筋
は変わらない
• どうやって展開・運用
する?
• 何を使う?
• スパンは?
開発
展開運用
今日の主題
AZUREでの基本
16
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
AzureManagementRESTAPI
Azure VM Extension
Kubernetes
Orchestration
Configuration
Bootstrapping
システム全体
21
Orchestration
• 複数ロール・台数のサーバーを自動的に構成・管理
• 機能・対象範囲などソリューションによって様々
22
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
デモ用のべた書きなのでこういうことはしないこと
実行結果
26
Azure Automation
• Windows PowerShell Workflow構文で
記述されたRunbookをスケジュールに
従って実行できる
• 定型処理などAzure上でホスト・実行
27
Runbook
• ギャラリーやTechNetに多数のサンプル
28
その他のツールなど
• 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やAzure
PowerShellなどで構成
• ツールや目的に合った粒度と線引きを
30
インスタンス単位
31
コンテナと構成ツール
• コンテナ
– Dockerなどのコンテナ化技術を使った構成と
アプリケーション配布
• 構成ツール
– Azure標準イメージ(+カスタムイメージ)に
仮想マシン拡張(VM Extension)を使用した
構成
• 標準以外も使うことは可能ですが割愛
32
Application
コンテナと構成ツール
33
Azure VM
OS (CoreOS/Ubuntu)
コンテナ コンテナ
Azure VM
OS (Windows/Linux)
VM Extensions
Chef Extension
Puppet 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/aspnet
RUN apt-get -qq update && apt-get -qqy install git
RUN mkdir /app
WORKDIR /app
RUN git clone https://github.com/buchizo/goazure.git
WORKDIR /app/goazure
RUN kpm restore
EXPOSE 5004
ENTRYPOINT ["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 $PublishSettingsFile
Select-AzureSubscription -SubscriptionName $SubscriptionName
Set-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": "sh
dockerbuild.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の設定
デモ用のべた書きなのでこういうことはしないこと
Docker on Azure 実行例
40
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 DSC
Extension
仮想マシン
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 #1 実行例
46
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 -Uri
http://goazure.blob.core.windows.net/dsc/Web.zip -OutFile
D:¥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 = ''
}
}
}
ちゃんとリソースにすべきところ
Sample #2 実行例
49
その他
• 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
まとめ
53
悩ましい点
• 資格情報の管理
– どのようにコードと切り離すか
– 権限は限定的にしたい(RBACなど)
– Azure Key Vault [Public Preview]
• テスト
– コードが正しく動作するか = インフラが正しい
状態か
– テストの自動化とテスト駆動インフラ
54
展開をどうするか
• いわゆるBlue-Green Deploymentなど
• アプリケーションを「いつ」「どうやって」
展開するか
– 利用環境や粒度、ツール、頻度(ライフサイクル)
などで考慮
– インフラのサイクルとアプリケーションのサイクル
を分けるのか揃えるのか
55
まとめ
• できるところからコード化しよう
– メンテナンス重要! 資産を負債にしない!
– 版管理は大事(GitなどのSCMで集約)
• コード化しシステムを織り成すのは文化
– 文化を熟成しよう
• 真似から始めよう
• よそはよそ、うちはうち、目的に合った文化に
– 枝葉はプラットフォーム固有
• Azure固有の部分と全体像をうまく取り扱おう
56
57
• このセッションは
2015/01/16 時点の情報を
基にしています
• 最新情報はWebで❕
※Azureは日々進化するのでこの時点から
情報が劣化していきます…
質
問
シ
テ
ネ
!
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

Infrastructure as code for azure

  • 1.
    Infrastructure as Codefor Azure GoAzure 2015 / 2015.01.16 JAZUG 青木 賢太郎 JAZUG 亀渕 景司 Ver 1.3
  • 2.
    Agenda • Infrastructure asCode概論 • Azureでの基本 • システム全体 • インスタンス単位 • まとめ 2
  • 3.
    Speaker's 3 { "objectType": "User", “displayName”: “青木賢太郎", "mail": "aoki-kentaro@mki.co.jp", “company”: “三井情報株式会社", "onPremisesSecurityIdentifier": null, "odata.type": "Microsoft.DirectoryServices.User" } MKI
  • 4.
    Speaker's { "name" : "KeijiKamebuchi", "corporation" : "pnop Inc.", "mail" : "kamebuchi@pnop.co.jp", "web" : "http://buchizo.wordpress.com/", "twitter" : "@kosmosebi", } 4 buchizo@kosmosebi Senior Fellow
  • 5.
    大事なお知らせ 5 • このセッションは 2015/01/16時点の情報を 基にしています • 最新情報はWebで❕
  • 6.
    こんな経験ありませんか? • 手順書見ながらインストール – 手順書が古い/ どれが最新か分からない – 行間を読まないといけない(漏れ・ミス) • 人力チェック! • 毎回何か違う… 6
  • 7.
    どうすればいいの • 自動化するといいよね • 誰が何度やっても同じ結果にしよう 7 •プログラムのようにコーディングして • コンピューターに実行・チェックさせればいい • Infrastructure as Code
  • 8.
    Goal • Azureにおける Infrastructureas Codeを知る • Azureのインフラをコードで 制御する術を知る 8
  • 9.
    最初に • Infrastructureって? • Infrastructureas Codeって? • Immutable?冪等性? 9
  • 10.
  • 11.
    Infrastructure as Code •ハードウェア・ネットワークなどプラットフォームの仮 想化により、ソフトウェア的に定義できる = コードのようにインフラを定義できる 11
  • 12.
    Immutable Infrastructure / DisposableComponents • Immutable (不変の) • Disposable (使い捨てな) • Disposable は重要 – 継続的インテグレーションや継続的改善がしやすい – 気軽に破棄できないと展開やライフサイクルに影響 – 永続化されるデータを外部へ(ログなど) 12
  • 13.
    冪等性(べき等性) • 冪等:ある操作を1度行っても複数回行っ ても同じ結果(効果)になること • PowerShellDSCなど多くの宣言的な構成 ツールは冪等性が担保されている – ⇒ 何度実行しても同じ構成になることを保証 13
  • 14.
    手続きと宣言 • 手続き的 – 逐次処理を記述 •宣言的 – どのようにしたいかを記述 – ChefのレシピやPowerShell DSCの Configurationなど 14
  • 15.
  • 16.
  • 17.
    Command Line Interface •Azure PowerShell – PowerShell Cmdlets – Windows PowerShell 3.0 / .NET Framework 4.5 が必要 • Azure クロスプラットフォーム CLI – Azure xplat CLI – Node.js が必要 17
  • 18.
    使う前に • Add-AzureAccount – 対話ログオン –xplat CLIの場合: azure login • Import-AzurePublishSettingsFile – 証明書を使った資格情報の設定 – xplat CLIの場合: azure account import 18
  • 19.
    その他 • Azure ManagementREST API – 言語非依存 – Azure PowerShellやxplat CLIが利用 – http://msdn.microsoft.com/ja-jp/library/azure/ee460799.aspx 19
  • 20.
    全体像(展開時) 20 システム全体 OS アプリケーション インフラ Azureネイティブ 3rd Party AzureResource Manager Azure Automation Azure PowerShell / xplat CLI AzureManagementRESTAPI Azure VM Extension Kubernetes Orchestration Configuration Bootstrapping
  • 21.
  • 22.
  • 23.
    Azure Resource Manager •Azureのサービスやインスタンスなどをリソースとして 扱うための機能 – 機能単位ではなく論理的なリソースとして纏めて管理できる – 役割ベースの管理(RBAC)やタグ • 使用するリソースを記述したテンプレートを用いて 宣言的にAzure上に構成可能 – テンプレートはJSON形式 23
  • 24.
    利用時の注意点 • 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
  • 25.
    コマンド集 • 利用可能なギャラリーのテンプレート一覧で取得 – 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 デモ用のべた書きなのでこういうことはしないこと
  • 26.
  • 27.
    Azure Automation • WindowsPowerShell Workflow構文で 記述されたRunbookをスケジュールに 従って実行できる • 定型処理などAzure上でホスト・実行 27
  • 28.
  • 29.
    その他のツールなど • SystemCenter 2012R2 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
  • 30.
  • 31.
  • 32.
    コンテナと構成ツール • コンテナ – Dockerなどのコンテナ化技術を使った構成と アプリケーション配布 •構成ツール – Azure標準イメージ(+カスタムイメージ)に 仮想マシン拡張(VM Extension)を使用した 構成 • 標準以外も使うことは可能ですが割愛 32
  • 33.
    Application コンテナと構成ツール 33 Azure VM OS (CoreOS/Ubuntu) コンテナコンテナ Azure VM OS (Windows/Linux) VM Extensions Chef Extension Puppet Extension PowerShell DSC Extension ApplicationApplication VM Extensions Docker Extension ※ Dockerの場合
  • 34.
  • 35.
    Docker • コンテナを実行・配布するための仕組み • Linux/Windows[Preview] • Docker Hub on Azure はまだ… • Azureだと2パターン – Docker Extensionを使ってDocker Engineを インストール – Dockerネイティブなイメージを利用 • Dockerコマンドでコンテナを展開すること でコード化が容易に 35
  • 36.
    仮想マシン or VM Extensions Docker ExtensionDocker Engine Docker on Azure コンテナ Application コンテナ Application コンテナの展開 アプリケーション Dockerfile
  • 37.
    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にすること)
  • 38.
    Docker on Azureスクリプト FROM microsoft/aspnet RUN apt-get -qq update && apt-get -qqy install git RUN mkdir /app WORKDIR /app RUN git clone https://github.com/buchizo/goazure.git WORKDIR /app/goazure RUN kpm restore EXPOSE 5004 ENTRYPOINT ["k", "kestrel"] 38 Dockerfile
  • 39.
    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 $PublishSettingsFile Select-AzureSubscription -SubscriptionName $SubscriptionName Set-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": "sh dockerbuild.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の設定 デモ用のべた書きなのでこういうことはしないこと
  • 40.
    Docker on Azure実行例 40
  • 41.
    Chef Extension • ChefClientのインストール・構成を行う • 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)
  • 42.
    Puppet Extension 42 • PuppetのAgentを利用 •Windows: ExtensionでPuppet Masterを指定 • Linux: Custom Script ExtensionでPuppet Agentの構成 仮想マシン Puppet Extension Puppet Master manifest (Pull) Puppet Agent 適用 構成
  • 43.
    PowerShell DSC Extension 43 PowerShellDSC Extension 仮想マシン Blobストレージ Configuration ファイル LCM 適用 Push • あらかじめConfigurationファイルをBlobに置いておく – 実際は使用するResourceなども含めた固めたZipファイル • Extensionで指定すればPushで適用 • 他の要件の場合はCustom Script Extensionで対応
  • 44.
    PowerShell DSC Extension •対象OS:Windows Server 2012 / Windows Server 2012 R2 • Windows Management Framework 5.0 Preview Release November 2014を使用 44
  • 45.
    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の指定) パラメーター等(ベタ書きの場合) デモ用のべた書きなのでこういうことはしないこと
  • 46.
  • 47.
    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の指定) デモ用のべた書きなのでこういうことはしないこと
  • 48.
    Sample #2 Configuration 48 ConfigurationWebServerInstall { Import-DscResource -Module xWebAdministration, xNetworking $progressPreference = 'silentlyContinue' Invoke-WebRequest -Uri http://goazure.blob.core.windows.net/dsc/Web.zip -OutFile D:¥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 = '' } } } ちゃんとリソースにすべきところ
  • 49.
  • 50.
    その他 • Custom ScriptExtension – 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
  • 51.
    Azure Cloud Servicesの場合 •Windowsのみ対象 • Startup Taskで構成 – PowerShellやBATで構成(=Code) • 基本的にPaaSのためメリットを潰さない ように • Cloud Servicesを展開するためのCode 51
  • 52.
    Azure Websites/Mobile Services •PaaSなので構成できる要素は極小 • アプリケーションの構成などが主な ターゲット – どのようにアプリケーションを展開するか等 – SCMと連携させる? ビルドツールと連携? • アプリケーションを展開・連携させるた めのCode 52
  • 53.
  • 54.
    悩ましい点 • 資格情報の管理 – どのようにコードと切り離すか –権限は限定的にしたい(RBACなど) – Azure Key Vault [Public Preview] • テスト – コードが正しく動作するか = インフラが正しい 状態か – テストの自動化とテスト駆動インフラ 54
  • 55.
    展開をどうするか • いわゆるBlue-Green Deploymentなど •アプリケーションを「いつ」「どうやって」 展開するか – 利用環境や粒度、ツール、頻度(ライフサイクル) などで考慮 – インフラのサイクルとアプリケーションのサイクル を分けるのか揃えるのか 55
  • 56.
    まとめ • できるところからコード化しよう – メンテナンス重要!資産を負債にしない! – 版管理は大事(GitなどのSCMで集約) • コード化しシステムを織り成すのは文化 – 文化を熟成しよう • 真似から始めよう • よそはよそ、うちはうち、目的に合った文化に – 枝葉はプラットフォーム固有 • Azure固有の部分と全体像をうまく取り扱おう 56
  • 57.
    57 • このセッションは 2015/01/16 時点の情報を 基にしています •最新情報はWebで❕ ※Azureは日々進化するのでこの時点から 情報が劣化していきます… 質 問 シ テ ネ !
  • 58.
    Appendix • CLI – AzurePowerShell • 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