Azure Resource Manager

Azure Resource Managerって何ですか? というのをいつも通り適当に書いておきたいと思います。

適当は嫌じゃ、という方は //build/ 2014 と TechEd 2014 NA のセッションとかを見たほうが早いかもしれません。

Azure Resource Manager って何ですか?

Azure上での「リソース」という概念を管理するための仕組み、という感じです(字面のまんま)。

目的としては、アプリケーションライフサイクルのコンテナーの提供、開発・構成のための宣言型ソリューション、一貫した管理レイヤーを提供、といったところでしょうか。

Azure内部に持っている(利用者の)リソースをあれこれいじることができます。今のところはAzure PowerShellで。あと新しいプレビューポータルでは意識せずにリソースがちりばめられていて、実はAzure Resource Managerを使ってるわけです。(明確にこれがResource Managerだ!という風ではない)

image
(TechEdのスライドより)

ところで仕組みとしてはAzureのプレビューポータルが出たとき(//build/ 2014)に組み込まれた感じです。既存のポータルでも少しは表面に出てきていますが、ほとんど意識しないと思います。(現行ポータルサイトはある意味リソース中心なのでややこしいですが)

※プレビューポータルについては過去のポストとか、Build Insiderの記事を参照ください。

何が嬉しいの?

Webサイトやらの設定が単体でなくシステム全体として管理できます。(普通WebサイトだけじゃなくてDBとかキャッシュとかその他細かい設定も含めてシステムとして機能しますよね?)

それって普通のPowerShellでもできるじゃない、ということですがそれは機能的にできますが宣言的ではないですよね。ResourceManagerでは各リソースの関係性なども含めて定義(JSON形式)できるので、このシステムはこの構成でというのが明確に定義できます。後で出てきますが、Azure Templatesは同じ仕組みを使ってギャラリーとして機能させている感じです。(例えばWordPressを選べばDB含めて構成されますよね)

もちろん展開時に嬉しいだけでなく管理する際も一つのシステムに紐づくリソースを纏めて参照したり、モニタリングしたりできるので(このあたりはもうちょっとドキュメントなりAPIが欲しいけど今はプレビューポータルで我慢)アプリケーションのライフサイクルを管理!というのもなんとなく、わかってもらえるかもしれません。

何が嬉しくないの?

まだまだ対応してるリソースが少ないのと、定義をいじるための手段が乏しいANDドキュメントが少ないところでしょうか。リソース用のJSONはスキーマが用意されているので、Visual Studio 2013 Update2なんかを使えばだいぶ楽ですが。

これからの発展性に期待、というところでしょうか。

Azure Resource Managerの使い方

意識せずに使う分にはプレビューポータル使えばOKです。意識してメンテしたり、中を見たい場合はAzure PowerShell (Ver0.8.0以上)を使います。

使う場合は最初にSwitch-AzureMode でResource Managerに切り替えます。

Switch-AzureMode -Name AzureResourceManager

戻す場合はAzureServiceManagementにします。

Switch-AzureMode -Name AzureServiceManagement

あと、Azureにアクセスするので、最初にAdd-AzureAccountなどで認証しておきましょう。

 

Resource (リソース)

リソースはまぁそのまんま資源的な意味合いですが、Azure上で現状扱えるリソースとしてはWebサイトやSQL Database(ServerとDB)のほかにも、オートスケールの設定やWebテスト、証明書、アラートのルールなどが定義されています。

以下抜粋。(Get-AzureLocationで取得)

Name LocationsString
ResourceGroup East Asia, South East Asia, East US, West US, North Central US, South Central US, Central US, North Europe, West Europe
Microsoft.ApiManagement/service North Central US, East US, West US, North Europe, West Europe, East Asia
Microsoft.Batch/batchAccounts West US, East US, East US 2, North Central US, South Central US, Central US, West Europe, North Europe, East Asia, Southeast Asia, Japan West, Japan East, Brazil South
Microsoft.BizTalkServices/BizTalk East US, West US, North Europe, West Europe, Southeast Asia, East Asia, North Central US, Japan West, Japan East, South Central US
Microsoft.Cache/Redis North Central US, South Central US, West Europe, North Europe
Microsoft.ClassicStorage/storageAccounts East Asia, Southeast Asia, East US, East US 2, West US, North Central US, South Central US, Central US, North Europe, West Europe, Japan East, Japan West, Brazil South
Microsoft.Insights/alertrules East US, West US
Microsoft.Insights/autoscalesettings East US, West US
Microsoft.Insights/components Central US
Microsoft.Insights/webtests Central US
Microsoft.Sql/servers Brazil South, Central US, East Asia, East US, East US 2, Japan East, Japan West, North Central US, North Europe, South Central US, Southeast Asia, West Europe, West US
Microsoft.Sql/servers/databases Brazil South, Central US, East Asia, East US, East US 2, Japan East, Japan West, North Central US, North Europe, South Central US, Southeast Asia, West Europe, West US
microsoft.visualstudio/account North Central US
microsoft.visualstudio/account/project North Central US
Microsoft.Web/certificates Brazil South, East Asia, East US, Japan East, Japan West, North Central US, North Europe, West Europe, West US
Microsoft.Web/serverFarms Brazil South, East Asia, East US, Japan East, Japan West, North Central US, North Europe, West Europe, West US
Microsoft.Web/sites Brazil South, East Asia, East US, Japan East, Japan West, North Central US, North Europe, West Europe, West US
successbricks.cleardb/databases East Asia, East US, Japan East, Japan West, North Central US, North Europe, Southeast Asia, West Europe, West US
Microsoft.Resources/resourceGroups East Asia, South East Asia, East US, West US, North Central US, South Central US, Central US, North Europe, West Europe

それぞれのリソースには親子関係なども設定できるようになっています。例えばSQL Databaseのデータベースの親はサーバーとか、そういうのです。

Get-AzureResourceコマンドレットを使えば現在所有しているリソースの一覧や、特定のリソースの詳細を見ることができます。

引数何もなしで実行した際の結果を一部抜粋すると

Name              : sampledb
ResourceGroupName : Buchizo2ndResourceGroup
ResourceType      : Microsoft.Sql/servers/databases
Location          : japanwest
ParentResource    : servers/buchi2nd

みたいになります。sampledbという名前でSQL Databaseのデータベースというのがわかりますね。

このリソースの詳細を見る場合はGet-AzureResourceコマンドレットに名前とリソースグループ名、タイプ、親リソースなどを指定して実行します。(各引数に渡す値は先ほどの結果から持ってくるといいでしょう)

Get-AzureResource -ResourceType "Microsoft.Sql/servers/databases" -Name sampledb -ApiVersion 2014-04-01 -ResourceGroupName Buchizo2ndResourceGroup -ParentResource "servers/buchi2nd"

結果はこんな感じ。

Name              : sampledb
ResourceGroupName : Buchizo2ndResourceGroup
ResourceType      : Microsoft.Sql/servers/databases
ParentResource    : servers/buchi2nd
Location          : Japan West
Properties        : {
                      "databaseId": "f2becb28-xxxx-xxxx-xxxx-efe9cef3650c",
                      "edition": "Web",
                      "status": "Online",
                      "serviceLevelObjective": "Shared",
                      "collation": "SQL_Latin1_General_CP1_CI_AS",
                      "maxSizeBytes": "1073741824",
                      "creationDate": "2014-05-16T15:54:08.147Z"
                    }

設定値などの詳細はPropertiesにJSON形式で含まれてるのがわかりますね。他にも例えばサーバーエラーを見るアラートのルールなどは

Name              : ServerErrors buchi2nd
ResourceGroupName : Buchizo2ndResourceGroup
ResourceType      : microsoft.insights/alertrules
ParentResource    :
Location          : East US
Properties        : {
                      "name": "ServerErrors buchi2nd",
                      "description": "buchi2nd has some server errors, status code 5xx.
                    ",
                      "isEnabled": true,
                      "condition": {
                        "odata.type": "Microsoft.Azure.Management.Insights.Models.Thres
                    holdRuleCondition",
                        "dataSource": {
                          "odata.type": "Microsoft.Azure.Management.Insights.Models.Rul
                    eMetricDataSource",
                          "resourceUri": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxx
                    xxxxx/resourcegroups/Buchizo2ndResourceGroup/providers/Microsoft.W
                    eb/sites/buchi2nd",
                          "metricName": "Http5xx"
                        },
                        "windowSize": "PT5M"
                      },
                      "action": {
                        "odata.type": "Microsoft.Azure.Management.Insights.Models.RuleE
                    mailAction",
                        "customEmails": []
                      },
                      "lastUpdatedTime": "2014-05-16T17:14:56.6319783Z",
                      "provisioningState": "Succeeded"
                    }

みたいになります。管理ポータル上と同じですね。

image

とまぁこんな感じでプレビューポータル上で見ることができるパーツやらの設定はだいたいリソースになっているわけです。(なので現状足らないリソースは管理できない)

※ちなみにそれぞれのリソースにどんな機能があるか、情報が提供されるか等はリソースタイプ次第でよくわかりません。

Resource Group

次にリソースグループですが、これはそのまんまリソースを論理的に束ねたグループです。論理的なのでロケーションなどは関係ありません。現行ポータルのリソースのリンクと違って、1つのWebサイトに紐づく、といったようなものでもないので必要なリソースを纏めて管理することができます。

image

別にWebサイトは1つとかの制限は無いので、フロントエンド用とバックエンド用を纏めてみたりとかできます。

あ、プレビューポータルであれこれWebサイトやらなにやら作る際はだいたいリソースグループを指定する欄があって、既定のまま意識せずにぽんぽんと作ってるとリソースグループが乱立されるので注意ください。

※現行ポータルで作成した場合なども含む

通常はシステムに必要な一連のものが含まれるので、リソースグループのライフサイクルがアプリケーションのライフサイクルとも言えますね。というわけでリソースグループを如何に上手に使いこなすかが肝かと思います。

Azure Templates

さてアプリケーションを展開したりする際、DBやらまとめて作ることも多いですよね。Azure Resource ManagerではAzure TemplatesとしてそのあたりをJSON形式で定義し、サイト名など必要なパラメーターを受け取り、自動的に作成することができます。

実際に使われている例としてはWebサイトのギャラリーなどが当てはまります。

image

WordPressなんかはClearDB(MySQL)を必要として一緒に作成してくれますよね。その際はサイト名など最低限の入力だけで済みます。Get-AzureResourceGroupGalleryTemplate コマンドレットを使うと、実際にギャラリーに表示されているものと同じものが表示されます。

以下抜粋。

SourceTreeSolutionsLLC                      SourceTreeSolutionsLLC.mojoPortal.0.1.0-...
SourceTreeSolutionsLLC                      SourceTreeSolutionsLLC.mojoPortal.0.2.0-...
StandingCloudInc                            StandingCloudInc.OpenXpackagedbyStanding...
StandingCloudInc                            StandingCloudInc.OpenXpackagedbyStanding...
SuccessBricksInc                            SuccessBricksInc.ClearDBMySQLDatabase.0....
TechInfoSystems                             TechInfoSystems.GalleryServerPro.0.1.0-p...
TechInfoSystems                             TechInfoSystems.GalleryServerPro.0.2.0-p...
umbracoorg                                  umbracoorg.UmbracoCMS.0.1.0-preview
umbracoorg                                  umbracoorg.UmbracoCMS.0.2.0-preview
VirtoCommerce                               VirtoCommerce.VirtoCommerce.0.1.0-preview
VirtoCommerce                               VirtoCommerce.VirtoCommerce.0.2.0-preview
WikimediaFoundation                         WikimediaFoundation.MediaWiki.0.1.0-preview
WikimediaFoundation                         WikimediaFoundation.MediaWiki.0.2.0-preview
WordPress                                   WordPress.WordPress.0.1.0-preview
WordPress                                   WordPress.WordPress.0.2.0-preview
WordPress                                   WordPress.WordPressJapanese.0.1.0-preview
WordPress                                   WordPress.WordPressJapanese.0.2.0-preview

これらがAzure Templatesとして定義され、公開されているものになります。では実際に中身を見てみましょう。テンプレートはSave-AzureResourceGroupGalleryTemplateコマンドレットで保存することができます。

保存したものをざっと見るとこんな感じです。

image

$schema でスキーマを定義してるので、Visual Studio 2013 Update2ならインテリセンスもききます。便利!

スキーマはこんな感じですね。

image

作成時に必要となるパラメーターは「parameters」として定義されてます。例の場合だとsiteNameやhostingPlanName、siteLocationなどですね。

実際に画面を見ると同じようなのが入力項目で表示されます。

image

実際にどのようなリソースを作成するかは「resources」で定義していきます。依存関係の指定なども可能ですね。このあたりはJSONよく見ればなんとなくわかると思います。

さて自前で用意したAzure Templatesを使うにはNew-AzureResourceGroupコマンドレットのTemplateFile引数で自前のJSONファイルなテンプレートを渡します。(テンプレートに使うパラメーターはJSON形式で記述したファイルをTemplateParameterFileコマンドレットで渡すこともできます)

また、実際に展開する前にTest-AzureResourceGroupTemplateコマンドレットでテストすることもできます。

Test-AzureResourceGroupTemplate -ResourceGroupName Buchizo2ndResourceGroup -TemplateFile .\MyTemplate.json

cmdlet Test-AzureResourceGroupTemplate at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
siteName: buchitestsite03
hostingPlanName: Free
siteLocation: Japan East

※テンプレートにエラーがなければ何も出力されずに終わります。(テストの際は既に存在するリソースグループ名を指定しないとダメな気がしますが)

実際にデプロイするにはNew-AzureResourceGroupコマンドレットを使って以下のようにします。

New-AzureResourceGroup -ResourceGroupName TestResourceGroup2 -TemplateFile .\MyTemplate.json

cmdlet New-AzureResourceGroup at command pipeline position 1
Supply values for the following parameters:
(Type !? for Help.)
Location: East Asia
siteName: buchitestrm02
hostingPlanName: buchitestrm02Plan
siteLocation: East Asia


ResourceGroupName : TestResourceGroup2
Location          : eastasia
ProvisioningState : Succeeded
Resources         :
                    Name                                  Type
                             Location
                    ====================================  =============================
                    =======  =========
                    CPUHigh buchitestrm02Plan             microsoft.insights/alertrules
                             eastus
                    ForbiddenRequests buchitestrm02       microsoft.insights/alertrules
                             eastus
                    LongHttpQueue buchitestrm02Plan       microsoft.insights/alertrules
                             eastus
                    ServerErrors buchitestrm02            microsoft.insights/alertrules
                             eastus
                    buchitestrm02Plan-TestResourceGroup2  microsoft.insights/autoscales
                    ettings  eastus
                    buchitestrm02                         microsoft.insights/components
                             centralus
                    buchitestrm02Plan                     Microsoft.Web/serverFarms
                             eastasia
                    buchitestrm02                         Microsoft.Web/sites
                             eastasia

無事できました。ポータル上でみてもできたことがわかります。

image

とまぁこんな感じ。

 

まとめ

インフラ的なところはまだまだ無いので今後に期待。でるかなぁ?この仕組みでインフラもってなるともう一段何か必要な気がする。OSの上という意味で。あとAzure Pack的に汎用的になると面白そうですね。

アプリケーションとしては管理の視点が変わってきて面白いかと思います。これがモダンというやつかー。

ところでde:codeでこのあたりの話はでるのだろうか。。

参考

コメントを残す