Azureでポータルを使わずデプロイしてみよう ~ 公式テンプレートをカスタマイズ

前回はすでに用意されていたテンプレートを使ってデプロイを行い、テンプレートの概要やAzureのリソースに関する知識、ツールなどをみました。今回は前回使ったテンプレートをカスタマイズしてみたいと思います。

なお、とても長い記事ですが、画像てんこ盛りだからです。やっていることはさほど難しくないので、最後までどんな感じかだけでもご覧ください。

準備〜VScode

今回は前回のテンプレートをカスタマイズします。そのため、まずは編集するためのツールの準備から始めましょう。JSONを見た時に対応する{}が一発でわかったり、複雑なプロパティをそのままかける人は不要です。

Microsoftが提供しているツールにVisual Studio Codeというものがあります。このツールはOSを問わず無料で使え、今回のResource Templateを編集するための便利機能も提供されております。なかなか秀逸でしたので、是非この機会にお試しください。

https://code.visualstudio.com/

インストールはURLにアクセスして、トップ左側にあるDownloadから取得し行ってください。

インストールが終わったら、Resource Template用のExtentionをインストールしておきましょう。まず、以下のURLにアクセスして、InstallationにあるCopyボタンを押してコマンドをコピーしておきます。

https://marketplace.visualstudio.com/items?itemName=msazurermtools.azurerm-vscode-tools

次にVScodeを立ち上げCtrl+Pを押し、先ほどコピーしたコマンドを貼り付けます。 そのまま待っていると検索が実施され結果が表示されるので、右の雲マークをクリックします。インストールが終わると再起動が促されます(ちょっと待ちます)ので、再起動してください。

準備〜テンプレートを取得

それでは、前回のテンプレートを元に、独自のテンプレートを作成できるようにしましょう。

次のURLにアクセスして表示された内容をコピーてください。

https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-sshkey/azuredeploy.json

次に、VScode起動し新規ファイルを作成して貼り付けてください。この時点ではまだ文字は白いままだと思います。まずは保存しましょう。

適当なパスにazuredeploy.jsonという名前で保存してください。

保存するとカラーハイライトが効いたと思います

カスタマイズする内容を決める

今回は幾つかの箇所をカスタマイズしてみましょう。 利用するテンプレートの仕様の一部は以下の通りです。

  • Linux VM
    • user名はazureuser
    • VMのサイズはA2
    • OSはUbuntu 14.04.4-LTS
  • Network Security Group
    • SSH用にPort22が開いている

カスタマイズとして以下のようにしてみたいと思います。

  • user名は作るタイミングで決める
  • VMのサイズはA0でケチる
  • OSはUbuntu 16.04 LTSにする
  • Port 80も開ける
  • 作るデータセンタを日本西にする

ひとつ目のuser名は前回の記事で書いたとおり、defaultを設定しなければ聞かれるようなので、特に下調べは不要です。VMのサイズはたぶんStandard_A0と書けば良さそうですが、今回は日本西を使うので念のため日本西でA0が使えるか、Standard_A0と書けばよいかを確認しましょう。OSについては、書き方がわからないので調べるのが必要です。これは利用できるイメージの一覧を表示すれば確認できます。Portはまるっと22用の設定をコピーして使いましょう。

ということで、まずはデータセンタとして日本西、そしてA0は使えるかから調べます。 せっかくなので、今回はコマンドだけで頑張ってみます。

コマンドでazureとだけ打つと、使えるコマンドの一覧が表示されます。

横に説明も書いてあるので読んでいくとlocationというのがあるので、これが怪しいです。実行してみると

どうやらlocationの後にlistと加えると良さそうです 。実行してみましょう。

一覧が出てきました。緯度経度まで出てます。名前としては「japanwest」で良いことが確認できました。

次に、VMのリストです。Azureでは各DC毎に使えるVMの種類が異なることがあります。日本西で使えるVMの一覧を見たいと思います。

先ほどの使えるコマンドの一覧表示を使って探すと、azure vmがそれっぽいです。

実行してみると大量のヘルプが表示されます。せっかくなのでよく読んでみてください。試すと面白そうなのが結構あります。読み進めていくと

help: Get all available virtual machine sizes help: vm sizes [options]

というのがありました。azure vm sizesを実行してみます。

エラーになり--locationか--vm-nameが必要よと出ます。ではazure vm sizes --location japanwestを実行します。

Standard_A0がありますね。ということで、VMサイズはこれで確認ができました。

最後にOSイメージです。azure vmのヘルプに以下のようにありました。

一番最初のvm image list-publishersはlocationだけ最後に渡すと実行できそうです。それ以外はpublisherを設定しないと動かない感じなので、まずは先頭から実行してみましょう。

どちゃーっと表示されました。AzureのMarketPlaceでは多くのベンダーの方々がイメージを提供しており、その作成者の一覧を取得したからです。 今回はUbuntuなのでCanonicalを探してみましょう。

小文字でgrepしたところ見つからず一瞬焦りましたが、大文字にしたら見つかりました。 ということで、publisherはCanonicalです。

では、次にCanonicalさんが提供しているイメージの一覧を取得しましょう。azure vm image list japanwest Canonicalを実行します。

素敵です。素敵過ぎます。Azureの内部ではパッチがあたっているリビジョン毎にかなり幅広く保持しています。通常ポータルではそれぞれの最新版が選ばれるようになっているのですが、このように指定すればかなり細かくイメージを取得することができます。

イメージの一覧のトップを見ると、

  • Publisher
  • Offer
  • Sku
  • OS
  • Version
  • Location
  • Urn

という 項目があります。これは、後でイメージを指定するときに必要になってくるので、イメージを見つけたら全部メモしておきましょう。

ちなみに、Ubuntu_Snappy_Core_Dockerっていうのがありますね。。。これなんだろう(含み笑)

今回は16.04の中でも最も新しそうなやつを選んでみましょう。

 data:    Canonical  UbuntuServer               16.04.0-DAILY-LTS  Linux  16.04.201605030  japanwest  Canonical:UbuntuServer:16.04.0-DAILY-LTS:16.04.201605030

これですね。テンプレートではOSの部分に14.04.4-LTSと書かれてました。これはskuという部分に当たるので、このイメージですと16.04.0-DAILY-LTSで良さそうです。

以上でカスタマイズに関する情報の調査が終わりました。まとめると

  • japanwest
  • Standard_A0
  • 16.04.0-DAILY-LTS

これを埋め込めば思い通りのものができそうです。

カスタマイズしてみる

それでは、実際に埋め込んでみましょう。

VSCodeでazuredeploy.jsonとして保存した前回のテンプレートを見てみます。
まず、parametersの変更から行いましょう。

実施する内容としては

  • adminUserNameのdefaultValueを削除する
  • vmSizeのdefaultValueをStandard_A0にする
  • ubuntuOSVersionのdefaultValueを16.04.0-DAILY-LTSにする
    • 念の為、allowdValuesにも追記しておく

になります。

次に、NSGの設定です。

90行目の最後が[で終わっており、91行目が{で始まっています。JSONでは[は配列の始まりを意味し、{はオブジェクト値(XX:YYというやつ)の始まりを意味します。つまり、securityRulesという部分は"securityRules": [ { XX:AA}, { YY:BB} ]となることを期待しているので、この構造を守りながら追記しましょう。 ということで、こんな感じ。

sshのところをhttp、22を80にしました。あと、priorityは数が重複しているのが許されなさそうなので、なんとなく234にしました。カラーハイライトも赤くなったりしていないので、これで合っていると思います。

それでは、別名で保存しておきましょう。(azuredeploy2.jsonにしました) ちゃんと思い通りの変更になっているのかdiffで確認しましょうね。

ちょっと長いですが、掲載しておきます。

$  diff azuredeploy.json azuredeploy2.json
diff --git a/azuredeploy.json b/azuredeploy2.json  
index 2a614b8..e25ee08 100644  
--- a/azuredeploy.json
+++ b/azuredeploy2.json
@@ -4,7 +4,6 @@
   "parameters": {
     "adminUserName": {
       "type": "string",
-      "defaultValue": "azureuser",
       "metadata": {
         "description": "User name for the Virtual Machine."
       }
@@ -24,7 +23,7 @@
     },
     "vmSize": {
       "type": "string",
-      "defaultValue": "Standard_A2",
+      "defaultValue": "Standard_A0",
       "metadata": {
         "description": "Size of the VM"
       }
@@ -38,11 +37,12 @@
     },
     "ubuntuOSVersion": {
       "type": "string",
-      "defaultValue": "14.04.4-LTS",
+      "defaultValue": "16.04.0-DAILY-LTS",
       "allowedValues": [
         "12.04.5-LTS",
         "14.04.4-LTS",
-        "15.10"
+        "15.10",
+        "16.04.0-DAILY-LTS"
       ],
       "metadata": {
         "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.4-LTS, 15.10."
@@ -101,6 +101,20 @@
               "priority": 123,
               "direction": "Inbound"
             }
+          },
+          {
+              "name": "http_rule",
+              "properties": {
+                "description": "Locks inbound down to http default port 80.",
+                "protocol": "Tcp",
+                "sourcePortRange": "*",
+                "destinationPortRange": "80",
+                "sourceAddressPrefix": "*",
+                "destinationAddressPrefix": "*",
+                "access": "Allow",
+                "priority": 234,
+                "direction": "Inbound"
+              }
           }
         ]
       }

diffを使うと、ちゃんと思い通りに作業できているかを確認できて便利ですな。設定をこのようにプログラムちっくに書ける大きな利点の一つが、こういった従来から使われているツールを活用できることです。ここ重要。

なお、今回は割愛していますがGitなどを用いてバージョン管理もおすすめです。どのような変更をしたか履歴が残りますので、 後々編集するときに助かります。さらに、GithubやBitbucketを使えばチームで編集したりも可能ですし、公開することもできます。(ちなみに、筆者はBitbucket派)

実行してみよう

では、実行してみましょう・・・と、その前に、念には念を入れて、このファイルのフォーマットがそもそも正しいかを試しておきましょう。

Azure リソース マネージャーのテンプレートを使用したリソースのデプロイにて、azure group template validateコマンドでデプロイ前に検証ができるとあります。

azure group templateを実行してみるとヘルプが出ます(この、知りたいものの一段上を実行するというのが意外とポイントです。)

こちらをみると、リソースグループが先に無いとダメなようです。では、西日本にリソースグループを作ってしまいましょう。

azure groupコマンドを実行し、createのオプションもわかりました。では、実行。

リソースグループの名前はcustomizetemplateにしました。場所はjapanwestです。では、ファイルのバリデーションを行ってみましょう。

--template-fileを付けろと怒られました。Helpに書いておいてよ、そういうの。改めて実行。

いかがでしょうか?ちゃんとadminUserの名前とSSHのキーを聞いてきて、最後にOKと返ってきましたね。

それでは、準備完了です。そういえば-hというオプションで、コマンドのオプションを見ることができましたね。実行するコマンドのazure group createを見てみましょう。

azure group create -v -d customizedeploy --template-file ./azuredeploy2.json customizetemplate japanwestと私は実行しました。-dはデプロイ名なのでお好きに。最後から二番目はリソースグループ名です。すでにある場合は作成済みのグループが使われます。場所はjapanwestです。

無事完了しました。 それでは、デプロイがどうなっているか確認しましょう。

Provisioning Stateが成功になってますね。バッチリだったようです。最後にアクセスしてみましょう。

azure network public-ip list リソースグループ名コマンドで振られたIPやFQDN名を調べられます。

はい、バッチリですね。

まとめ

今回は公開されているテンプレートをカスタマイズしてみました。何も無いところから作るのはちょっと大変ですが、今回のように調べながらカスタマイズすれば、かなり色々と調整はできます。構造がわかれば公開されているテンプレートと組み合わせることも可能です。

Azureで公開されているテンプレートですが、以下のURL先にかなりの数があります。

https://github.com/Azure/azure-quickstart-templates

こちらを読み込んでいくと色々なリソースのコントロールが実施できるようになりますので是非ご覧ください。

また今回はポータルを一切使わないで情報を取得するのもやってみました。ここで使っているAzure CLIはnode.jsで作られているため、どのOSでも同じ挙動をしめしてくれます。筆者は終始Ubuntu16.04のデスクトップ、それもCPUはAtomという環境でこの記事を書いています。(こちらの記事にマシンの紹介があります)

非力なマシンでもCLIですと結構作業できるものですし、ポータルよりも早かったりします。Linux使いの方にもAzureがこんなレベルまで使えるということを知っていただけると嬉しく思います。