Azure Media Encoder Standard のスキーマとか

Azure Media Servicesで動画のエンコード行う際、最近だとMedia Encoder Standardを使うかと思いますが今日はそのスキーマの話です。

エンコードのジョブを作成する際、どういったフォーマットや品質でエンコードを行うか指示するわけですが、通常はプリセットを利用するわけです。

ポータル上でプリセット使う場合に選択するアレですね。なおドキュメントは過剰翻訳されてるというか、英語で見ても翻訳されてたりちょっとイマイチです。(指定するプリセット名が翻訳されてしまってる…)
※実際に指定する際は各プリセットの個別ページに記載されてるやつを使いましょう。

さてもっときめ細かく指定したい場合はカスタムプリセットを作ってエンコードすることもできます。
その際、XML形式とJSON形式を選べるわけですが、XML形式はSchemeが一応公開されてるにも関わらずJSON形式はさっぱりです。

なおたまに見るとUpdateされてたりします。具体的には回転情報を維持するかどうかなど。

image

今までは黒帯ついたりしてたのでこれでちゃんとできますね。さてJSON形式ですがMSDNライブラリのほうにはないので、Azure公式ドキュメントのほうを探しましょう。と言いたいところですが、肝心なところがGitHubにしかない予感。

こちらにいろいろ載ってるので参考まで。

H.264のプロファイルをBaselineにする方法とかいろいろ。慣れるとXMLのスキーマみてどこに何指定したらいけるかなんとなく判断できますが、基本的にTry&Errorになりそうな気がします。

※変な値指定するとJobでエラー返るので判断はある程度付きます。(ただしある程度)

なおMedia Encoder Standard(だけじゃないかもしれませんが)の裏側はFFmpegなので、FFmpegでできそうなことはだいたいできると思います。FFmpegバンザイ。(プリセットの内容みて引数生成してるだけな気がする)

まぁそんな感じでMedia Servicesをお楽しみください。

Azure Virtual Machines の再デプロイ

Azure の仮想マシン(Virutal Machine)でリモート接続できなくてにっちもさっちもいかなくなった場合とか、なんだか調子が悪いわぁということでホストを移りたいとかたまにありますよね。

そういう時はホストが移動するのを期待してインスタンスサイズを変えたりしてたわけですが、いつの間にかそんなことしなくても簡単に再デプロイできるようになっていました。

image

わぁ便利。3月頭ぐらいに実装されてたっぽいです。

続きを読む

App Service Environmentでバックエンドと通信できない

App Service Environment(日本語名:App Service 環境)を使うとVNET(v1)※現状 に接続することができます。
普通のApp Serviceと違ってClosedな環境にしたり、VNETにつなげられるということはVPNであれこれしたりできるわけです。

なので内部用で外には公開したくないSQL Serverな仮想マシンとかVNET参加させたRedis(Premium)とかと合わせて完全VNETオンリーな環境が作れるわけですが、VNETの注意点として以下のように記載されています。

App Service 環境からバックエンド リソースへの安全な接続
App Service 環境から仮想ネットワーク内のエンドポイントへの送信トラフィックには、注意すべき点が 1 つあります。App Service 環境から、App Service 環境と同じサブネットにある仮想マシンのエンドポイントに到達することはできません。App Service 環境が、App Service 環境専用として予約されているサブネットにデプロイされていれば、通常、これは問題にはなりません。

クラシックなVNET(v1)の制限なのかNSGの制限なのか、はっきりとわかりませんでしたがApp Service Environmentと同じサブネット上の他の機器とうまく通信できないようです。

なので教訓としてApp Service Environmentは専用Subnetに配置しましょう。(作るのが大変なのでこちらを専用化したほうが楽でしょう。CIDRの都合もあるかもしれないし)

さてさて、そうは言ってもそこを何とかならないですか?というのが世の常ですね。
一応泥臭い回避策はないことはないのですが、、、

簡単に言うとApp Service EnvironmentのWorkerPoolであるWeb Appsの設定で明示的にVNETに参加させるという感じです。
この機能そのものは通常のApp Serviceでもある機能で、VNETにPoint to Site接続でVPN接続する機能です。
image

同じVNETにいるくせにVPNを張らないといけないとは!w(おまけにPoint to Siteの設定がVNET側にも必要です)
ということで結局大変でしかも余計な口ができてしまうので、あきらめて作り直したほうがいいかと思います。

まとめ

ネットワークの設計は慎重に。ドキュメントは穴があくほど見まくりましょう。

Azure Management REST API用のBearerトークン

よく忘れるので。

$adal = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.dll"
$adalforms = "${env:ProgramFiles(x86)}\Microsoft SDKs\Azure\PowerShell\ServiceManagement\Azure\Services\Microsoft.IdentityModel.Clients.ActiveDirectory.WindowsForms.dll"
[System.Reflection.Assembly]::LoadFrom($adal)
[System.Reflection.Assembly]::LoadFrom($adalforms)
$adTenant = "<あなたのテナント>.onmicrosoft.com"
# well-known ID
$clientId = "1950a258-227b-4e31-a9cf-717495945fc2"
$redirectUri = "urn:ietf:wg:oauth:2.0:oob"
$resourceAppIdURI = "https://management.core.windows.net/"
$authority = "https://login.windows.net/$adTenant"
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
$authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId, $redirectUri, "Auto")
$authHeader = $authResult.CreateAuthorizationHeader()
# Write-Host "Bearer Token: $authHeader"
$authHeader | Out-File bearerToken.txt

これでBearerトークン出来上がり。認証はいつもの認証ダイアログ的なのが出るので安心です。
(要Azure PowerShell)

参考:Setting up PostMan to call the Azure Management APIs

Windows 10 で省電力時にモニタのサイズがおかしくなる (未解決)

Windows 10でDisplay Portのモニタを使ってる時に、省電力の設定でモニタの電源オフされたあと復帰するとウィンドウのサイズなどがすごく小さくなるケースがあります。

image

ここの設定ですね。

どうも解像度を見失って既定値使うからっぽいです。なのでレジストリ弄って既定値をディスプレイの解像度にしておいてあげるとよさそうです。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\Configuration

の配下に SIMULATED_ で始まるキーがあるのでその下の00キーの PrimSurfSize.cx および PrimSurfSize.cy をそれぞれ適切な解像度の値にしてあげます。

image

※ うちのモニタだと2560×1440なので。

とりあえずうまくいったっぽい ( ´ー`)フゥー... なおると思ったんだけどやっぱり駄目っぽい…

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使うのがいいかと思います。。。

Windows 10 の仮想デスクトップとデモ

Windows 10 では仮想デスクトップが使えます。

Winキー + TABとかで切り替えると右下にでてくる 新しいデスクトップ で追加して切り替えたりできるやつですね。
image

※ Winキー +CTRL+ALT+D のキーコンビネーションで作ることもできます。

仮想デスクトップ間の切り替えはWinキー+TABの切り替え時に選択してもいいですし、Winキー+CTRL+左右キー(← OR → )で切り替えることもできます。

普段使いにも便利ですが、プレゼンなどでデモも含めて行うときは仮想デスクトップ活用するとすごく便利です。
デスクトップ1でプレゼン表示しておいてデスクトップ2はVisual Studio、デスクトップ3はブラウザとかあらかじめ仕込んでおけばキーコンビネーションだけでスパスパ切り替えられます。ウィンドウ探したり、意図しないウィンドウだして誤爆したりな事故も防げてスムーズに進行できます!

ただし注意点がいくつかあって、「画面の外部出力の状態(複製や拡張とかのあれ)は仮想デスクトップ単位で保持されてる」というところです。
デモ時などだいたい複製で行うと思うのですけど、メインなデスクトップで「複製」にしていざ本番、デモ用デスクトップに切り替えたら複製じゃなくて「拡張」になっててデスクトップが晒される!という事態になりえます。

なのであらかじめ各デスクトップでちゃんと設定しておきましょうね。以上、過去2回ほどデスクトップというか壁紙さらして失笑された人からの報告でした。

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

Azureサブスクリプション管理者向けに多要素認証する

以前のPostで組織アカウントのみを使ってAzure サブスクリプションを契約することができました。
あとはサインアップに使ったアカウント(全体管理者)をきちんと管理したいですよね。

Microsoftアカウントであればそちら側で多要素認証(MFA)が使えますが、Azrue ADの組織アカウントでの多要素認証ってどうなんでしょうか?

基本的に無料ではなさそう?いいえ実は上記Blogに書いてないことが1つあります。ユーザー向けではなくAzrueの全体管理者向けにはMFAが無料で提供されるのです。

管理者用の Azure Multi-Factor Authentication の無料版はありますか?

対応する Azure Active Directory がディレクトリ ユーザーに対して Azure Multi-Factor Authentication を使ってプロビジョニングされていない場合、Azure の全体管理者は Azure Multi-Factor Authentication 機能の一部を無料でご利用いただけます。

https://azure.microsoft.com/ja-jp/pricing/details/multi-factor-authentication/

image

https://azure.microsoft.com/ja-jp/documentation/articles/multi-factor-authentication/

意外と知られてそうで知られてない事実のようです。早速使ってみましょう。操作はClassicポータルで行います。

続きを読む

組織アカウントだけでAzureにサインアップする

わかりにくかったので。組織アカウントだけでAzureにサインアップするというよりは、いかにMSアカウントなしでAzure ADを作るか?という話です。

https://account.windowsazure.com/organization にアクセスし必要事項を入力。(いろいろ面倒くさいのでInPrivateモードなどでやりましょう)
※このURLがキモですかね。

image

有効なドメインが確認できたら、管理者となる最初のユーザー名とパスワードを設定し、SMSか電話で認証してAzure ADテナントを作成します。
image

これでAzure ADが新規にできました。作成されましたメールも届いてると思います。
image※名称などいろいろ放置されてる感あるけど。

あとは通常のサインアップと同じです。(認証後、自動的に無料試用版のサインアップ画面になりますがAzure ADができればこっちのもんですね)
作成後そのままサインイン画面になると思うので、先ほど作成したユーザーIDとパスワードで認証します。

無料試用版のサインアップ画面になるので必要事項を入力していき、サインアップします。
imageimage

しばらくすればサブスクリプションができあがります。
image

ディレクトリが名.姓という感じになってますが、会社名のところを空欄にした所為かも。
imageimage

無事、MSアカウントなしでAzureサブスクリプションができました。
image