7月21日(金)に、無料セミナー「初めてのPowerShell」を開催しました。
暑い中、多くの方にお越しいただき、ありがとうございました。
この時に使用したスライドを共有します。
「マイクロソフトMVPアワード(日本最多15回目)」でお伝えしたとおり、今年もMicrosoft MVPに認定されました。
恒例のアワードキットが到着したので披露します。
それほど多くない、このブログのPVもMVP認定に貢献してるみたいです。
トロフィー(?)に付けたところ。
毎年思うのですが、このリングの加工精度はもうちょっと何とかならんのか。
ちなみに、この写真、タブレットで撮りました。スマホとかタブレットでこの種の写真を撮ると、斜め上から構えることになって歪むので、上下逆にして、レンズを床に付けるようにすると割とうまく撮れます。
そいいうわけで、今年もどうぞよろしくお願いします。
マイクロソフトMVPアワードを再受賞しました。今回で15回目です。15回連続受賞は、日本で2人いて、そのうち1人が私ですので、大変名誉なことです。
※当初「13回目」と書いてましたが、2003年から途切れていないので、15回目のはず。
Microsoft MVPはカテゴリ別の受賞で、私はずっとDirectory Services (Active Directory) または後継のEnterprise Mobilityでした。1回だけ「Virtual Machines」という年があったんですが、12回のうちの1回です。
今回は、Cloud Datacenter Managementで受賞ということで、少しActive Directoryから離れます。
ここ数年はAzureに注力したり、Bluemix Infrastructure (旧称SoftLayer) を担当したり、クラウドの仕事が増えてきたので、そのあたりが評価されたのだと思います。
今日は、3人組アイドルユニット「まなみのりさ」が活動再開というニュースも流れて来てきたり、シンガーソングライター宮崎奈穂子さんが東京マラソンのチャリティ枠で出場が決定したり、いろいろ嬉しいお知らせがありました。
そして、もう1つ、夏のコミックマーケット(夏コミ)に、猫写真サークル「まぐにゃむフォト」として出展します。こちらもよろしくお願いします。
ちなみに、コミケのWebカタログはMicrosoft Azureで動作しています。年に2回、数万サークルを数十万人がアクセスするという負荷変動の激しいサイトです。
Microsoft Azureでは「ポイント対サイトVPN」を構成することで、特定のPCからAzureの仮想ネットワークにVPN接続を行うことができます。
この時使われるのが「SSTP (Secure Socket Tunneling Protocol)」で、HTTPSを使った接続を行います。
「Microsoft AzureによるITインフラの拡張」では、ポイント対サイトVPNを構成する演習を行いますが、先日接続ができませんでした。
どうやら、使った証明書に問題があったようです。
演習で使う証明書は、ハッシュ関数としてSHA-1を使っています。しかし、SHA-1は理論的な脆弱性が指摘されていました。2017年2月には実際の攻撃実験も成功しています。
しかし、演習ではセキュリティリスクのあるSHA-1を使い続けていました。演習で使う仮想マシンや仮想ネットワークはその日中に削除しますし、仮想マシンにはサンプルのWebサイトしか存在しないため、問題にはならないと考えていたからです。
しかし、Azure側がSHA-1の受け入れを停止したようです。
この問題を解決するには、SHA-2などSHA-1よりも強力なハッシュ関数を使って証明書の再作成を行います。
テキストでは、マイクロソフトがWindows SDKとともに配布しているmakecert.exeを使った例を紹介してます。そこで指定している「sha1」というパラメーターを「sha256」に変更してください。
【自己署名ルート証明書】
makecert -sky exchange -r -n "CN=G20K-Root" -pe -a sha256 -len 2048 -ss My "C:\G20K-Root.cer"
【クライアント証明書】
makecert -n "CN=G20K-Client" -pe -sky exchange -m 96 -ss My -in "G20K-Root" -is my -a sha256
自己署名証明書は、PowerShellの「New-SelfSignedCertificate」でも構成できます。こちらの方が少し複雑なように見えますが、Windows SDKのインストールが不要なので、むしろ簡単かもしれません。
詳しくは「PowerShell を使用したポイント対サイト接続の証明書の生成とエクスポート」をお読みください。
パブリッククラウドで最も高価なサービスは、やはり仮想マシンでしょう。
クラウド各社の仮想マシン(またはベアメタルサーバー)の利用料金を試算してみました。Azureは1分単位、AWSやBluemix Infrastructureは1時間単位の課金ですが、今回は比較を簡単にするため1ヶ月の課金にそろえました。
AWSはいつも「安い」と言われますが、安いのはネットワークとストレージであって、仮想マシンはそれほど安くないことが分かります。ただし、仮想マシンには豊富な割引オプションがあるため、運用によってはかなりコストを削減できます。
逆に「高い」と言われるBluemix Infrastructureが案外安くなっています。Bluemix Infrastructureが高価なのはネットワーク機器などのアプライアンス製品なので、単純にサーバーを構築するだけだったらそれほど高価ではないことが分かります。
ただし、Bluemix Infrastructureは可用性に関する考え方が違うので、サービスレベルを他社と同列に扱うことはできません。
各社のサーバー性能は以下の通りです。ここでは、これらのパラメータを考慮せずに計算します。なお、AWSとAzureの性能あたりコストはほぼ同等というベンチマーク結果があります。
1ヶ月744時間として、以下の構成で$531/月、6万円/月くらいでしょうか。ただし、AWSには豊富な割引オプションがあり、仮想マシンは最大75%の割引があります。
なお、AWSの汎用SSDは10.000 IOPSを実現できるので、汎用SSDで計算しました。
c4.xlargeサイズは16 ECUなので、コアあたり4 ECUとなります。Azureの場合はコアあたり210~250ACUなので、4×46=186ACUのCPUとほぼ同等の速度と考えられます。
1ヶ月744時間として、以下の構成で41,463円/月になります。Azureのハードディスクは500IOPSなので、2台構成のRAID-0で1,000IOPSを実現します。
SSDにすると以下のようになり、58,222円に上がります。なお、SSDは高速なのでシングルディスクで構成しました。
F/FSシリーズはコアあたり210~250ACUなので、c4.xlargeの186よりも少し速くなります。
以下の構成で$299.02/月、34,000円くらいでしょうか。
以下の構成で$492/月、55,000円くらいでしょうか。
では、ここでホスティング事業者として有名な「さくらインターネット」のサーバーで試算してみましょう。さくらインターネットでは仮想マシンやクラウドサービスも提供していますが、ここでは一般的なベアメタルサーバーで試算します。
以上の構成で、初期費用86,400円、月額利用料17,280円になります。
つまり、初月は10万円以上かかってしまいます。しかし、4ヶ月間の累計は155,520円となり、1ヶ月あたり38,880円になります。1年間だと累計293,760円、1ヶ月あたり24,480円で、クラウドよりはずっと安くなります。
「クラウドの仮想マシンは、連続稼働を前提にすると、それほど安くはない」という意味をお分かりいただけたかと思います。
以前、Hyper-V上のドメインコントローラーについて書きました(Hyper-V 仮想化環境での時刻同期)。
この時は「ドメインコントローラーについては、Hyper-Vを使ったホストとの同期を停止する」と紹介しています。根拠は、マイクロソフトの公開文書「仮想化ドメイン コントローラーの展開に関する考慮事項」です。
Microsoft Azureの仮想化基盤はHyper-Vなので、Azure上のドメインコントローラーについても同じことが言えるはずです。
しかし、Azureテクニカルサポート チームのブログ「Azure 仮想マシンの時刻同期の仕組み」では、ホスト同期を無効にする方法について触れつつも「基本的には、Azure に時刻同期を任せてしまう、という考えで、既定のままにしていただくことが便利です」とあります。
矛盾するようですが、以下のようなことではないかと想像します。
Hyper-V、つまりオンプレミス環境では複数の仮想化ホスト(物理マシン)の時刻同期がきちんと行われていない可能性があります。こうした状況でホスト同期を行うことはリスクが大きいため、ドメインコントローラー自身が持つNTP時刻同期を使う方が無難です。
しかし、Azure内にあるすべての物理マシンは時刻同期が正しく行われています。このような環境では、ホスト同期を優先した方がリスクが小さいと考えられます。
逆に言うと、すべてのHyper-Vホストが適切に時刻同期している環境であれば、ホスト同期を有効にしたままで問題ない(むしろ推奨される)と思われます。
Microsoft Azureの仮想マシンを一般化して再展開する場合は、JSON形式のフォーマットでパラメーターを与える必要があります。
このフォーマット、なかなか複雑なので苦労します。私が使っているものを公開しておきます。
なお、このファイルはマイクロソフトの安納さんのブログ記事「Azure Resource Manager で作成した仮想マシンをキャプチャーする」に掲載されたものを一部修正し、可用性セットの設定を追加したものです。
もっとも、現在は「管理ディスク(managed disk)」を使った仮想マシンであれば、GUIで簡単に取り込めるので、JSONファイルの出番もあまりないかもしれません。
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"osMasterImageUri": {
"type": "string",
"metadata": {
"description": "マスターイメージのURI"
}
},
"vmName": {
"type": "string",
"metadata": {
"description": "仮想マシンの名前"
}
},
"osType": {
"type": "string",
"allowedValues": [
"Windows",
"Linux"
],
"defaultValue" :"Windows",
"metadata": {
"description": "OSのタイプ"
}
},
"adminUserName": {
"type": "string",
"metadata": {
"description": "管理者ユーザーID"
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "管理者ユーザーIDのパスワード"
}
},
"vmSize": {
"type": "string",
"allowedValues": [
"Standard_D1",
"Standard_D1_v2",
"Standard_F1"
],
"defaultValue" :"Standard_F1",
"metadata": {
"description": "仮想マシンのサイズ"
}
},
"StorageAccountName": {
"type": "string",
"metadata": {
"description": "ストレージアカウントの名前"
}
},
"existingVirtualNetworkName": {
"type": "string",
"metadata": {
"description": "仮想ネットワーク"
}
},
"subnetName": {
"type": "string",
"metadata": {
"description": "サブネット名"
}
},
"availabilitySetName": {
"type": "string",
"metadata": {
"description": "可用性セット名"
}
}
},
"variables": {
"api-version": "2015-06-15",
"location": "[resourceGroup().location]",
"publicIPAddressType": "Dynamic",
"vnetID": "[resourceId('Microsoft.Network/virtualNetworks', parameters('existingVirtualNetworkName'))]",
"subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]",
"nicName": "[concat(parameters('vmName'),'-nic')]",
"publicIPAddressName": "[concat(parameters('vmName'),'-pip')]",
"osDiskVhdName": "[concat('http://',parameters('StorageAccountName'),'.blob.core.windows.net/vhds/',parameters('vmName'),'osDisk.vhd')]"
},
"resources": [
{
"apiVersion": "[variables('api-version')]",
"type": "Microsoft.Network/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"location": "[variables('location')]",
"properties": {
"publicIPAllocationMethod": "[variables('publicIPAddressType')]"
}
},
{
"apiVersion": "[variables('api-version')]",
"type": "Microsoft.Network/networkInterfaces",
"name": "[variables('nicName')]",
"location": "[variables('location')]",
"dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]" ],
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
},
"subnet": {
"id": "[variables('subnetRef')]"
}
}
}
]
}
},
{
"apiVersion": "[variables('api-version')]",
"type": "Microsoft.Compute/virtualMachines",
"name": "[parameters('vmName')]",
"location": "[variables('location')]",
"dependsOn": [
"[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('vmSize')]"
},
"osProfile": {
"computername": "[parameters('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"osDisk": {
"name": "[concat(parameters('vmName'),'-osDisk')]",
"osType": "[parameters('osType')]",
"caching": "ReadWrite",
"createOption": "FromImage",
"image": {
"uri": "[parameters('osMasterImageUri')]"
},
"vhd": {
"uri": "[variables('osDiskVhdName')]"
}
}
},
"networkProfile": {
"networkInterfaces": [
{
"id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
}
]
},
"availabilitySet": {
"id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySetName'))]"
}
}
}
]
}