Azure Front Doorのキャッシュを更新する

 

Azure Front Doorにはコンテンツキャッシュの機能があります。

https://docs.microsoft.com/ja-jp/azure/frontdoor/front-door-caching

キャッシュの機能を利用する事により、バックエンドプール側の負荷を下げたり、レスポンスタイムの向上が期待できます。

キャッシュ自体は、アクセスされたURLパスを保持します。同じURLに対して2回目のアクセスからキャッシュが使用される動きとなります。

一方で、Front Door自体はバックエンドプール側のサイト更新を能動的に検知する事はありません。

キャッシュされている期間中は、バックエンドプール側でサイトが更新しても実際にアクセスしても反映されない状態になります。

その為、Front Doorでキャッシュを有効にした場合、キャッシュ更新を行う事が必要になります。

1.Azure Froot Doorのキャッシュはクリアだけできる

Azure Front Doorのキャッシュを手動で更新する事は出来ないそうです。

その為、キャッシュを更新するには、以下のように一度キャッシュクリアを行う必要があります。

    1. サイト更新
    2. キャッシュクリア
    3. サイトへのアクセス

Front Doorのキャッシュクリアには、Remove-AzFrontDoorContentコマンドを使用します。

https://docs.microsoft.com/ja-jp/powershell/module/az.frontdoor/Remove-AzFrontDoorContent?view=azps-3.8.0

今回はサンプルで以下のようなPowerShellを作成してみました。(GitHubにも公開しています。)

#Front DoorのキャッシュクリアをするPower Shell

param (
    [String] [Parameter(Mandatory=$true)]  $ResourceGroupName ,
    [String] [Parameter(Mandatory=$true)]  $FrontDoorName ,
    [String] [Parameter(Mandatory=$true)]  $ContentPath
    )

Remove-AzFrontDoorContent -ResourceGroupName $ResourceGroupName -Name $FrontDoorName -ContentPath $ContentPath
| where Category == “FrontdoorWebApplicationFirewallLog”
 

以下のように実行して頂く事で、キャッシュのクリアが可能です。

c:\FrontDoorのキャッシュをクリアする.ps1 -ResourceGroupName “リソースグループ名” -FrontDoorName “フロントドア名” -ContentPath “削除するパス (例:/*)”

サイト更新後に、今回のようなPower Shellを利用してキャッシュクリアする事により、更新したけど反映されないという事が防げるかと思います。

※マイクロソフトサポート様に色々ご教授頂きながら進めさせて頂きました。本当に有難うございます。

Azure Virtual Machineの稼働ステータスやIPアドレス、ディスクの情報を纏めて取得する(VM名を指定して取得する)

 

Azure Portal上で、Virtual Machineの設定を確認しようとすると、ディスクの情報はディスクのメニューを開き、ネットワークインターフェースの情報は、ネットワークインターフェースのメニューを開きという事で少し面倒。これをまとめて見れないかなぁという事で、Power Shellで見れるようにしてみました。

作成にあたっては以下の各コマンド(Get-AzDisk、Get-AzNetworkInterface)ガイドをサイトを参考に進めました。

https://docs.microsoft.com/en-us/powershell/module/az.network/get-aznetworkinterface?view=azps-3.8.0

https://docs.microsoft.com/en-us/powershell/module/az.compute/get-azdisk?view=azps-3.8.0

今回作成したものは GitHub上に公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/VM-Status-Get-20200424

1.Virtual Machineに関して取得する情報

Virtual Machine名を指定することによって、以下の情報を取得しています。必要に応じて適時追加削除してください。

    • Virtual Machine名
    • PowerState
    • VMSize
    • DISK名
    • DISKサイズ
    • DSIKのTier
    • Network Interface名
    • Private IP Address
    • 静的IP or 動的IP

2.Azure Virtual Machineの情報を取得するPower Shell

Get-AzVM でVirtual Machineの情報を取得し、その中にあるVM固有のIDを特定します。

Virtual Machineにディスクがアタッチされている場合は、このIDがディスクの情報に含まれます。そこで合致するディスクのディスク情報をGet-AzDiskで取得します。同じく ネットワークインターフェース情報はGet-AzNetworkInterfaceで取得しています。

また、Get-AzVMに-Statusオプションがないと、VMの稼働状況が取得出来ません。一方で、-StatusオプションをつけるとVmSizeが取得出来ません。その為、VmSizeの方は@{n=”VMSize”; e={$vm.HardwareProfile.VmSize}}とし、-Status無しの結果から値を取得しています。

#VMの情報を取得するPowerShell(基本編)

#VM名を指定して、IF名、IP、DISK名、サイズ、SKU等を取得

#パラメータ指定
param (
    [String] [Parameter(Mandatory=$true)] $VMName
    )

# VM Status 取得

$vm = Get-AzVM -name $VMName

# サブスクリプションID指定

$SubscriptionId =“サブスクリプションID”
Select-AzSubscription -SubscriptionId $SubscriptionId 

# VMの各情報を取得

Get-AzVm -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Status `
| select-Object Name,@{n=”Status”; e={$_.Statuses[1].Code}},@{n=”VMSize”; e={$vm.HardwareProfile.VmSize}}
& `
Get-AzDisk -ResourceGroupName $vm.ResourceGroupName`
| Where { $_.ManagedBy -contains $VM.id }`
| Select-Object @{n=”DiskNmae”; e={$_.Name}},DiskSizeGB,@{n=”Tier”; e={$_.sku.Name}}
& `
Get-AzNetworkInterface `
| Where { $_.VirtualMachine.id -contains $VM.id}`
| Select-Object @{n=”NWInterFaceNmae”; e={$_.Name}},`
@{n=”PrivateIP”; e={$_.IpConfigurations.PrivateIpAddress}},`
@{n=”PrivateIpAllocation”; e={$_.IpConfigurations.PrivateIpAllocationMethod}}

※なぜか、サブスクリプションIDの指定をしないと情報取得出来なかったので、今回は、Select-AzSubscriptionでサブスクリプションIDの指定を行っています。

3.Azure Virtual Machineの稼働ステータスやIPアドレス、ディスクの情報の取得結果

実際にPower Shellを実行してみると、以下のような結果が得られます。(今回はディスクを2本ついたVirtual Machineなので2つ表示されます。)

PS> c:\PowerShell\VMの情報を取得する(基本編)(公開用).ps1 -VMname VM名

Name : VM名
Status : PowerState/running
VMSize : Standard_B1ms


DiskNmae : OSディスク名
DiskSizeGB : 30
Tier : Standard_LRS


DiskNmae : データDISK名
DiskSizeGB : 30
Tier : StandardSSD_LRS


NWInterFaceNmae : ネットワークインターフェース名
PrivateIP : PrivateIP
PrivateIpAllocation : Static

※作成にあたって、躓くことがあり、マイクロソフトサポート様に大変貴重なアドバイスをいただいております。有難うございました。

Azure Application GatewayのARMテンプレートをPower Shell使ってエクスポートする

 

検証でAzure Application Gatewayの設定を行っていたのですが、設定項目が多く、いろいろな所の設定変更していくと、どこを変更した分からなくなる事が多々ありました。恥ずかしながらその結果、元に戻せてなくて設定がうまく行かないケースがありました。

Azure PortalでARMテンプレートのエクスポートするようにしたのですが、何度も繰り返しているのが面倒になってきたので、Power Shellでエクスポートをという事を試してみました。併せてGet-AzApplicationGatewayで設定情報を取得も実施してみました。

実施にあたっては以下のサイトを参考に進めました。

https://docs.microsoft.com/en-us/powershell/module/az.resources/export-azresourcegroup?view=azps-3.8.0
https://docs.microsoft.com/en-us/powershell/module/az.network/get-azapplicationgatewayhttplistener?view=azps-3.8.0

今回作成したものは GitHub上に公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/ApllicationGateway-Template-Export-20200422

1.Azure Application Gatewayのテンプレートエクスポート+情報取得

今回は、Get-AzApplicationGateway でApplication Gatewayの情報を取得しています。

また、Export-AzResourceGroupで、テンプレートのエクスポートを行います。Application Gateway名を指定することで、Application Gatewayのみのテンプレートをエクスポートします。

#Application Gateway Template Export

#取得するApplication Gatewayのパラメータ

$SubscriptionId = “サブスクリプションID”
$RG = “リソースグループ名”
$APGW = “Application Gateway名”
$TemplatePath =“テンプレートのパス(例:C:\temp)”

#Getコマンドで情報取得
Get-AzApplicationGateway -Name $APGW -ResourceGroupName $RG

#テンプレートをエクスポートする
Export-AzResourceGroup `
-ResourceGroupName $RG `
-Resource “/subscriptions/$SubscriptionId/resourceGroups/$RG/providers/Microsoft.Network/applicationGateways/$APGW”`
-Path $TemplatePath

 

なお、上記サンプルのように、Get-AzApplicationGatewayだけでそのまま情報を取得した場合、子に入っているSKUの情報等が取得出来ません。適時必要に応じて表示するようにして下さい。注意願います。

ARMテンプレートを使って、Azure Logic Appのデプロイしてみた(箱のみ)

 

Azure Logic AppをARMテンプレートを利用してデプロイしてみました。
ARMテンプレートのデプロイはPower Shellを使用します。
ARMテンプレートで指定するParameterは、CSVファイルから読み込みます。

Logic Appのデプロイ自動化については、下記サイトに記載があります。今回は下記サイトを参考に一番基本的な部分だけを作るまでをやってみました。(箱だけを作ってます。)

https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-azure-resource-manager-templates-overview

作成状況を以下のようにしています。

    • Logic Appを2つ作成する
    • Logic Appのテンプレートを使う
    • Logic Appは基本設定のみ
    • パラメータの指定はCSVファイルを利用する
    • デプロイ先のリソースグループはデプロイ時に指定する

今回作成したものは GitHub上に公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/LogicApp_Deploy_Basic_20200418

1 .Logic AppのARMテンプレート

Azure Portalを利用してGUIでLogic Appのデプロイを行う場合、以下の内容を指定します。今回は一番基本的な部分のみという事で、同じ内容を指定するようにしています。

    • Logic App名
    • リソースグループ名
    • ロケーション
    • Tag
    • Log Analyticsの使用可否、ワークスペース名(今回は無しにしています。)

LogicApp-template-Basic-01.json

{
    “$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
    “contentVersion”: “1.0.0.0”,
    “parameters”: {
        “workflows_LogicApp_name”: {
            “type”: “String”,
            “metadata”: {}
        },
        “location”: {
            “type”: “String”,
            “defaultValue”: “japaneast”,
            “metadata”:{} 
        },
        “tag”: {
            “type”: “String”,
            “defaultValue”:”notag”,
            “metadata”:{} 
        }
    },
    “variables”: {},
    “resources”: [
        {
            “type”: “Microsoft.Logic/workflows”,
            “apiVersion”: “2017-07-01”,
            “name”: “[parameters(‘workflows_LogicApp_name’)]”,
            “location”: “[parameters(‘location’)]”,
            “tags”: {
                “division”: “[parameters(‘tag’)]”
            },
            “properties”: {
                “state”: “Enabled”,
                “definition”: {
                    “$schema”: “https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#”,
                    “contentVersion”: “1.0.0.0”,
                    “parameters”: {},
                    “triggers”: {},
                    “actions”: {},
                    “outputs”: {}
                },
                “parameters”: {}
            }
        }
    ]
}

.ARMテンプレートのパラメータ設定用のCSVファイルを作成する

Logic App を作成する為にCSVから読み込むパラメータは以下の3つになります。この3つを指定するCSVを作成します。

    • Logic App名
    • ロケーション
    • Tag

LogicApp-Basic.csv

LogicAppName,location,tag
LogicApp-Test01,japaneast,,
LogicApp-Test02,japaneast,TAG-Test,

3. Power ShellでARMテンプレートをデプロイする

デプロイ先のリソースグループ名、テンプレートファイルのパス、CSVファイルのパスを指定してデプロイを実施します。

TemplateDeploy_ImportCSV(LogicApp用)_01(公開用).ps1

#Logic App Template Deploy
#基本設定(RG名、LogicApp名、Location、Tagのみ指定)

param (
[String] [Parameter(Mandatory=$true)] $ResourceGroupName
)

$TemplateFilePath = “テンプレートファイルのパス名”
$ImportCSVPath = “CSVファイルのパス名”

# Inclued Configure Entries
$csv = Import-Csv -path $ImportCSVPath

# Template Deploy
foreach( $c in $csv ){

New-AzResourceGroupDeployment -ResourceGroupName $ResourceGroupName `
-TemplateFile $TemplateFilePath `
-workflows_LogicApp_name $c.LogicAppName `
-location $c.location `
-tag $c.tag
}

作成が成功すると、以下の通りにLogic Appが作成されたログが表示されます。

Outputs :

eploymentName : LogicApp-template-Basic-01
ResourceGroupName : リソースグループ名
ProvisioningState : Succeeded
Timestamp : 作成時刻
Mode : Incremental
TemplateLink :
Parameters :
Name Type Value
========================= ========================= ==========
workflows_LogicApp_name String LogicApp-Test01
location String japaneast
tag String

DeploymentName : LogicApp-template-Basic-01
ResourceGroupName : リソースグループ名
ProvisioningState : Succeeded
Timestamp : 作成時刻
Mode : Incremental
TemplateLink :
Parameters :
Name Type Value
========================= ========================= ==========
workflows_LogicApp_name String LogicApp-Test02
location String japaneast
tag String TAG-Test

CSVで指定した値で作成した値で作成されている事が確認できます。

ARMテンプレートを使って、Network Security Groupのデプロイしてみた(特定のIPからRDPを許可)

 

Azure Network Security Group(NSG)のデプロイをARMテンプレート使ってやってみました。

今回は一番初期に使うパターンとして多い、RDP(ポート番号3389)を特定のIPから許可する設定で試してみました。

※間違って、RDPをInterNetにAnyで許可してしまう事を防げないかなぁという事でARMテンプレートを作成してみました。

1 .NSGのテンプレート

今回は、特定IPからのRDPを許可するセキュリティ規則を作成してます。下記サンプルを適当な名前を付けて、JSON形式(拡張子をJSON)にしてファイルを保存します。

サンプルでは以下の値をパラメータとして指定するようにしています。

    • NSG名
    • ロケーション(デフォルト値を東日本としています)
    • NSGのルール名(デフォルト値をRDP-Permitとしています)
    • RDPを許可するIP
{

    “$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
    “contentVersion”: “1.0.0.0”,
    “parameters”: {
        “NSGName”: {
            “type”: “String”,
            “metadata”: {}
        },
        “location”: {
            “type”: “String”,
            “defaultValue”: “japaneast”,
            “metadata”:{} 
        },
        “NSGRuleName”: {
            “type”: “String”,
            “defaultValue”: “RDP-Permit”,
            “metadata”:{} 
        },
        “PermitIP”: {
           “type”: “String”,
           “metadata”:{} 
        }
    },
    “variables”: {},
    “resources”: [
        {
            “type”: “Microsoft.Network/networkSecurityGroups”,
            “apiVersion”: “2019-11-01”,
            “name”: “[parameters(‘NSGName’)]”,
            “location”: “[parameters(‘location’)]”,
            “properties”: {
                “securityRules”: [
                    {
                        “name”: “[parameters(‘NSGRuleName’)]”,
                        “properties”: {
                            “protocol”: “*”,
                            “sourcePortRange”: “*”,
                            “destinationPortRange”: “3389”,
                            “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                            “destinationAddressPrefix”: “VirtualNetwork”,
                            “access”: “Allow”,
                            “priority”: 100,
                            “direction”: “Inbound”,
                            “sourcePortRanges”: [],
                            “destinationPortRanges”: [],
                            “sourceAddressPrefixes”: [],
                            “destinationAddressPrefixes”: []
                        }
                    }
                ]
            }
        },
        {
            “type”: “Microsoft.Network/networkSecurityGroups/securityRules”,
            “apiVersion”: “2019-11-01”,
            “name”: “[concat(parameters(‘NSGName’), ‘/’, parameters(‘NSGRuleName’))]”,
            “dependsOn”: [
                “[resourceId(‘Microsoft.Network/networkSecurityGroups’, parameters(‘NSGName’))]”
            ],
            “properties”: {
                “protocol”: “*”,
                “sourcePortRange”: “*”,
                “destinationPortRange”: “3389”,
                “sourceAddressPrefix”: “[parameters(‘PermitIP’)]”,
                “destinationAddressPrefix”: “VirtualNetwork”,
                “access”: “Allow”,
                “priority”: 100,
                “direction”: “Inbound”,
                “sourcePortRanges”: [],
                “destinationPortRanges”: [],
                “sourceAddressPrefixes”: [],
                “destinationAddressPrefixes”: []
            }
        }
    ]
}

 

※デフォルトルールは、テンプレートには必要無いようです。

.ARMテンプレートをPower Shellでデプロイする

1.で作成したARMテンプレートをPower Shellでデプロイします。
今回のサンプルではリソースグループ名、ロケーション名、セキュリティ規則名はデプロイ用のPower Shellに直接記載しています。Power Shellでデプロイ時にNSGの名前、RDPを許可するIPを指定できるようにしています。

#NSG Template Deploy

param (
  [String] [Parameter(Mandatory=$true)]  $NSGName ,
  [String] [Parameter(Mandatory=$true)]  $Address
    )

$resourceGroupName = “リソースグループ名”
$location = “ロケーション名”
$NSGRuleName =“セキュリティ規則名”
$TemplateFilePath = “テンプレートのパス”

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
  -TemplateFile $TemplateFilePath `
  -NSGName $NSGName `
  -NSGRuleName $NSGRuleName `
  -PermitIP $Address `
  -location $location

NSGが出来た後に、SubnetやNetwork Interfaceとの関連付けを行ってください。この編のPower Shellは随時公開していきたいと思います。

今後は、サービスタグの指定、複数のセキュリティ規則を一括して作成するなど、環境に合わせて作成できるようにしていきたい所です。

Log Analytics ワークスペースを複数まとめてデプロイしてみた

 

Log AnalyticsのワークスペースのデプロイをARMテンプレートを利用して実施してみました。 テンプレートで指定するParameterをCSVファイルから読み込むようにしてみました。

今回は下記条件で実施してみました。

    • Log Analyticsワークスペースを3つ作成する
    • Log Analyticsワークスペースをテンプレートファイルを利用してデプロイする
    • パラメータはCSVファイルを利用する
    • パラメータはデプロイ時に指定する

※サンプルはGitHubにも公開しています。

1 .Log Analytics ワークスペースを作成するARMテンプレート

マイクロソフト様の下記サイトに記載の内容を参考(ほとんどそのままです)にしています。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/learn/quick-create-workspace-posh#create-a-workspace

defaultValue値は環境に合わせて変更してください。(今回はSKUをPer2018で固定しています。)

{

“$schema”: “https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#”,
“contentVersion”: “1.0.0.0”,
 ”parameters”: {
  ”workspaceName”: {
   ”type”: “String”,
   ”metadata”: {}
 },
 ”location”: {
  ”type”: “String”,
   ”defaultValue”: “eastus2”,
    ”metadata”: {}
 },
 ”sku”: {
  ”type”: “String”,
   ”allowedValues”: [
    ”PerGB2018″
   ],
   ”defaultValue”: “PerGB2018”,
    ”metadata”: {}
   }
 },
“resources”: [
 {
 ”type”: “Microsoft.OperationalInsights/workspaces”,
  ”name”: “[parameters(‘workspaceName’)]”,
  ”apiVersion”: “2015-11-01-preview”,
  ”location”: “[parameters(‘location’)]”,
  ”properties”: {
  ”sku”: {
  ”Name”: “[parameters(‘sku’)]”
 },
 ”features”: {
 ”searchVersion”: 1
}}}]}

.ARMテンプレートのパラメータを指定するCSVファイルを作成する

Log Analyticsワークスペースで指定する、パラメータは以下の3つになります。

    • ワークスペース名 (変数名;workspaceName)
    • ロケーション (変数名;location)
    • SKU (変数名;sku)

テスト用のパラメータCSVファイルは下記通り作成しています。

workspaceName,location,sku

test-201-20200328,eastus2,PerGB2018
test-202-20200328,eastus2,PerGB2018
test-203-20200328,japaneast,PerGB2018

3. Power ShellでARMテンプレートをデプロイする

デプロイ先のリソースグループ名、ARMテンプレートファイルのパス、CSVファイルのパスを指定してデプロイを実施します。

#Log Analyitcs ワークスペースデプロイ用Power Shell

$resourceGroupName = “デプロイ先のリソースグループ名”
$TemplateFilePath = “テンプレートファイルのパス”
$ImportCSVPath = “CSVのファイルのパス”

# Import Parameter Csv
$csv = Import-Csv -path $ImportCSVPath

# Template Deploy
foreach( $c in $csv ){

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
 -TemplateFile $TemplateFilePath `
 -workspaceName $c.workspaceName `
 -location $c.location `
 -sku $c.sku
}

作成が成功すると、以下の通りにLog Analyticsのワークスペースが作成されたログが表示されます。

Outputs :

DeploymentDebugLogLevel :

DeploymentName : LogAnalytics_WorkSpace
ResourceGroupName : リソースグループ名
ProvisioningState : Succeeded
Timestamp : 作成時刻
Mode : Incremental
TemplateLink :
Parameters :
Name        Type          Value
=============== ================= ==========
workspaceName    String          test-203-20200328
location       String         japaneast
sku         String                                  PerGB2018

CSVで指定した値で作成した値で作成されている事が確認できます。

ARMテンプレートを使ってAzure Monitorのアクショングループをデプロイしてみた

 

Azure MonitorのアクショングループをARMテンプレートを利用してデプロイしてみました。今回はメール送信のアクショングループを作成してみました。下記サイトのARMテンプレートを参考に作成しています。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/action-groups-create-resource-manager-template

ARMテンプレート内のvariables 関数で変数を指定するようにしてます。

今回作成した内容はGithubにも公開しています。

.アクショングループで設定する内容

Azure Monitorのアラートを選択します。アクションの管理が表示されるので選択し、表示されるアクショングループの追加をクリックします。そうすると、以下の画面が表示されます。

今回、指定する値は、以下の通りになります。

  • アクショングループ名
  • 短い名前
  • サブスクリプション(デプロイ時に指定します)
  • リソースグループ(デプロイ時に指定します)
  • 操作名
  • アクションの種類(今回は電子メールを想定しま。)
  • 電子メールアドレス(アクションの種類で電子メールを選択すると入力できます)

.アクショングループのARMテンプレートを作成する

電子メールを送信するアクショングループのテンプレートは下記のようになります。テンプレート内のemailReceiversが電子メールに関するアクションを定義する項目になります。

{
 ”$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
 ”contentVersion”: “1.0.0.0”,
 ”variables”: {
   “actionGroupName”: “アクショングループ名”,
   “actionGroupShortName”: “短い名前”,
   “OperationName”: “操作名”,
   “emailAddress”: “送信先の電子メールアドレス”
    },

  },
  ”resources”: [
  {
   ”type”: “Microsoft.Insights/actionGroups”,
   ”apiVersion”: “2018-03-01”,
   ”name”: “[variables(‘actionGroupName’)]”,
   ”location”: “Global”,
   ”properties”: {
    ”groupShortName”: “[variables(‘actionGroupShortName’)]”,
    ”enabled”: true,
    ”emailReceivers”: [
     {
     ”name”: “[variables(‘OperationName’)]”,
     ”emailAddress”: “[variables(‘emailAddress’)]”
     }
    ]
   }
  }
 ],
 ”outputs”:{
  ”actionGroupId”:{
  ”type”:”string”,
  ”value”:”[resourceId(‘Microsoft.Insights/actionGroups’,variables(‘actionGroupName’))]”
  }
 }
}

.Power ShellでARMテンプレートをデプロイする

最後に、作成したARMテンプレートをPower Shellでデプロイします。デプロイ方法は下記を参考にしています。Power Shell実行時に、Action Groupを作成するリソースグループ名を指定します。

https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/deploy-powershell#deploy-local-template

#テンプレートをデプロイするPowerShell
$resourceGroupName = Read-Host -Prompt “Enter the Resource Group name”
$TemplateFilePath = “テンプレートファイルのパス(ex;”C:\tmp\ActionGroup_templete.json”)”

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
-TemplateFile $TemplateFilePath
 

最後に以下のPower Shellで実際にAction Groupができているか確認します。

$resourceGroupName = “リソースグループ名”
$actionGroupName = “アクショングループ名”

Get-AzActionGroup -ResourceGroupName $resourceGroupName -Name $actionGroupName

 

Azure Log Analytics ワークスペースの復活から完全削除をやってみた

 

Azure Log Analytics ワークスペースの復活から完全削除を試してみました。

Log Analyticsのワークスペース削除を行った後に、同じ名前で作成しようとした所、エラーになりました。
何故?という事で色々確認させて頂いた所、Log Analyticsのワークスペースについては、論理削除されて14日間は同じワークスペース名で作成しようとしてもエラーになる事がわかりました。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/delete-workspace

ホームページを確認した所、一度復活したのちに、REST APIで削除する必要がわる事がわかったので試してみました。

1 .Log Analytics ワークスペースの復活を行う

REST APIを用いた削除は、Log Analyticsのワークスペースが存在する状態でないとできません。
そこでワークスペースの復活を行います。以下のPower Shellで実行が可能です。

Power Shell実行時は、ファイル名.ps1 -workspacename “復活するワークスペース名”で実行して下さい。(REST APIでも可能です。)

#LogAnalyticsワークスペースを復活する。
#参考URL
#https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/delete-workspace

param (
[String] [Parameter(Mandatory=$true)] $workspacename
)

$ResourceGroupName = “RG名”
$location = “ロケーション名”

New-AzOperationalInsightsWorkspace -ResourceGroupName $ResourceGroupName -Name $workspacename -Location $location

2.改めてワークスペースの削除を行う。

2020年1月末時点では、ワークスペースの完全削除については、REST APIを用いた削除しか提供されていません。マイクロソフト様の以下のホームページにREST APIが提供されています。こちらを利用して完全削除します。まず、以下のホームページへ移動し、Try Itの部分をクリックします。

https://docs.microsoft.com/en-us/rest/api/loganalytics/workspaces/delete

Try Itをクリックすると、以下のページが表示されますので、サブスクリプションID、リソースグループ名、削除するワークスペース名、ロケーション名を入力します。
併せて以下のように、name部分にforceと入力し、値部分にtrueと入力します。

Runをクリックし、実行します。
成功するとステータスコードに200 OKが戻ってきます。これで完全削除完了です。

ホームページにも記載の通り、完全に削除すると復活できないので注意して下さい。

※本件、コマンド等については、マイクロソフトサポート様にご教授頂いております。有難うございました。

Azure Application Gatewayのエラーページを更新するPower Shell

 

Application Gatewayでシステムメンテナンス等でPoolメンバーの仮想マシンを全部停止した場合は、デフォルトの502エラーページが表示されます。
システムメンテナンスを案内する場合には、Listenerに502エラーや403エラーページを設定することで、Application Gatewayの機能でカスタムエラーページの表示が可能になります。
エラーページは、Blobストレージのパス等固定のURLを指定する事で設定できます。

今回は、システムメンテナンス等で定時にファイル更新するケースがあったので、Power Shellでカスタムエラーページの設定を更新できるようにしてみました。

前回の記事にも記載した通り、Application  Gatewayのキャッシュに保存されるため、更新にはファイル名の変更が必要になります。

Azure Application Gatewayの起動、停止をPower Shellでやってみた

1 .BlobストレージにファイルをアップロードするPower Shell

まず、事前にエラーページのHTMLファイルをBlobストレージにしておきます。以下のページを参考にPower Shellを作成しています。

https://docs.microsoft.com/en-us/powershell/module/az.storage/set-azstorageblobcontent?view=azps-3.3.0

※Content Typeを指定しないと、ファイルとしてアップロードはできますが、エラーページとして表示出来ないので注意が必要です。

# Blobストレージにファイルをuploadする
# 参考URL
# https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-quickstart-blobs-powershell#upload-blobs-to-the-container

# パラメータ
$resourceGroupName = “ストレージアカウントのRG名”
$StorageAccountName = “ストレージアカウント名”
$containerName = “コンテナ名”
$LocalFilePath = “アップロードするファイルパス”

# 処理部分
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $StorageAccountName
$ctx = $storageAccount.Context

Set-AzStorageBlobContent -File $LocalFilePath `
-Container $containerName `
-Properties @{“ContentType” = “text/html”} `
-Context $ctx

.Azure Application Gatewayのエラーページを更新するPower Shell

以下のページを参考に更新するPower Shellを作成しています。

https://docs.microsoft.com/ja-jp/powershell/module/az.network/set-azapplicationgatewayhttplistenercustomerror?view=azps-3.3.0&viewFallbackFrom=azps-2.4.0

# APGW Custom error Page Update
# 参考URL
# https://docs.microsoft.com/ja-jp/powershell/module/az.network/set-azapplicationgatewayhttplistenercustomerror?view=azps-3.3.0&viewFallbackFrom=azps-2.4.0

#パラメータ
$resourceGroupName = “Application GatewayのRG名”
$APGWName =“Application Gateway名”
$ListenerName = “リスナー名”
$StatusCode = “更新対象のエラーコード(ex;HttpStatus403)”
$customErrorUrl = “ErrorページのURL(ex;https://Blobストレージ名.blob.core.windows.net/コンテナ名/ファイル名)”

#処理部分
$AppGw = Get-AzApplicationGateway -Name $APGWName -ResourceGroupName $resourceGroupName
$httplistner = Get-AzApplicationGatewayHttpListener -Name $ListenerName -ApplicationGateway $Appgw
$updatelistener = Set-AzApplicationGatewayHttpListenerCustomError -HttpListener $httplistner -StatusCode $StatusCode -CustomErrorPageUrl $customErrorUrl
Set-AzApplicationGateway -ApplicationGateway $AppGw

※マイクロソフトサポート様に指摘/修正頂き完成しています。本当にありがとうございます。

.留意点

エラーページを設定している、URLのパス名やファイル名が更新された場合は、Application Gatewayを再起動しなくても反映されます。
同じファイル名でメンテナンス画面をアップするような方法ですと、Application Gatewayの再起動が必要となり停止時間が発生します。
その為、メンテナンス画面の更新は、今回のように事前にBlobストレージにファイルをアップしたうえで、パス名を切り替えるのが一番良さそうです。

Azure Application Gatewayの起動、停止をPower Shellでやってみた

 

Azure Application Gatewayの起動停止を試してみました。Azure Portal上で出来なかった為、Power Shellで実施してみました。

Application Gatewayで403エラーページを更新した際に反映されないという事象がありました。Application Gatewayを停止、起動したら改善するんじゃない?という事で試してみた所うまく行きました。

。。。ですがが、実際にはエラーページの更新は自分のやり方が間違ってました。

Application Gateway側にカスタムエラーページのキャッシュを持っており、これはカスタムエラーページのファイル名(もしくはパス)を変更して保存しない限り更新されないそうです。(公開情報にも記載がありました。)

※なお、Application Gatewayを停止しても、課金は停止しないそうです。

1 .Azure Application Gatewayの停止、起動を行う

マイクロソフトサポート様から教えて頂いたコマンドになります。(有難うございました。)

※本コマンドでの停止、起動には5分ほど掛かります。

#Application Gateway Restart PowerShell

# APGW Parameter

$ResourceGroupName = “Application Gatewayが所属するRG名”
$APGWName = “Application Gateway名”
 
$ag = Get-AzApplicationGateway -Name $APGWName -ResourceGroupName $ResourceGroupName

# APGW Stop

Stop-AzApplicationGateway -ApplicationGateway $ag

# APGW Start

Start-AzApplicationGateway -ApplicationGateway $ag

 

.Azure Application Gateway再起動の重要な注意点

注意点として、V1の場合グローバルIPが動的であるため、Application Gateway再起動により、グローバルIPが変わります。3回ほど実施してみましたが、100%変わりました。
その為DNS登録時は、グローバルIPのFQDNをCNAMEで登録するようにしておいてください。(これが推奨なので通常はそういう設定されているかと思いますが、自分はAレコードで登録していた為、少し焦りました。)

Azure Virtual Machineを別テナントに移してみた

 

Azureのテナント間での仮想マシンを移行を試してみました。

仮想マシンのManaged DisksをいったんBLOBストレージにVHDファイルとして保管する必要があるようでした。VHDファイルをManaged Disksに戻し仮想マシンを作成することで実現出来ました。

Power Shellを利用して仮想マシンのテナント間の移行を実施してみました。

主な実施手順は以下の通りになります。

    • Managed Disksを別テナントのBlobストレージにコピーする
    • コピーしたファイルをManaged Disksに戻す
    • Managed DisksからVMを作成する(今回は割愛しています。)

※なお、同じテナントの別サブスクリプションへは、Managed Disksのまま移行が可能です。

1 .Managed Disksを別テナントのBlobストレージにコピーする

以下のサイトを参考に、Managed Disksをダウンロードせずに、直接Blobストレージにコピーしています。なお、サイト記載のサンプルをAz化しています。

https://docs.microsoft.com/ja-jp/archive/blogs/jpaztech/export-managed-disks-to-vhd

事前にコピー先のテナントには、ストレージアカウントとBlobストレージのコンテナを準備しておきます。
また、各テナントにログインが必要になりますので、適時ログインして下さい。

※本コマンドを発行前には、対象の仮想マシンは停止しておいてください。

#Managed Disk Copy PowerShell

# コピー元へのログイン
Login-AzAccount
Select-AzSubscription -SubscriptionId  “コピー元のサブスクリプション ID”

# コピー元のディスクパラメータ
$sourcergname = “コピー元リソースグループ名”
$diskname = “コピー対象のManagedDisk名”

# SAS URL の作成
$mdiskURL = Grant-AzDiskAccess -ResourceGroupName $sourcergname -DiskName $diskname -Access Read -DurationInSecond 3600

# コピー先の情報
# コピー先テナントにログイン

Login-AzAccount
Select-AzSubscription -SubscriptionId  “コピー先のサブスクリプション ID”

# コピー先の各種パラメーター
$targetrgname = “コピー先リソースグループ名”
$storageacccountname = “コピー先ストレージアカウント名”
$countainername = “コピー先コンテナ名”

$storageacccountkey = Get-AzStorageAccountKey -ResourceGroupName $targetrgname -Name $storageacccountname
$storagectx = New-AzStorageContext -StorageAccountName $storageacccountname -StorageAccountKey $storageacccountkey[0].Value
$targetcontainer = Get-AzStorageContainer -Name $countainername -Context $storagectx

$destdiskname = “コピー後のファイル名”
$sourceSASurl = $mdiskURL.AccessSAS

# コピー
$ops = Start-AzStorageBlobCopy -AbsoluteUri $sourceSASurl -DestBlob $destdiskname -DestContainer $targetcontainer.Name -DestContext $storagectx
Get-AzStorageBlobCopyState -Container $targetcontainer.Name -Blob $destdiskname -Context $storagectx -WaitForComplete

 

.コピーしたファイルをManaged Disksに戻す

コピーしたファイルをコピー先のテナントでManaged Disksに戻します。以下のサイトを参考に戻すPower Shellを作ってみました。

https://docs.microsoft.com/ja-jp/archive/blogs/jpaztech/convertvhdtomanageddiskdeployvm

複数のサブスクリプションにログインした状態での作業となるため、作業ミス防止用に明示的にサブスクリプションを指定を追加しています。

vhdのURLは、以下の方法で確認が可能です。
Azure Portal上で、ストレージ アカウントを選択→Blobを選択→ファイルが保管された コンテナーを選択→対象のディスクファイルを選択。プロパティが表示されますが、この中のURLがVHDのURLとなります。

なお、OS Typeを指定しないと、後の作業で仮想マシン作成ボタンが押せない状態となります。

# VHD→ManagedDisk PowerShell

#Select Subscription
$SubscriptionId =“コピー先のサブスクリプションID”
Select-AzSubscription -SubscriptionId $SubscriptionId

#Parameter
$ResourceGroupName = “ManagedDiskのRG名”
$location = “ManagedDiskのロケーション”
$DiskName = “作成するManagedDisk名”
$vhdUri = “コピーしたファイルのURL”
$AccountType =“ストレージアカウントのType (ex; Standard_LRS)”<
$OsType = ”ManagedDiskのOS Type (ex; Linux)”

#Disk Config
$DiskConfig = New-AzDiskConfig `
-AccountType $AccountType `
-Location $Location `
-CreateOption Import `
-SourceUri $vhdUri `
-OsType $OsType

#VHD → Managed Disk
New-AzDisk `
-DiskName $DiskName `
-Disk $DiskConfig `
-ResourceGroupName $ResourceGroupName

完了すると、新たにManaged Disksができています。

作成したManaged Disksを選択すると、仮想マシンの作成というボタンが表示されてますのでクリックします。そうすると仮想マシンが作成されます。

 

Azure VPN Gatewayを使ってテナント間を接続をしてみた

 

Azureのネットワーク接続には、Virtual Network Peering等色々な手段があります。

Azureの別テナント間を直接接続は、Azure VPN Gatewayのサイト間接続で実現できます。

そこで、今回は以下のサイトを参考に、Azureテナント間の接続をPower Shellで実施しました。

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-tutorial-create-gateway-powershell

1 .VPN Gatewayを作成する為のPower Shell

以下のサンプルでは、グローバルIPやSubnetを新規に作成しています。
今回はSKUはBasic、ルートベースで作成しています。各接続環境に必要な情報を設定し、各テナントで下記Power Shellを実行します。

#VPN GW Create PowerShell

#RG Name Location
$resourceGroupName = “Resouece Gropu Name”
$location = “Location(ex;eastjapan)”

#VNET Subnet
$VnetName = “Virtual Network Name”
$SubAddress =“XXX.XXX.XXX.XXX/XX”

#Public IP
$PubIPName = “Public Ip Name”

#VPN GW
$GwName = “VPN GW Name”
$gatewayType = “GW Type(ex;Vpn)”
$VpnType = “RouteBased”
$GatewaySKU = “Basic”

#PubIP Create

$Pubip = New-AzPublicIpAddress `
-Name $PubIPName `
-ResourceGroupName $resourceGroupName `
-Location $location `
-AllocationMethod Dynamic

#Subnet Create
$virtualNetwork = get-AzVirtualNetwork `
-Name $VnetName `
-ResourceGroupName $resourceGroupName

Add-AzVirtualNetworkSubnetConfig `
-Name ‘GatewaySubnet’ `
-AddressPrefix $SubAddress `
-VirtualNetwork $virtualNetwork `

$virtualNetwork | Set-AzVirtualNetwork

$subnet = Get-AzVirtualNetworkSubnetConfig `
-Name ‘GatewaySubnet’ `
-VirtualNetwork $virtualNetwork `

#GW Create

$gwipconf = New-AzVirtualNetworkGatewayIpConfig `
-Name $GwName `
-Subnet $subnet `
-PublicIpAddress $Pubip

New-AzVirtualNetworkGateway `
-Name $GwName `
-ResourceGroupName $resourceGroupName `
-Location $location `
-IpConfigurations $gwipconf `
-GatewayType $gatewayType `
-VpnType $VpnType `
-GatewaySku $GatewaySKU

.接続を作成する為のPower Shell

異なるテナント間の接続を作成する場合は、GUIから出来ず、Power Shell等で作成する必要があります。 まず、接続先(対抗側)のVPN GatewayのIDが必要になります。以下のコマンドで確認します。(注:今回接続を作成する対抗側のサブスクリプションで下記コマンドを実行します。)

Get-AzVirtualNetworkGateway -Name “VPN GW Name” -ResourceGroupName “Resouece Gropu Name” |fl id

Id : /subscriptions/・・・・

 

上記コマンドのId:で表示される値を、$GwId2の部分に埋めて以下のPower Shellを実行します。(注:接続元と接続先の情報を混同しないように注意します。)

#接続を作成する側の情報
$resourceGroupName1 = “接続元RG名”
$location1 = “接続元ロケーション(ex;japaneast)”
$GwName1 = “接続先VPN GW 名”
$ConnectionName = “接続名”
$SharedKey = “共有キー (PSK)”

#接続先の情報
$GwName2 = “接続先VPN GW Name”
$GwId2 = “/subscriptions/・・・・/接続先VPN GW 名”

#接続先の情報を作成する
$vnet2gw = New-Object -TypeName Microsoft.Azure.Commands.Network.Models.PSVirtualNetworkGateway
$vnet2gw.Name = $GwName2
$vnet2gw.Id = $GwId2

#接続を作成する
$vnet1gw = Get-AzVirtualNetworkGateway -Name $GWName1 -ResourceGroupName $resourceGroupName1
New-AzVirtualNetworkGatewayConnection `
-Name $ConnectionName `
-ResourceGroupName $resourceGroupName1 `
-VirtualNetworkGateway1 $vnet1gw `
-VirtualNetworkGateway2 $vnet2gw `
-Location $location1 `
-ConnectionType Vnet2Vnet `
-SharedKey $SharedKey

これで接続が作成されますので、接続先側でも同様に上記Power Shellを実行すると、接続が完了します。

Azure Portal上で、仮想ネットワーク ゲートウェイの接続を選択し、今回作成した接続名をクリックすると、以下のように状態が接続中になるかと思います。

※片方のみ作成されている場合は状態がupdatingになります。

Network Security Groupの既存ルールにアクセス制限IPを追加するPower Shell

 

Network Security Group(NSG)で、アクセス元のIPを制限したりするケースもあるかと思います。
既存NSGの特定ルールにアクセス元のIPを追加作業を日々行う必要があったので、簡単にしようという事で、既存ルールへのIP追加をPower Shellで行ってみました。

1 .既存NSGルールにソースIPを追加するPower Shell

以下のサンプルでは、Source Address Prefixに、IPを追加しています。
今回はPower Shell実行時に、NSG名、NSGルール名、追加するAddressを変数で指定するようにしています。

#NSG Rule Update(SourceAddressPrefix)

param (
[string] [Parameter(Mandatory=$true)] $NSGName,
[string] [Parameter(Mandatory=$true)] $NSGRuleName,
[string] [Parameter(Mandatory=$true)] $Address
)

$resourceGroupName = “RG名”

# Get the NSG resource
$nsg = Get-AzNetworkSecurityGroup -Name $NSGName -ResourceGroupName $resourceGroupName

# New Prefix List
$newPrefix = New-Object ‘System.Collections.Generic.List[string]’

# Existing Prefix Add
($nsg.SecurityRules | where {$_.Name -eq $NSGRuleName}).SourceAddressPrefix | foreach { $newPrefix.Add($_) }

# New Prefix Add
$newPrefix.Add($Address)

# New Prefix Rewrite
($nsg.SecurityRules | where {$_.Name -eq $NSGRuleName}).SourceAddressPrefix = $newPrefix

# Reflect changes
$nsg | Set-AzNetworkSecurityGroup

以下のように、NSG名等を指定しPowerShell実行します。(今回はPowerShell名を、NSG_Rule_Update_SourceIP.ps1としています。)

c:\./NSG_Rule_Update_SourceIP.ps1 -NSGName NSG名 -NSGRuleName NSGルール名 -Address 追加するIPアドレス

 

ARMテンプレートを使ってSQL Serverをデプロイしてみた(ディスクサイズを指定)

 

Azure環境にVirtual Machine(Windows SQL Server)をデプロイすると、デフォルトでデータディスクが1TBで作成されてしまいます。後で修正も可能なのですが、面倒なのでデプロイ時からディスクサイズを制限するようにARMテンプレートを作成してみました。

1 .Windows SQL Serverをデプロイする為のJsonファイルを作成する。

基本的な仮想マシンの設定で作っています。適時値を入れてください。

今回は簡易的なものなので、OSのUserとパスワードは平文で記載しています。大体の設定値をvariablesで定義するように構成しています。NICとOSディスク名は仮想マシンの値を変数として取得する形で作成しています。 

データディスクのサイズは、diskSizeGBの値で指定が可能です。(今回は128GBで設定しています。)

まず、以下のPowerShellで、Windows SQL ServerのVMイメージを確認します。

#Image List get

$location=“japaneast”

#pubName Get
#Get-AzVMImagePublisher -Location $location

$pubName=“MicrosoftSQLServer”

#offer Name Get
#Get-AzVMImageOffer -Location $location -Publisher $pubName

$offerName=“SQL2008R2SP3-WS2008R2SP1”
Get-AzVMImageSku -Location $location -Publisher $pubName -Offer $offerName

JSONテンプレートサンプルになります。(今回はSQL Server 2008を選択しています。)

{
“$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
“contentVersion”: “1.0.0.0”,
“variables”: {
  “location”: “japaneast”,

  “vmName”: “VM名”,
  “vmSize”: “Standard_B2s”,

  “adminUsername”: “User Name”,
  “adminPassword”: “Password”,

  “publisher”: “MicrosoftSQLServer”,
  “offer”: “SQL2008R2SP3-WS2008R2SP1”,
  “sku”: “Standard”,

  “nicName”: “[concat(variables(‘vmName’),’_nic’)]”,
  “addressPrefix”: “XXX.XXX.XXX.XXX/XX”,
  “subnetName”: “Subnet Name”,
  “subnetPrefix”: “XXX.XXX.XXX.XXX/XX”,
  “virtualNetworkName”: “VNET Name”,
  “subnetRef”: “[resourceId(‘Microsoft.Network/virtualNetworks/subnets’, variables(‘virtualNetworkName’), variables(‘subnetName’))]”,

  “diskName”: “[concat(variables(‘vmName’),’_os_disk’)]”,
  “DatadiskName”: “[concat(variables(‘vmName’),’_Data_disk’)]”,
  “storageAccountType”: “Standard_LRS”,

  “storageAccountName”: “Storage Account Name”

},
 “resources”: [
 {
  “type”: “Microsoft.Network/virtualNetworks”,
  “apiVersion”: “2018-11-01”,
  “name”: “[variables(‘virtualNetworkName’)]”,
  “location”: “[variables(‘location’)]”,
  “properties”: {
  “addressSpace”: {
  “addressPrefixes”: [
  “[variables(‘addressPrefix’)]”
  ]
},
 “subnets”: [
 {
  ”name”: “[variables(‘subnetName’)]”,
  ”properties”: {
  ”addressPrefix”: “[variables(‘subnetPrefix’)]”
    }
   }
  ]
 }
},
{
 ”type”: “Microsoft.Network/networkInterfaces”,
 ”apiVersion”: “2018-11-01”,
 ”name”: “[variables(‘nicName’)]”,
 ”location”: “[variables(‘location’)]”,
 ”dependsOn”: [
 ”[resourceId(‘Microsoft.Network/virtualNetworks/’, variables(‘virtualNetworkName’))]”
],
“properties”: {
 ”ipConfigurations”: [
 {
 ”name”: “ipconfig1”,
 ”properties”: {
 ”privateIPAllocationMethod”: “Dynamic”,
 ”subnet”: {
 ”id”: “[variables(‘subnetRef’)]”
     }
    }
   }
  ]
 }
},
{
 ”type”: “Microsoft.Compute/virtualMachines”,
 ”apiVersion”: “2018-10-01”,
 ”name”: “[variables(‘vmName’)]”,
 ”location”: “[variables(‘location’)]”,
 ”dependsOn”: [
 ”[resourceId(‘Microsoft.Network/networkInterfaces/’, variables(‘nicName’))]”
 ],
 ”properties”: {
 ”hardwareProfile”: {
 ”vmSize”: “[variables(‘vmSize’)]”
 },
 ”osProfile”: {
 ”computerName”: “[variables(‘vmName’)]”,
 ”adminUsername”: “[variables(‘adminUsername’)]”,
 ”adminPassword”: “[variables(‘adminPassword’)]”
 },
 ”storageProfile”: {
 ”imageReference”: {
 ”publisher”: “[variables(‘publisher’)]”,
 ”offer”: “[variables(‘offer’)]”,
 ”sku”: “[variables(‘sku’)]”,
 ”version”: “latest”
 },
 ”osDisk”: {
 ”createOption”: “FromImage”,
 ”name”: “[variables(‘diskname’)]”,
 ”managedDisk”: {
 ”storageAccountType”: “[variables(‘storageAccountType’)]”
 }
  },
 ”dataDisks”: [
 {
 ”lun”: 0,
 ”name”: “[variables(‘datadiskname’)]”,

 ”createOption”: “Empty”,
 ”managedDisk”: {
  ”storageAccountType”: “[variables(‘storageAccountType’)]”
  },
  ”diskSizeGB”: 128

  }
 ]
},
 ”networkProfile”: {
 ”networkInterfaces”: [
 {
 ”id”: “[resourceId(‘Microsoft.Network/networkInterfaces’,variables(‘nicName’))]”
 }
 ]
},
 ”diagnosticsProfile”: {
 ”bootDiagnostics”: {
 ”enabled”: true,
 ”storageUri”: “[concat(‘https://’, variables(‘storageAccountName’), ‘.blob.core.windows.net’)]”
       }
     }
   }
  }
 ]

}

2.デプロイする

テンプレート機能にJSONテンプレートを登録します。以下の内容が表示されますので、名前と説明を入力しOKを表示します。

そうすると、テンプレート画面が表示されますので、デフォルト表示されている内容を削除し、1)で作成したテンプレートをペーストしOKボタンをクリックします。 保存が完了したテンプレートを選択すると以下の画面が表示されますので、リソースグループ名を登録、使用条件に同意し、購入ボタンをクリックします。

デプロイが完了したら、リソースに移動して確認します。無事完成しているかと思います。

3.残念ながら、登録されているテンプレートを直接呼び出す方法はないそうです。(2019年12月現在)

現時点では、Azure Portalからのデプロイしかできません。

PowerShell等からのデプロイは、JSONファイルをローカルやGitHubを指定してのデプロイになります。

Azure Virtual Machine起動/停止時にManaged DisksのAccount Typeを変更して使用料金を削減する

 

Azure Managed Disksは利用するAccount Typeにより料金が異なります。この利用料金はVirtual Machine停止時にも料金が発生します。
Virtual Machine停止時にPremiumSSD等からStandard HDDに戻す事でランニングコストを抑えることができます。
今回は、Virtual Machine起動時や停止時に、Managed DiskのAccount Typeを変更するPowerShellを作って、試してみました。

作成にあたっては、以下のサイトを参考にしています。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/convert-disk-storage

1 .Virtual Machine起動時のPowerShell

以下のサンプルでは、Virtual Machine起動時に、接続されているManaged Diskが、すべてStandard SSDとなります。
なお、PowerShell実行時に、Virtual Machine名を変数として指定し、実行するようにしています。(VM IDを2回指定してますが、気にしないでください。)

#Vm Start (Changed Disk Type)

#VM名を固定にする場合は、下記の通り指定します。(param部分はコメントアウト)
#$vmName =”VM Name”

param (
            [string] [Parameter(Mandatory=$true)] $vmName
            )

$resourceGroupName =“RG Name”
$storageType =“StandardSSD_LRS”

$VM = Get-AzVM -Name $vmName -resourceGroupName $resourceGroupName
$vmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $resourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
 {
  if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $storageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $resourceGroupName `
  -DiskName $disk.Name
  }
}

Start-AzVM -ResourceGroupName $resourceGroupName -Name $vmName

起動対象のVirtual Machine 名を指定し、PowerShell実行します。(今回はPowerShell名を、VM_Start_SelectDiskType.ps1としています。)

c:\VM_Start_SelectDiskType.ps1 -vmName VM Name

.Virtual Machine停止時のPowerShell

以下のサンプルでは、Virtual Machine停止時に、接続されているManaged Diskが、すべてStandard HDDとなります。

#Vm Stop (Changed Disk Type)

#VM名を固定にする場合は、下記の通り指定します。(param部分はコメントアウト)
#$vmName =”VM Name”

param (
[string] [Parameter(Mandatory=$true)] $vmName
   )

  $resourceGroupName =“RG Name”
  $storageType =“Standard_LRS”

 Stop-AzVM -ResourceGroupName $resourceGroupName -Name $vmName -Force

 $VM = Get-AzVM -Name $vmName -resourceGroupName $resourceGroupName
 $vmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $resourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
{
 if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $storageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $resourceGroupName `
  -DiskName $disk.Name

 }
}

停止対象のVirtual Machine 名を指定し、PowerShell実行します。(今回はPowerShell名を、VM_Stop_SelectDiskType.ps1としています。)

c:\VM_Stop_SelectDiskType.ps1 -vmName VM Name

3 .各Managed DiskのAccount Typeについて

以下のPowerShellで、各Managed DiskのAccount Typeを表示する事ができます。変更後の確認に使えます。

Get-AzDisk -resourceGroupName  RG Name |ft Name,@{Name=”Name”; Expression={$_.Sku.Name}}