58
Infrastructure as Code for Azure GoAzure 2015 / 2015.01.16 JAZUG 青木 賢太郎 JAZUG 亀渕 景司 Ver 1.3

Infrastructure as code for azure

Embed Size (px)

Citation preview

Infrastructure as Code for Azure

GoAzure 2015 / 2015.01.16JAZUG 青木 賢太郎

JAZUG 亀渕 景司Ver 1.3

Agenda

• Infrastructure as Code概論

• Azureでの基本

• システム全体

• インスタンス単位

• まとめ

2

Speaker's

3

{

"objectType": "User",

“displayName”: “青木 賢太郎",

"mail": "[email protected]",

“company”: “三井情報株式会社",

"onPremisesSecurityIdentifier": null,

"odata.type": "Microsoft.DirectoryServices.User"

}

MKI

Speaker's

{

"name" : "Keiji Kamebuchi",

"corporation" : "pnop Inc.",

"mail" : "[email protected]",

"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

Azure

Managem

ent R

EST A

PI

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やAzurePowerShellなどで構成

• ツールや目的に合った粒度と線引きを

30

インスタンス単位

31

コンテナと構成ツール

• コンテナ– 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の設定

デモ用のべた書きなのでこういうことはしないこと

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 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 #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 -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 = ''

}}

}

ちゃんとリソースにすべきところ

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