Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Infrastructure as code for azure

3,992 views

Published on

GoAzure 2015 のセッション資料

Published in: Technology
  • Be the first to comment

Infrastructure as code for azure

  1. 1. Infrastructure as Code for Azure GoAzure 2015 / 2015.01.16 JAZUG 青木 賢太郎 JAZUG 亀渕 景司 Ver 1.3
  2. 2. Agenda • Infrastructure as Code概論 • Azureでの基本 • システム全体 • インスタンス単位 • まとめ 2
  3. 3. Speaker's 3 { "objectType": "User", “displayName”: “青木 賢太郎", "mail": "aoki-kentaro@mki.co.jp", “company”: “三井情報株式会社", "onPremisesSecurityIdentifier": null, "odata.type": "Microsoft.DirectoryServices.User" } MKI
  4. 4. 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. 5. 大事なお知らせ 5 • このセッションは 2015/01/16 時点の情報を 基にしています • 最新情報はWebで❕
  6. 6. こんな経験ありませんか? • 手順書見ながらインストール – 手順書が古い / どれが最新か分からない – 行間を読まないといけない(漏れ・ミス) • 人力チェック! • 毎回何か違う… 6
  7. 7. どうすればいいの • 自動化するといいよね • 誰が何度やっても同じ結果にしよう 7 • プログラムのようにコーディングして • コンピューターに実行・チェックさせればいい • Infrastructure as Code
  8. 8. Goal • Azureにおける Infrastructure as Codeを知る • Azureのインフラをコードで 制御する術を知る 8
  9. 9. 最初に • Infrastructureって? • Infrastructure as Codeって? • Immutable?冪等性? 9
  10. 10. Infrastructureって? • アプリケーションを動かすための基盤 (※このセッションでの狭義) • ハードウェア、ネットワーク、OS、ミドルウェア… 10 OS Middleware Application Infrastructure
  11. 11. Infrastructure as Code • ハードウェア・ネットワークなどプラットフォームの仮 想化により、ソフトウェア的に定義できる = コードのようにインフラを定義できる 11
  12. 12. Immutable Infrastructure / Disposable Components • Immutable (不変の) • Disposable (使い捨てな) • Disposable は重要 – 継続的インテグレーションや継続的改善がしやすい – 気軽に破棄できないと展開やライフサイクルに影響 – 永続化されるデータを外部へ(ログなど) 12
  13. 13. 冪等性(べき等性) • 冪等:ある操作を1度行っても複数回行っ ても同じ結果(効果)になること • PowerShell DSCなど多くの宣言的な構成 ツールは冪等性が担保されている – ⇒ 何度実行しても同じ構成になることを保証 13
  14. 14. 手続きと宣言 • 手続き的 – 逐次処理を記述 • 宣言的 – どのようにしたいかを記述 – ChefのレシピやPowerShell DSCの Configurationなど 14
  15. 15. システムのライフサイクル 15 • 粒度の差はあれど大筋 は変わらない • どうやって展開・運用 する? • 何を使う? • スパンは? 開発 展開運用 今日の主題
  16. 16. AZUREでの基本 16
  17. 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. 18. 使う前に • Add-AzureAccount – 対話ログオン – xplat CLIの場合: azure login • Import-AzurePublishSettingsFile – 証明書を使った資格情報の設定 – xplat CLIの場合: azure account import 18
  19. 19. その他 • Azure Management REST API – 言語非依存 – Azure PowerShellやxplat CLIが利用 – http://msdn.microsoft.com/ja-jp/library/azure/ee460799.aspx 19
  20. 20. 全体像(展開時) 20 システム全体 OS アプリケーション インフラ Azureネイティブ 3rd Party Azure Resource Manager Azure Automation Azure PowerShell / xplat CLI AzureManagementRESTAPI Azure VM Extension Kubernetes Orchestration Configuration Bootstrapping
  21. 21. システム全体 21
  22. 22. Orchestration • 複数ロール・台数のサーバーを自動的に構成・管理 • 機能・対象範囲などソリューションによって様々 22
  23. 23. Azure Resource Manager • Azureのサービスやインスタンスなどをリソースとして 扱うための機能 – 機能単位ではなく論理的なリソースとして纏めて管理できる – 役割ベースの管理(RBAC)やタグ • 使用するリソースを記述したテンプレートを用いて 宣言的にAzure上に構成可能 – テンプレートはJSON形式 23
  24. 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. 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. 26. 実行結果 26
  27. 27. Azure Automation • Windows PowerShell Workflow構文で 記述されたRunbookをスケジュールに 従って実行できる • 定型処理などAzure上でホスト・実行 27
  28. 28. Runbook • ギャラリーやTechNetに多数のサンプル 28
  29. 29. その他のツールなど • 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
  30. 30. 現状 • 仮想ネットワークや他のAzureサービス との連携などまだまだ仕組みとして弱い – ARMで使用できるリソース種別がまだ少ない • Azure Management APIやAzure PowerShellなどで構成 • ツールや目的に合った粒度と線引きを 30
  31. 31. インスタンス単位 31
  32. 32. コンテナと構成ツール • コンテナ – Dockerなどのコンテナ化技術を使った構成と アプリケーション配布 • 構成ツール – Azure標準イメージ(+カスタムイメージ)に 仮想マシン拡張(VM Extension)を使用した 構成 • 標準以外も使うことは可能ですが割愛 32
  33. 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. 34. シーケンス概要 34 仮想マシンのデプロイ 実行環境の準備 (仮想ネットワーク/ストレージなど) Extensionの実行コンテナの配置 OS起動 Orchestration / Bootstrap Configuration
  35. 35. Docker • コンテナを実行・配布するための仕組み • Linux/Windows [Preview] • Docker Hub on Azure はまだ… • Azureだと2パターン – Docker Extensionを使ってDocker Engineを インストール – Dockerネイティブなイメージを利用 • Dockerコマンドでコンテナを展開すること でコード化が容易に 35
  36. 36. 仮想マシン or VM Extensions Docker Extension Docker Engine Docker on Azure コンテナ Application コンテナ Application コンテナの展開 アプリケーション Dockerfile
  37. 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. 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. 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. 40. Docker on Azure 実行例 40
  41. 41. 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)
  42. 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. 43. PowerShell DSC Extension 43 PowerShell DSC Extension 仮想マシン Blobストレージ Configuration ファイル LCM 適用 Push • あらかじめConfigurationファイルをBlobに置いておく – 実際は使用するResourceなども含めた固めたZipファイル • Extensionで指定すればPushで適用 • 他の要件の場合はCustom Script Extensionで対応
  44. 44. PowerShell DSC Extension • 対象OS:Windows Server 2012 / Windows Server 2012 R2 • Windows Management Framework 5.0 Preview Release November 2014を使用 44
  45. 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. 46. Sample #1 実行例 46
  47. 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. 48. 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 = '' } } } ちゃんとリソースにすべきところ
  49. 49. Sample #2 実行例 49
  50. 50. その他 • 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
  51. 51. Azure Cloud Servicesの場合 • Windowsのみ対象 • Startup Taskで構成 – PowerShellやBATで構成(=Code) • 基本的にPaaSのためメリットを潰さない ように • Cloud Servicesを展開するためのCode 51
  52. 52. Azure Websites/Mobile Services • PaaSなので構成できる要素は極小 • アプリケーションの構成などが主な ターゲット – どのようにアプリケーションを展開するか等 – SCMと連携させる? ビルドツールと連携? • アプリケーションを展開・連携させるた めのCode 52
  53. 53. まとめ 53
  54. 54. 悩ましい点 • 資格情報の管理 – どのようにコードと切り離すか – 権限は限定的にしたい(RBACなど) – Azure Key Vault [Public Preview] • テスト – コードが正しく動作するか = インフラが正しい 状態か – テストの自動化とテスト駆動インフラ 54
  55. 55. 展開をどうするか • いわゆるBlue-Green Deploymentなど • アプリケーションを「いつ」「どうやって」 展開するか – 利用環境や粒度、ツール、頻度(ライフサイクル) などで考慮 – インフラのサイクルとアプリケーションのサイクル を分けるのか揃えるのか 55
  56. 56. まとめ • できるところからコード化しよう – メンテナンス重要! 資産を負債にしない! – 版管理は大事(GitなどのSCMで集約) • コード化しシステムを織り成すのは文化 – 文化を熟成しよう • 真似から始めよう • よそはよそ、うちはうち、目的に合った文化に – 枝葉はプラットフォーム固有 • Azure固有の部分と全体像をうまく取り扱おう 56
  57. 57. 57 • このセッションは 2015/01/16 時点の情報を 基にしています • 最新情報はWebで❕ ※Azureは日々進化するのでこの時点から 情報が劣化していきます… 質 問 シ テ ネ !
  58. 58. 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

×