ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Azure Lab Services を使って複数の仮想マシンを構築する

ハンズオンなどのトレーニングにおいて、受講者向けに複数の仮想マシンを Azure 上に構築する方法をまとめておきます。
Azure Portal からポチポチと1台ずつ作るのは厳しいため、選択肢としては次の2つの方法があると思います。

  • Azure Resource Manager テンプレート
  • Azure Lab Services

この記事では、Azure Lab Services を使う方法について記載します。
Azure Resource Manager テンプレート を使う方法については、こちらの記事を参照してください。
gooner.hateblo.jp

Azure Lab Services とは?

Azure Lab Services は、ハンズオンなどのトレーニング向けに Azure の仮想マシンを展開できるサービスで、受講者は仮想マシンに RDP 接続して使うことができます。
受講者1人につき1台の仮想マシンだけでなく、複数のサーバーで構成された環境を展開することもできます。
昨年の2月末に GA しており、東日本と西日本のどちらのリージョンでも使えます。

Lab Account を作成する

まず、ハンズオンを開催する講師側で必要な作業を実施します。
Azure Portal から、Azure Lab Services を作成します。リソース名やリージョンなど基本的な情報だけを入力すればOKです。
その他の項目は必須ではありませんが、今回はハンズオン向けの仮想マシンイメージを作成済みの想定なので、Shared Image Gallery を指定しました。

f:id:TonyTonyKun:20200121142111p:plain

Classroom Lab を作成する

Lab Account が作成されたら、Azure Portal のリンクをクリックすると、Azure Lab Services Portal に移動します。左上の「空色 Lab Services」というタイトルが微妙な感じですが、気にせず進めます。

f:id:TonyTonyKun:20200121142127p:plain

ハンズオン向けの新しいラボを作成します。※上記の画面は、すでに2つ作成済み。
まずは、必要な仮想マシンサイズとイメージを選択します。Shared Image Gallery を指定して Lab Account を作成していると、ここでカスタムイメージを選択できます。

f:id:TonyTonyKun:20200121142139p:plain

次に、仮想マシンのユーザー名とパスワードを設定します。仮想マシンを使う受講者にパスワードを変更させることもできます。

f:id:TonyTonyKun:20200121142152p:plain

最後にポリシーを設定しますが、後で変更することも可能です。クォータは、ラボに対してスケジュールされた時間外にユーザーが利用できる時間です。自動シャットダウンなども設定できます。

f:id:TonyTonyKun:20200121142203p:plain

完了ボタンを押すと、ラボで利用する仮想マシンのテンプレートが作成されるのですが、上記のメッセージにもあるように割と時間がかかります。

f:id:TonyTonyKun:20200121142215p:plain

20分ほど待つと、仮想マシンのテンプレート作成が完了します。

仮想マシンを展開する

仮想マシンのテンプレートが作成できたら、受講者が利用する台数分を公開します。

f:id:TonyTonyKun:20200121142227p:plain

これもメッセージにあるように、割と時間がかかります。40分ほどで3台の仮想マシンを公開できました。仮想マシンプールで、3台すべてが受講者に未割当の仮想マシンであることを確認できます。

f:id:TonyTonyKun:20200121142240p:plain

公開した仮想マシンを受講者に払い出したいので、ユーザーの追加ボタンからメールアドレスを登録します。メールアドレスは、手入力もしくは CSV ファイルで登録できます。

f:id:TonyTonyKun:20200121142252p:plain

ユーザーを登録できたら、全員を招待ボタン から受講者へ招待メールを送信します。これでハンズオンを開催する講師側で必要な作業は完了です。

受講者が仮想マシンを利用する

ここからは、ハンズオンに参加する受講者側で必要な作業です。ハンズオンのラボへの参加を招待するメールが届いているはずです。

f:id:TonyTonyKun:20200121142315p:plain

ラボへの登録のリンクをクリックして、Azure Lab Services Portal にサインインします。サインインするには、Microsoft アカウントが必要となります。

f:id:TonyTonyKun:20200121142326p:plain

受講者は、自分に割り当てられた仮想マシンが表示されるので、赤印をクリックして RDP ファイルをダウンロードすることができます。

Azure Lab Services の課金体系

Azure Lab Services の課金対象となるのは、アクティブな仮想マシンのみです。シャットダウンされているインスタンスは課金対象外ですし、通常の仮想マシンのように、コンピューティングやストレージやネットワークへの課金がありません。
ハンズオンで使った分だけ、シンプルかつリーズナブルに利用できるサービスです。詳細は、公式サイトで確認してください。

まとめ

Azure Lab Services を使って、複数の仮想マシンを Azure 上に構築してみました。
ARM テンプレートは仮想マシンを作るだけですが、Azure Lab Services はハンズオンなどのトレーニング向けに特化しているメリットがあります。

  • 受講者向けにメールで仮想マシンに招待できる
  • 講師側で仮想マシンを起動できる時間帯や自動シャットダウンを制御できる
  • コスト計算がシンプルで通常の仮想マシンよりも安い

しかし、仮想マシンのテンプレート作成や展開に時間がかかりすぎるので、今後の改善を期待したいです。

Azure Resource Manager テンプレートを使って複数の仮想マシンを構築する

ハンズオンなどのトレーニングにおいて、受講者向けに複数の仮想マシンを Azure 上に構築する方法をまとめておきます。
Azure Portal からポチポチと1台ずつ作るのは厳しいため、選択肢としては次の2つの方法があると思います。

  • Azure Resource Manager テンプレート
  • Azure Lab Services

この記事では、Azure Resource Manager テンプレートを使う方法について記載します。
Azure Lab Services を使う方法については、こちらの記事を参照してください。
gooner.hateblo.jp

Azure Resource Manager テンプレートとは?

ARM テンプレートと呼ばれ、インフラの構築作業をスクリプトによって実施する考え方の Infrastructure as Code を Azure 上で実現するための機能です。テンプレートとパラメータの2つの JSON ファイルから構成され、Azure CLI や Azure Portal からデプロイできます。

ARM テンプレートでリソースの複数インスタンスを作成する

ARM テンプレートでリソースの複数インスタンスを作成するには、copy オブジェクトを使います。
docs.microsoft.com

仮想マシンのリソースを作成する部分を例に挙げます。

{
    "name": "[concat(variables('virtualMachineName'), copyindex())]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2018-10-01",
    "location": "[resourceGroup().location]",
    "dependsOn": [
        "[resourceId(resourceGroup().name, 'Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]",
        "[resourceId(resourceGroup().name, 'Microsoft.Network/virtualNetworks', variables('virtualNetworkName'))]",
        "networkInterfaceLoop",
        "[resourceId(resourceGroup().name, 'Microsoft.Storage/storageAccounts', variables('diagnosticsStorageAccountName'))]"
    ],
    "properties": {
        "hardwareProfile": {
            "vmSize": "Standard_DS1_v2"
        },
        "storageProfile": {
            "osDisk": {
                "createOption": "fromImage",
                "managedDisk": {
                    "storageAccountType": "StandardSSD_LRS"
                }
            },
            "imageReference": {
                "publisher": "MicrosoftWindowsServer",
                "offer": "WindowsServer",
                "sku": "2016-Datacenter",
                "version": "latest"
            }
        },
        "networkProfile": {
            "networkInterfaces": [
                {
                    "id": "[resourceId('Microsoft.Network/networkInterfaces', concat(variables('networkInterfaceName'), copyindex()))]"
                }
            ]
        },
        "osProfile": {
            "computerName": "[concat(variables('virtualMachineName'), copyindex())]",
            "adminUsername": "[parameters('adminUsername')]",
            "adminPassword": "[parameters('adminPassword')]",
            "windowsConfiguration": {
                "enableAutomaticUpdates": true,
                "provisionVmAgent": true
            }
        },
        "diagnosticsProfile": {
            "bootDiagnostics": {
                "enabled": true,
                "storageUri": "[concat('https://', variables('diagnosticsStorageAccountName'), '.blob.core.windows.net/')]"
            }
        }
    },
    "copy": {
        "name": "virtualMachineLoop",
        "count": "[parameters('numberOfInstances')]"
    }
}

ポイントは、下記の3点です。

  • パラメータで指定された作成する仮想マシンの台数を copy オブジェクトの count で指定する
  • 仮想マシンの名前に copyindex() を付加して重複を防ぐ
  • dependsOnnetworkInterfaceLoop を指定して NIC 作成後に仮想マシンを作成する依存関係を設定する

同じように Public IP Addresses と Network Interfaces も、copy オブジェクトで複数作成することで、パラメータで指定された台数分の仮想マシンを作成できます。
Azure CLI を使って、ARM テンプレートを実行してデプロイします。

$ az group create -n <ResourceGroup Name> -l japaneast
$ az group deployment create -g <ResourceGroup Name> --template-file template.json --parameters parameters.json

Custom Image を利用する

前述の ARM テンプレートは、Windows Server 2016 Datacenter のデフォルトのイメージを使っています。ハンズオンなどのトレーニングでの利用を想定すると、カスタムのイメージを使うケースのほうが多いと思います。

必要なアプリケーションなどをインストールした仮想マシンで PowerShell を使って sysprep を実行します。

& "$Env:SystemRoot\system32\sysprep\sysprep.exe" /generalize /oobe /shutdown

続いて、仮想マシンのイメージを作成します。仮想マシンと同じリソースグループにイメージが作成されるので、コマンド実行後に別のリソースグループへ移動しておきましょう。

# VM の割り当てを解除する
$ az vm deallocate -g <myResourceGroup> -n <myVM>

# VM の状態を一般化に設定する
$ az vm generalize -g <myResourceGroup> -n <myVM>

# VM リソースのイメージを作成する
$ az image create -g <myResourceGroup> -n <myImage> --source <myVM>

ARM テンプレートでは、imageReference で利用したいイメージの imageRsourceGroupNameimageName を指定します。

"imageReference": {
    "id": "[resourceId(parameters('imageRsourceGroupName'), 'Microsoft.Compute/images', parameters('imageName'))]"
}

Shared Image Gallery を利用する

Shared Image Gallery は、仮想マシンのイメージをサブスクリプションやテナントをまたいで利用できるリソースです。イメージのバージョンを管理することもできるので、Shared Image Gallery のほうが保守性は高いと思います。

Azure Portal から、作成済みのイメージから Shared Image Gallery を作成できます。
docs.microsoft.com

ARM テンプレートでは、imageReference で利用したい Shared Image Gallery の galleryNamegalleryImageDefinitionNamegalleryImageVersionName を指定します。

"imageReference": {
    "id": "[resourceId('Microsoft.Compute/galleries/images/versions', parameters('galleryName'), parameters('galleryImageDefinitionName'), parameters('galleryImageVersionName'))]"
}

まとめ

Azure Resource Manager テンプレートを使って、複数の仮想マシンを Azure 上に構築してみました。copy オブジェクトは利用頻度が高いので、使いこなせるようになると Infrastructure as Code の効率が上がります。
作成した ARM テンプレートの JSON ファイルは、こちらを参照してください。
github.com

2019 年振り返り

今年も、しばやんさんが作った 2019 年の人気記事ランキング生成 を使わせてもらい、1年を振り返ってみます。

  1. HttpClient を使って同期で通信する
  2. ASP.NET でクライアントの IP アドレスを取得する
  3. ASP.NET Web API で multipart / form-data を使ってファイルをアップロードする
  4. プロキシ環境下で Web API を呼び出す
  5. ASP.NET MVC の Ajax 通信で例外を処理する
  6. ASP.NET MVC で JSON の一部として PartialView を返す方法
  7. ファイルをアップロードする API の Swagger ドキュメントを書く
  8. ASP.NET Web API を経由して Azure Blob Storage にアクセスする
  9. ASP.NET Web API で返す JSON のプロパティを指定する
  10. ASP.NET Web API で MediaTypeFormatter を追加する

例年通り、ASP.NET 関連の記事が、多く読まれています。Azure の記事がもっと増えてほしいですが、なかなか PV が伸びないですね。

イベント登壇

イベント登壇は、JAZUG札幌支部(きたあず)と Ignite The Tour Tokyo の2回でした。

Ignite The Tour のセッション資料は、運営側から公開される予定です。ちなみに、来月の大阪でも同じ内容で登壇します。
ここ数年は Azure Kubernetes Service のテーマで登壇することが多かったですが、これからは Serverless & JAMstack の方向にシフトしていきたいです。どちらもマイクロサービス なアプローチですが、Kubernetes と比べると速くて安くてシンプルなので、より多くの人たちにリーチできると考えています。

コミュニティ運営

東京の JAZUG でのセッション登壇はありませんでしたが、運営をお手伝いしました。例年通りのイベント以外にも、Ignite The Tour でコミュニティブースを出しました。登壇も運営もどちらも楽しかったので、来年も継続して活動していきたいです。

  • Tokyo Jazug Night
  • Japan Azure User Group 9 周年イベント
  • Global Azure Bootcamp 2019@Tokyo
  • Ignite The Tour Tokyo

来年は JAZUG 10 周年なので、何か楽しいイベントにしたいですね。

Microsoft MVP

3月には、2回目の Microsoft MVP Global Summit に参加しました。今回もたくさんの刺激を受けて楽しかった。英語を話せたら何倍も楽しいはずですが、結局今年もほとんど勉強しなかったので、年明けから勉強したい。
gooner.hateblo.jp

昨年からのコミュニティ活動が評価されて、7月には Microsoft MVP for Microsoft Azure を無事に更新できたので、また来年の3月に参加できそうです。

仕事

おかげさまで15 周年ということで、家族を連れてハワイに社員旅行に行ったことが印象に残っています。
gooner.hateblo.jp

転職して3年が経ち、今年の目標だった「自分でやりたい提案を書いて、仕事ができるようになる」は達成できたし、長くお付き合いできるお客さんとの出会いもありました。ただ、案件を一人で担当することが多いので、来年は社内社外を問わずに、一緒に仕事ができる仲間を増やしたいです。

まとめ

コミュニティや仕事で多くの方々と出会う機会に恵まれ、新しいことにも挑戦することができ、充実した1年だったと思います。
本年もお世話になりました。よい年をお迎えください。

おまけ

2019年自分が選ぶ今年の4枚。

f:id:TonyTonyKun:20191110115429j:plain
紅葉の小樽運河
f:id:TonyTonyKun:20190812012109j:plain
ダイヤモンドヘッド山頂からの景色
f:id:TonyTonyKun:20190727013937j:plain
立山連峰の雄山
f:id:TonyTonyKun:20190327203938j:plain
Microsoft MVP Global Summit 2019