AzureリソースのロックをPowerShellを使ってやってみた

Azure,Resource Group

Azureでは意図しないリソースを削除や変更を防ぐためのサービスとしてリソースロックがあります。。

リソースのロックによる予期せぬ変更の防止

Azure のリソースロックですがとても便利なのですが、運用していると一時的に外したり戻したりするケースがあります。

今回はPowerShellを使ったリソースロックの設定、取得、変更を確認してみました。
スケジュール化してロック設定を行いたかったので、PowerShell Runbookを使ったリソースロックの再設定もやってみました。

ロック自体の確認やAzure Portalを使った設定はこちら。

スポンサーリンク

Azureリソースロックに関するPowerShellコマンドレット

コマンドレット一覧

Azureリソースロックに関するコマンドレットは、情報取得、新規作成、設定変更、削除の4つが用意されています。

操作 コマンドレット
情報取得 Get-AzResourceLock
新規作成 New-AzResourceLock
設定変更 Set-AzResourceLock
削除 Remove-AzResourceLock

リソースのロックによる予期せぬ変更の防止(Azure PowerShell)(MS社公式サイト)も記載を参考に進めてみます。

ロックの設定情報を取得

リソースロックの情報取得にはGet-AzResourceLockを使います。
今回は3つのリソースグループに対して、以下の通りリソースロックを設定しています。

    • リソースロック設定状態
      • リソースロックテスト用01:読み取り専用
      • リソースロックテスト用02:削除
      • リソースロックテスト用03:ロック設定無し

情報取得結果を見ると分かりますが、Propertiesにロックレベルが表示されている事が分かります。
ロックレベルは、削除が"CanNotDelete"、読み取り専用が"ReadOnly"となります。

ロック情報取得

PS C:\> Get-AzResourceLock

Name : 削除
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用02/providers/Microsoft.Authorization/locks/削除
ResourceName : 削除
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : リソースロックテスト用02
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete; notes=}
LockId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用02/providers/Microsoft.Authorization/locks/削除

Name : 読み取り専用
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用01/providers/Microsoft.Authorization/locks/読み取り専用
ResourceName : 読み取り専用
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : リソースロックテスト用01
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly; notes=}
LockId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用01/providers/Microsoft.Authorization/locks/読み取り専用

-AtScopeを指定すると対象のリソースのみ情報取得出来る

Get-AzResourceLockでAtScopeを指定して利用すると対象スコープのロック情報のみを取得出来ます。

リソースグループ内の特定のVMのみにリソースロック設定をした場合で確認してみます。
-AtScopeを使うとリソースグループがスコープではない為結果が戻ってこない事が分かります。

ロック情報取得(-AtScope)

PS C:\> Get-AzResourceLock -ResourceGroupName “TEST-RG-01" -AtScope
PS C:\> Get-AzResourceLock -ResourceGroupName “TEST-RG-01"

Name : VM-Lock
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock
ResourceName : TEST-VM-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : VM-Lock
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : Test-RG-01
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly; notes=VM-Lock-Test}
LockId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock

リソースグループにロックを新規設定

リソースロックの新規作成にはNew-AzResourceLockを使います。
-Forceを使う事で確認メッセージをスキップする事が出来ます。

    • 新規設定内容
      • ロック名:削除_PowerShell
      • ロックの種類:削除
      • スコープ:リソースロックテスト用03(リソースグループ)
ロック新規設定

New-AzResourceLock `
-LockName “削除_PowerShell" `
-LockLevel “CanNotDelete" `
-ResourceGroupName “リソースロックテスト用03" `
-Force

Name : 削除_PowerShell
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell
ResourceName : 削除_PowerShell
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : リソースロックテスト用03
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell

仮想マシンにロックを新規設定、情報取得

今回はリソース単体にロック設定を行ってみます。
仮想マシンにロックを新規作成リソースのScopeを指定してロック情報を取得してみます。
リソース単位でロックを新規作成する際にはリソースタイプの指定が必要になるので注意が必要です。

    • 新規設定内容
      • ロック名:VM-Lock
      • ロックの種類:読み取り専用
      • リソースグループ名:Test-RG-01
      • スコープ:TEST-VM-01(仮想マシン)
ロック新規設定(仮想マシン)
New-AzResourceLock `
    -LockLevel “ReadOnly" `
    -LockNotes “VM-Lock-Test" `
    -LockName “VM-Lock" `
    -ResourceName “TEST-VM-01" `
    -ResourceGroupName “Test-RG-01" `
    -ResourceType “Microsoft.Compute/virtualMachines"

Name : VM-Lock
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock
ResourceName : TEST-VM-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : VM-Lock
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : Test-RG-01
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly; notes=VM-Lock-Test}
LockId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock

Get-AzResourceLock -Scope “/subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01"

Name : VM-Lock
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock
ResourceName : TEST-VM-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : VM-Lock
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : Test-RG-01
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly; notes=VM-Lock-Test}
LockId : /subscriptions/サブスクリプションID/resourceGroups/Test-RG-01/providers/Microsoft.Compute/virtualMachines/TEST-VM-01/providers/Microsoft.Authorization/locks/VM-Lock

ロック設定を変更する

リソースロックの設定変更にはSet-AzResourceLockを使います。
今回は削除(CanNotDelete)から読み取り専用(ReadOnly)に変更してみます。
-Forceを使う事で確認メッセージをスキップする事が出来ます。

※直接値を指定する方法とGet-AzResourceLockで情報取得する方法の2パターンで実施しています。

ロック設定変更
Set-AzResourceLock `
    -LockName “削除_PowerShell" `
    -LockLevel “ReadOnly" `
    -ResourceGroupName “リソースロックテスト用03" `
    -Force

Name : 削除_PowerShell
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell
ResourceName : 削除_PowerShell
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : リソースロックテスト用03
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly}
LockId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell

※このまま実行すると指定していない情報(例:メモの情報等)がクリアされてしまいます。

$Lock= (Get-AzResourceLock -ResourceGroupName “リソースロックテスト用03")
Set-AzResourceLock `
   -LockID $Lock.LockId `
   -LockNotes $Lock.Properties.notes `
   -LockLevel “ReadOnly" `
   -Force

Name : 削除_PowerShell
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell
ResourceName : 削除_PowerShell
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : リソースロックテスト用03
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly}
LockId : /subscriptions/サブスクリプションID/resourceGroups/リソースロックテスト用03/providers/Microsoft.Authorization/locks/削除_PowerShell

※Get-AzResourceLockで情報取得する事で既存の値を使う事が出来ます。変更する場所だけ値を指定する事で変更が可能のうです。例ではPropertiesにメモの情報が含まれるのでその値を取得して設定するようにしています。

ロックを削除する

リソースロックの削除にはRemove-AzResourceLockを使います。
リソースロックテスト用03に設定した削除_PowerShellと言うロックを削除します。
削除が完了するとTrueの値が戻ります。

※直接値を指定する方法とGet-AzResourceLockで情報取得する方法の2パターンで実施しています。

ロック削除
Remove-AzResourceLock `
    -LockName “削除_PowerShell" `
    -ResourceGroupName “リソースロックテスト用03" `
    -Force

True

$Lock= (Get-AzResourceLock -ResourceGroupName “リソースロックテスト用03" -AtScope).LockId
Remove-AzResourceLock `
    -LockID $Lock `
    -Force

True

※1つのリソースに対して複数ロックが設定されている場合はGet-AzResourceLockで複数のLockIdが戻ってきます。その為AtScopeを指定するなど注意が必要になります。

Automation アカウントのPowerShell Runbookを使ってロック設定を行う

運用時にはメンテナンス作業等で一時的にロックを外すという事もあるかと思います。
今回はAutomationアカウントのRunbookを使ってロックの再設定を試してみました。

Runbookでの設定内容

今回は”削除_PowerShell"に対して削除ロックを設定する想定で作成しています。
ロックが削除されている場合は新規追加するようにしています。
利用方法に応じて適時改変して下さい。

    • Runbook内容
      • リソースグループ名($ResourceGroupName)はパラメータで指定 
      • ロック名($LockName)、ロックレベル($LockLevel)はPowerShell内で指定
      • Get-AzResourceLockで現在のロック設定情報を取得
      • if([string]::IsNullOrEmpty($Lock.LockId))でロックIDの有無を確認
      • ロックIDが無い場合はNew-AzResourceLockでロックを新規作成
      • ロックIDが存在する場合はSet-AzResourceLockでロックIDに対してロックレベルを設定

ロック再設定用PowerShell Runbook

実際に作成したPowerShell Runbookになります。
認証はマネージドIDとしています。ロック設定を行えるだけの権限付与がAutomationアカウントに対して必要になります。

※必要な権限は所有者もしくはユーザー アクセス管理者になります。詳細は誰がロックを作成または削除できるかを参照。
※AutomationアカウントのマネージドIDでの権限付与はこちらを参照願います。

PowerShell Runbook
Param
(
  [Parameter (Mandatory= $true)]
  [String] $ResourceGroupName
)

# ManagedID 認証処理
Disable-AzContextAutosave -Scope Process
$AzureContext = (Connect-AzAccount -Identity).context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

# 変数指定
$subscription = “サブスクリプションID"
$LockName = “削除_PowerShell"
$LockLevel = “CanNotDelete"

#サブスクリプション指定
Set-AzContext -SubscriptionId $subscription

#ロック再設定
$Lock = Get-AzResourceLock -ResourceGroupName $resourceGroupName -LockName $LockName

    if([string]::IsNullOrEmpty($Lock.LockId))
        {
        #Lockが存在しない場合
        New-AzResourceLock `
            -ResourceGroupName $resourceGroupName `
            -LockName $LockName `
            -LockLevel $LockLevel `
            -Force
        }
    else
        {
        #Lock再設定処理
        Set-AzResourceLock `
            -LockId $Lock.LockId `
            -LockLevel $LockLevel `
            -Force
        }

※スケジュール実行する場合はRunbookでスケジュール設定を行います。

実際にRunbookを実行するとロックが再設定されている事が確認出来ます。

最後に

今回はPowerShellを使ったロック設定を試してみました。
Runbookを使えばスケジュールに合わせてロック設定も出来て良い感じでした。

公式サイト記載の通りにロック設定を行う事で制限を受けるケースがあります。
こんな制限がと言うようなものもあるので注意が必要になります。

ロック適用前の考慮事項