浅草橋青空市場

Microsoft Azure のニュースや情報を中心にあれこれと

WAF & SSLのApplication GatewayをARM Templateでデプロイする

ロードバランサーSSLを終端してついでにWAFも」というご要望で登場するのがAzureのApplication Gatewayです。よくある構成なのでARM Templateにしておきました。プロビジョニングで20分、設定変更のつど分単位で待たされるので、効率よくやりたいですね。

テンプレートからのデプロイ方法は、お手軽なところでポータルかを使う手順をご紹介しておきます。

  1. テンプレートデプロイ用のブレードを開く

    「Create a Resource」から「Template deployment」で検索するか、以下のURLから直接開けます。開いたら「Create」ボタンを押して進んでください。

    https://portal.azure.com/#create/Microsoft.Template

  2. 「Build your own template in the editor」をクリック

    f:id:yhara90:20180413210352p:plain

  3. テンプレートを貼り付けて「Save」をクリック

    f:id:yhara90:20180413210434p:plain

  4. パラメーターを適宜入力

    f:id:yhara90:20180413210524p:plain

    (参考)Base64への変換

    PowerShell

    ps1 $path="C:\Users\my\Documents\mycert.pfx" [Convert]::ToBase64String([System.IO.File]::ReadAllBytes($path))

    Linux / macOS

    bash openssl base64 -in mycert.pfx -out mycert.pfx.txt

  5. しばらくお待ちください

    ドキュメントによると「プロビジョニングに最大 20 分かかります」とのことでしばらく待ちましょう。

    Azure Application Gateway に関してよく寄せられる質問 | Microsoft Docs

▼Application Gateway のテンプレート(WAF & SSL)

gist.github.com

▼HTTPからHTTPSへのリダイレクトはテンプレートに入れてないので、設定したい場合はこちらのPowerShellをどうぞ

gist.github.com

Azure Database for PostgreSQLでCollation(照合順序)を指定してCREATE DATABASEしたい

というお困り状態を見かけたので。
これまで使っていたCREATE DATABASEをAzureのPostgreSQLに発行すると「ERROR: invalid locale name: "ja_JP.utf8"」となってしまう場合があるようです。

postgres=> CREATE DATABASE my_new_database ENCODING='UTF8' LC_COLLATE='ja_JP.utf8' LC_CTYPE='ja_JP.utf8';
ERROR:  invalid locale name: "ja_JP.utf8"

これはPostgreSQLWindows上で動いているのが原因のようで、エンコーディングを「UTF8」とする場合、COLLATIONの日本語ロケールは「Japanese_Japan.932」を指定すると良いようです。

ロケール(国際化と地域化) | Let's Postgres

Windows で UTF8 エンコーディングを使う場合のみ、ロケールエンコーディングにコードページ 932 (SJIS) を使うことができます。これは Windows の C ライブラリが UTF8 でのロケール処理をサポートしていないためで、PostgreSQL 側で専用の対応を行っています。

だそうです。SQLで書くとこんな感じです。

postgres=> CREATE DATABASE my_new_database ENCODING='UTF8' LC_COLLATE='Japanese_Japan.932' LC_CTYPE='Japanese_Japan.932' TEMPLATE='template0';

ちなみに、ロケールを指定しない場合のデフォルトは「English_United States.1252」となってました。

せっかくなので、Azure Database for PostgreSQL 上でいくつかの照合順序を指定して、実際にどのような並びになるのか簡単に試してみました。

Japanese_Japan.932 English_United States.1252 C
う゛
う゛ う゛

#これだけ見るとデフォルト(English_United States.1252)でいいんじゃ?って気にならなくもない。

Azureポータル上でディスク(Disks)リソースから仮想マシンが作れるようになっていました

表紙で言い切った感はありますが、Managed Disksに「Create VM」ボタンが付きました。これで、可用性セットを出し入れするのに仮想マシンを作り直すときや、テスト用にスナップショットを取って仮想マシンを複製、みたいな作業がポータルのみで完結できますね。だいぶ楽になります。

VMにアタッチ中のディスクはボタンがグレーアウトしますので、スナップショットを取ってからManaged Disksを作成 --> VMを作成、ですね。

f:id:yhara90:20180408002936p:plain

クラシックのディスクリソースにも「Create VM」ボタンが付いていますね(前から?)。

f:id:yhara90:20180408003531p:plain

Azure AutomationのギャラリーにあるグラフィカルRunbookをサービスプリンシパルに対応させてみる

この記事の続き。 asazure.hatenablog.jp

Automation Account --> Runbooks --> Browse Gallery と辿ったら出てくるこの2つです。

f:id:yhara90:20180407230624p:plain

手順

先にAutomation Accountのアセットに、サービスプリンシパルの情報でCredentialを、テナントIDの情報でVariablesを作っておきましょう。前記事にも書きましたが AppIdが「User name」、パスワードは「Password」です。

  1. Runbookをインポートして作成
  2. Edit
  3. エディタ上の「Input and Output」をクリック
  4. 「AzureConnectionAssetName」は使わないので削除
  5. 「Add Input」から、サービスプリンシパル用のCredential名を指定するためのInputを定義(String)。
  6. OKでブレードを閉じながらグラフィカルエディタまで戻る
  7. 最上段の「Get Run as Connection」を削除
  8. 左メニューの「CMDLETS」から「Get-AutomationPSCredential」を探して「Add Canvas」。検索するのが早いが階層としては「Orchestrator.AssetManagement.Cmdlets」の中にある
  9. 「Get-AutomationPSCredential」と下の「Connect to Azure」をドラッグアンドドロップでつなぐ。
  10. 「Get-AutomationPSCredential」をクリックし、「Parameters」を開く
  11. 「NAME」を開き、「Runbook input」から先に作ったサービスプリンシパル用Credential名のInputを選択 --> OK
  12. 「Connect to Azure」をクリック、「Parameters」を開いて以下のように編集
    • 「Parameter Sets」から「ServicePrincipal」を選択
    • 「Credential」は「Data Source」に「Activity Output」を選択、下のボックスで「Get-AutomationPSCredential」
    • 「Serviceprincipal」は「Data Sourceに「Constant value」を指定して「True」を選択
    • 「Tenantid」は「Variable asset」を選択してテナントIDの入ったVariablesを選択

修正は以上です。保存時にエラーが出たときには、戻ってみると指定したはずの項目が指定されていなかったりしますので、改めて指定するか、何度やってもダメならブラウザをリロードしたり、コマンドレットを消して置き直すなどしてみましょう。

サービスプリンシパル(パスワード)でAzure AutomationのRunbookを実行する

仮想マシンの定期的な起動・停止」みたいな定期作業をAzure AutomationのRunbookで実行したいという話は良くあると思います。 が、サービスプリンシパル(パスワードの方)を使ったブログ記事やサンプルが意外と見つからなかったので書いておきます。

※ 証明書を使う方法は公式ドキュメントにあったはず

サービスプリンシパルについて

そもそも何?という話は真壁先生のスライドをどうぞ。

www.slideshare.net

簡単な作りは他はこちらの記事を。作成にはAzure ADにしかるべき権限が必要なので、無い場合は作ってもらいましょう。

asazure.hatenablog.jp

Automation Accountの作成

公式ドキュメントをどうぞ。こちらも「Azure実行アカウントの作成」を行うにはAzure ADに権限が必要です。

docs.microsoft.com

アセットの登録

スクリプト内で使う資格情報やテナントIDなどはAutomation Accountのアセットとして登録します。今回のスクリプトでは、サービスプリンシパルを「Credentials」に、テナントIDを「Variables」に登録しました。

サービスプリンシパルのAppIdをCredentialの「User name」に、パスワードを「Password」に登録します。テナントIDはVariableにStringとして登録しましょう。

f:id:yhara90:20180407224037p:plain

仮想マシン起動・停止のサンプルスクリプト

こんな感じです。PowerShell WorkflowタイプのRunbookとして使えます。

パラメーターはそれぞれ以下のようになります。実行時やタイマーにセットしておきましょう。

  • CredentialName : アセットに登録したサービスプリンシパルのCredential名
  • ResourceGroup : 操作対象のリソースグループ名
  • Action : 「Stop」もしくは「Start」
workflow Stop-Start-AzureVM
{
    Param 
    (    
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 
        [String] 
        $credentialName,
        [Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 
        [String] 
        $ResourceGroup,
        [Parameter(Mandatory=$true)][ValidateSet("Start","Stop")] 
        [String] 
        $Action 
    ) 
     
    $credential = Get-AutomationPSCredential -Name $credentialName
    $tennantId = Get-AutomationVariable -Name 'tennantId'
    Login-AzureRmAccount -Credential $credential -Tenantid $tennantId -ServicePrincipal
 
    $AzureVMs = Get-AzureRmVM -ResourceGroup $ResourceGroup
 
    if($Action -eq "Stop")
    { 
        Write-Output "Stopping VMs"; 
        foreach -parallel ($AzureVM in $AzureVMs) 
        { 
            $AzureVM | Stop-AzureRmVM -Force
        } 
    } 
    else 
    { 
        Write-Output "Starting VMs"; 
        foreach -parallel ($AzureVM in $AzureVMs) 
        { 
            $AzureVM | Start-AzureRmVM
        } 
    } 
}

Azure Database for MySQL / PostgreSQL がGAしましたね

Azure Database for MySQL / PostgreSQL がGAとのアナウンス。お待ちしてました。

azure.microsoft.com

併せて、セキュリティとコンプライアンスのアナウンスも。

Securing Azure Database for MySQL and Azure Database for PostgreSQL | Blog | Microsoft Azure

Compliance offerings for Azure Database for MySQL and Azure Database for PostgreSQL | Blog | Microsoft Azure

SLASQL Databaseと同じく99.99%。なのですが、SLAのページを見るとMonthly uptime percentageが「< 99.9%」となってます(SQL DBと違う)。

(追記:2018年4月10日) いま見たら99.99%と表記されていました。

SLA for Azure Database for MySQL

GA価格は5月1日から適用、それまでは50%オフとのこと。コア数で比べるとRDS for MySQLのSingle-AZと同じくらいの金額ですかね。ベンチマークを取るとまたちょっと違った特性があるようなので、単純な比較はちょっと難しいかな?という印象でした。

サーバーをデプロイした後にPricing tier変更はまだできないようです。東日本、西日本ともハードウェアはGen4で、Memory Optimizedもまだ選べませんでした。

(追記: 2018年4月10日) こちらも東日本、西日本ともGen5、Memory Optiomizedとも選べるようになっていました。またストレージも最大2TB(6,144 IOPS)まで指定できるようになっていました。

azure.microsoft.com

ARMテンプレートのリファレンスはこちら。これも今後の充実に期待ですね。

docs.microsoft.com docs.microsoft.com

基本的なメトリックはAzure Monitorで取得出来ます。

docs.microsoft.com

ログはCLIでダウンロードする方式です。

docs.microsoft.com

そしてClearDBはMarketplaceから削除されたようです。これまでお世話になりました。

ClearDB removal from the Azure Marketplace

(追記: ARMのテンプレートを作っておきました)

gist.github.com

Hyper-Vの.vhdファイルからAzure仮想マシンのイメージを作成する(ポータルのGUIで)

たぶんもうちょっと前からあった機能だとは思いますが、ポータルのGUIから仮想マシンのイメージが作れたので記録しておきます。
「日本語版DVDからインストールしたWindows Server 2016が欲しい」というリクエストがあったのでやってみたらできました。

ここで紹介する手順は、いわゆる「仮想マシンのひな形」としての「イメージ」を作る手順なので、仮想マシンをそのままコピーする手順ではありません。そちらのケースは、今のところ.vhd経由だとGUIでは完結しないので、どうしてもと言うことであればAzure Site Recoveryをつかうとか別のアプローチになると思います。

Hyper-V 仮想マシン側の準備

基本的には公式ドキュメントにあるとおりに準備を進めて、Azure用の.vhdファイルを作ります。

docs.microsoft.com

Hyper-V仮想マシンが第2世代の場合はこのあたりで第1世代に変換しておくのが良いと思います。

第2世代仮想マシンを第1世代仮想マシンに変換

.vhdxから.vhdへの変換や固定サイズ化などは、Hyper-VマネージャのGUIでもできます。

www.atmarkit.co.jp

ちなみに、一部の仮想マシンシリーズではNested Virtualizationをサポートしているので、Azure仮想マシン上でHyper-Vを立ち上げてこのあたりの作業を進められるようになりました。Dv3やEv3シリーズあたりがそれです。

Azure Storageへのアップロードには、Azure Storage Explorerも使えます。「ページBLOB」としてアップロードしましょう。

azure.microsoft.com

「イメージ」の作成

アップロードが終わったらイメージの作成です。「イメージ」ブレードを開きます。

f:id:yhara90:20180114090518p:plain

「追加」をクリックします。

f:id:yhara90:20180114090557p:plain

名前などを適宜付けていきます。「ストレージBLOB」で、アップロードした.vhdを指定します。

f:id:yhara90:20180114090625p:plain

「作成」を押してしばらくすると、仮想マシンのイメージが出来上がります。

仮想マシンの作成

「イメージ」ブレードからイメージを開いて「VMの作成」をクリックします。

f:id:yhara90:20180114090752p:plain

あとはいつも通りに仮想マシンを作るだけです。

f:id:yhara90:20180114090903p:plain

ここまで。

気付かないうちにポータルもどんどん便利になりますね。