Azure Resource Managerのハンズオン

セミナーの詳細よくわかってなかったのですが、ARMの基本的な体験ができるハンズオンが公開されました。

ハンズオンでは最終的にSQL Databaseを使った複数台で負荷分散する仮想マシン上のWebアプリケーションをテンプレートを使ってデプロイという感じです。
ざっくり図にするとこういう感じです。
image

演習で使うテンプレートなどはこちらにおいてます。

まぁ練習用なのですごくシンプルです。最低限のことしかしてません。
演習ではデプロイの方法を学ぶというか触れてもらう意味合いのほうが強いので、テンプレートをゼロから起こしたりといった内容ではありません。あしからず。。

ARMテンプレートのTipsについて

  • Azure リソース マネージャー テンプレートを設計するためのベスト プラクティス
  • テンプレートに利用できる式や関数
  • テンプレート全般
  • テンプレートリンク
    • templateLinkのほかにもパラメーターや変数もリンクできます。活用しましょう。
    • 公式(?)のQuick Templateなどは多用してますね。まぁストレージとか大きなリソース単位で分けておけば再利用しやすいです。
  • copyとcopyindex()
    • 一部リソースプロパティ(ロードバランサーのinboundNatRulesとか)は使えません
    • inboundNatRulesで使えないということは各インスタンスに直接接続するためのRDPの口を用意するのが難しいということです。この場合だと明示的にVM0用、VM1用とべた書きすればもちろんOKですけどありえないですよね。(インスタンス数固定ならまぁ。。。)※まぁそもそもそういうことしないほうがいいよねというのはある
    • ハンズオンではLBしてもいいからとりあえずRDPの口はあけてます。他のインスタンスは多段してね☆
  • apiVersion
    • Scheme
    • 結構はまるポイントです。注意しましょう。
  • タグ
    • タグは活用しましょう。別で書こうと思いますがポリシーとかにも使えるし。
    • あとConcatとか活用しだすとVisual Studioでいじってるときとか結構ひどい見た目になるので、キーがdisplayNameでタグ付けして表示名をつけてあげるといいかと思います。
  • PowerShell DSCの話はざっくりしかしてません(Windowsの場合)
    • 認証情報の渡し方はprotectedStringsとPrivateSettingsRefあたり活用すればいいかと
    • DSC側のConfigrationもだいぶ無茶してる感あります。。本番で使うにはもうちょっときれいにしたほうがいいでしょう。Scriptとか、、、ひどいコードですみません。そのまま使えないことはないですがきれいじゃないなぁ
    • システム全体のオーケストレーションは別途考えてみてください。
    • 今見直したらアプリケーション固めたZipのURLとか決めうちしちゃってるので、ARM Templateから渡すようにしたりとかしておけばよかったですね。
  • リソース固有情報(resourceGroup().idとか)はうまく活用してください。
  • Azureポータル上でもリソースエクスプローラーはあるのですが(参照からどうぞ)、外部のサイトのほうができること多いです。どういうプロパティ・値を指定したらいいのか不明な時は手動でデプロイしてからリソースエクスプローラーでごにょごにょ参照するといいかと思います。
  • AzureResourceVisualizerとか意外と便利かもですね。node.jsでローカルで動かせますよ

あとは何だろう、CloudFormationのTipsなども参考にするといいかもしれませんね。ただまぁJSONをべたべた書くのはなかなか苦行なのでVisual Studio使うのがいいかと思います。。。

Azure の日本語公式ドキュメントがGitHubに

やっと日本語版のAzure公式ドキュメントもGitHubに来ました。

英語のドキュメントはだいぶ昔からGitHubにリポジトリが公開されてたのですが、他言語はPrivateなのかどういうプロセスなのかわかりませんが非公開でした。これでやっと直接修正をPullRequestできますね。

ちなみに今日時点で日本語のほかにポルトガル語、ドイツ語と日本語、英語の4言語が公開されてるようです。文句が多い国から公開してるんでしょうか?(

image

さっそくPull Requestしてる人もいました。

日本語がおかしいとかだけなら簡単なんですが、例えばコマンドが間違ってるとか説明そのものが間違ってるといった時に原文(と思われる英語のコンテンツ)もどうかをチェックしたほうがいいかも?
もし英語のコンテンツ自体まちがっているならそこから修正する感じなんでしょうかね。ちょっとまだよく見えないな。

まとめ

今までフィードバック先が不明瞭でコメントも残せずやきもきしてたのが直接的にかかわれるようになりました。ある意味甘えが許されなくなったので気付いた人は積極的にPull Requestしましょう。

おまけ

Azure ポータルの言語リソースもGitHubに公開してくれてもいいのよ(ソースは別に…)

追記

なぜか現状リポジトリが非公開になったみたいで404になってしまってます。どうもちゃんとフィードバックの受け入れ体制できたら再オープンするよ!ごめんね!ということらしいです。。ちょっとフライングで見えちゃいましたがもうしばらくお待ちくださいという感じです。

Azure Update (2015.12.10)

いろいろ。

Azure Update (2015.11.30)

つらつらと。

PowerApps!

Convergence 2015 EMEA というイベントの1日目キーノートで唐突に発表されました。

続きを読む

きたあず第9回勉強会でしゃべってきました

JAZUG 札幌支部第9回勉強会でしゃべってきました。

当日の資料はこちら。

ベースはふくあずでLTした内容になってます。ちょっとでも学習のたしになれば幸いです。ぐだぐだトークですみません。。
あんまり気負わずに触れてもらえればいいかなと思います。

※なお当日LTもしましたが、内容が世界のやまさ推しというあまりにもひどい内容だったため割愛致します(

他の方の資料はこちら(見つけられた分だけ)。

ふりかえり

札幌5年ぶりぐらいです。その前に行ったのは友人の結婚式でした(10年以上前な予感…)。※その友人は最近お子さんが生まれたと同僚の方に聞きましたw めでたい!5年前のCLR/Hで会ったと思う人たちとも再会できましたし、伝説(?)のえんぷら師匠との再会(?)も果たせました。
ひさしぶりに札幌に行ったらSUICA使えるようになってたし、前回とはまた違った感じでよかったです。そういえば前回のときは雪まつりでしたね…盛大に転んでまゆき先生に助けられたのもいい思い出です。これからもまゆき先生について行きたいと思います。

めんたろ社長はなんか久しぶり感は全然なかったのですが、横でがりっちや世界のやまさが高度な情報戦を行ってるのをしり目に超まじめに技術な話とか会社(経営)な話とか人生について語り合ったりしてました(めずらしい)

各地のJAZUGなイベントにちょくちょく顔出してましたが、やっと札幌にも来れました。あと行ったことないのは仙台かな~?。ほかの地域みたいにふらっと参加したいです。

Azure Subscriptionに支払情報を追加する

MSDN Subscription特典のAzureなどを使ってるとAzure Subscriptionに支払情報が設定されていない場合があります。
この場合、Marketplaceからの購入時などに支払情報がないといったエラーが発生したりします。

statusMessage:{"error":{"code":"ResourcePurchaseValidationFailed","message":"User failed validation to purchase resources. Error message: '{\"ErrorDescription\":\"[\\\"We could not find a credit card on file for your azure subscription. Please make sure your azure subscription has a credit card.\\\"]\",\"CultureInvariantErrorCode\":\"BadRequest\",\"ActivityId\":\"\"}'"}}

簡単に解決するにはクレジットカードの情報を登録すればいいのですが、これが面倒くさいというかわかりにくかったのでメモ。

https://account.windowsazure.com にアクセスしてサブスクリプション→対象のサブスクリプションを選択します。
「使用制限の削除」を選択し、表示されるダイアログの「はい、使用制限を削除します」を選択して支払方法を追加(または変更)します。

image

追加できたら実際に使用制限を削除する必要はありません。キャンセルしましょう。
※使用制限を削除された状態=支払方法が設定された状態なので上述のエラーは発生しないでしょう。

クレカの有効期限切れの場合などもここから支払方法を変更できそうですね。というかメニューがわかりにくい。

Azure Resource ManagerでMarketplaceを使う

Azure Resource Managerのテンプレート集を使うとVMv2などの構成を簡単(?)に行うことができます。
ただ見てるとMarketplaceに公開されてるカスタムVMイメージなどを使ったテンプレートがなさげです。

こんな感じで普通にやるとエラーになるわけです

Marketplaceの場合も通常の場合もOSImageにはパブリッシャー、オファー、SKU、バージョンの指定が必要なのですがMarketplaceの場合は追加の課金が発生する可能性もあり、個別にPlanも指定する必要があります。

※ オファーやSKUなどは Get-AzureRmVMImageOffer などを使って取得すればいいでしょう

Get-AzureRmVMImageSku

コマンド パイプライン位置 1 のコマンドレット Get-AzureRmVMImageSku
次のパラメーターに値を指定してください:
Location: Japan West
PublisherName: miracl_linux
Offer: asianux-server-4-sp4

Skus          Offer                PublisherName Location  Id
----          -----                ------------- --------  --
axs4sp4licazu asianux-server-4-sp4 miracl_linux  japanwest /Subscriptions/5ffe5ad0-6dfc-4e3e-b44e-f4297c930546/Pro...

具体的にはVirtual Machineのリソースに以下のようにplanも追加してあげます。

    {
      "apiVersion": "2015-06-15",
      "type": "Microsoft.Compute/virtualMachines",
      "name": "[variables('vmName')]",
      "location": "[variables('location')]",
      "plan": {
        "name": "axs4sp4licazu",
        "publisher": "miracl_linux",
        "product": "asianux-server-4-sp4"
      },
      "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', parameters('newStorageAccountName'))]",
        "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[variables('vmSize')]"
        },
        "osProfile": {
          "computerName": "[variables('vmName')]",
          "adminUsername": "[parameters('adminUsername')]",
          "adminPassword": "[parameters('adminPassword')]"
        },
        "storageProfile": {
          "imageReference": {
            "publisher": "[variables('imagePublisher')]",
            "offer": "[variables('imageOffer')]",
            "sku": "[parameters('ubuntuOSVersion')]",
            "version": "latest"
          },
          "osDisk": {
            "name": "[variables('OSDiskName')]",
            "vhd": {
              "uri": "[concat('http://',parameters('newStorageAccountName'),'.blob.core.windows.net/',variables('vmStorageAccountContainerName'),'/',variables('OSDiskName'),'.vhd')]"
            },
            "caching": "ReadWrite",
            "createOption": "FromImage"
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
            }
          ]
        }
      }
    }

publisher はそのままpublisherを、nameにはskuを、productにはofferに入れる値を入れておけばいいかと。(厳密には違うかもしれませんが)
※ 確実に知りたい場合はPreviewポータル上で該当のVirtual Machineを展開後、ARMExplorerなどで見るといいかもしれません。

これでエラーは回避して問題なくデプロイできます。

Tips

意外とハマるかもしれませんが、REST APIやAzure PowerShell/CLIでMarketplaceを利用する場合、事前に使用許諾を了承しておく必要があります。

arm

Previewポータル上でMarketplaceから対象のものを開き、一番下にあるリンク(Want to deploy programmatically?)をクリックし、対象サブスクリプションをEnableにしておきます。※当然追加の料金が発生する場合があるので注意が必要です。

またデプロイに成功した後、購入した旨のメールが届きます。(料金が発生しなかったとしても)
image