Azureリソースのロック設定に使うPowerShellとRunbookの例

2022-05-17Automation account,Azure,PowerShell/Azure CLI,Resource Group,Runbook

Azure PowerShellを使用したロックの設定、取得、変更、削除設定方法です。

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

Azure リソースをロックしてインフラストラクチャを保護する

Azureのロックは非常に便利ですが、運用中には一時的にロックを解除したり、再度設定したりするケースがあります。

今回は、Azure PowerShellを利用した、ロックの操作手順を確認しています。
ロック設定忘れを防ぐために、Azure AutomationアカウントのRunbookを利用した、ロック設定のスケジュール化方法についても確認しています。

ロック自体の確認や設定手順は、こちらで紹介しています。

※PowerShellのバージョンは、7.5.1を利用しています。
※Azure PowerShellのバージョンは、12.0.0を利用しています。
※AutomaitionアカウントのRunbookのランタイム環境は、PowerShell-7.2を利用しています。

スポンサーリンク

PowerShellを使ったロック設定方法

ロックに関するPowerShellコマンドレット一覧

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

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

今回のロック設定パターン

ロック設定は3つのパターンで実施しています。
リソースグループ全体へのロック設定、リソースグループ内の個々のリソースへのロック設定を確認しています。

リソースグループ名 ロック名 設定値
rg-lock-01 delete-lock-01 削除
rg-lock-02 readonly-lock-01 読み取り専用
rg-lock-03 vm-lock-01 削除(仮想マシン)

New-AzResourceLockを使ってリソースグループにロックを新規設定

ロックの新規作成には、New-AzResourceLockコマンドレットを使用します。
-Forceパラメーターを付与することで、確認メッセージをスキップして処理を実行できます。

ロックを新規設定

削除ロック設定の場合です。
LockLevelには、"CanNotDelete"を指定します。

    • ロック名:delete-lock-01
    • ロックの種類:削除
    • スコープ:リソースグループ(rg-lock-01)

PS C:\> New-AzResourceLock `
 -LockName “delete-lock-01" `
 -LockLevel “CanNotDelete" `
 -ResourceGroupName “rg-lock-01" `
 -Force

Name : delete-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-01/providers/Microsoft.Authorization/locks/delete-lock-01
ResourceName : delete-lock-01
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-01
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-01/providers/Microsoft.Authorization/locks/delete-lock-01

読み取り専用ロック設定の場合です。
LockLevelには、"ReadOnly"を指定します。

    • ロック名:readonly-lock-01
    • ロックの種類:読み取り専用
    • スコープ:リソースグループ(rg-lock-02)

PS C:\> New-AzResourceLock `
 -LockName “readonly-lock-01" `
 -LockLevel “ReadOnly" `
 -ResourceGroupName “rg-lock-02" `
 -Force

Name : readonly-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-02/providers/Microsoft.Authorization/locks/readonly-lock-01
ResourceName : readonly-lock-01
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-02
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-02/providers/Microsoft.Authorization/locks/readonly-lock-01

New-AzResourceLockを使って仮想マシンにロックを新規設定

リソース単位でロックを設定する場合は、-ResourceTypeと-ResourceNameを指定します。
-Scopeパラメーターを使用して、リソースのID(ResourceId)を直接指定してロックを設定することも可能です。

ロックを新規設定

仮想マシンにロックを新規設定します。

    • ロック名:vm-lock-01
    • ロックの種類:削除
    • スコープ:仮想マシン(vm-01)

PS C:\> New-AzResourceLock `
-LockName “vm-lock-01" `
-LockLevel “CanNotDelete" `
-ResourceName “vm-01" `
-ResourceType “Microsoft.Compute/virtualMachines" `
-ResourceGroupName “rg-lock-03″`
-Force

Name : vm-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01
ResourceName : vm-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : vm-lock-01
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-03
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01

Get-AzResourceLockを使ってロックの設定内容を取得

ロックの設定内容を取得する場合は、Get-AzResourceLockコマンドレットを使用します。
今回は、2つのリソースグループと1つの仮想マシンに対し、以下の設定でロックを適用しています。

    • delete-lock-01:リソースグループ(rg-lock-01)に対して削除ロック
    • readonly-lock-01:リソースグループ(rg-lock-02)に対して読み取り専用ロック
    • delete-lock-01:仮想マシン(vm-01)に対して削除ロック

取得した情報の結果を見ると、Propertiesプロパティ内にロックレベルが表示されていることが分かります。
ロックレベルには、削除ロックの場合は “CanNotDelete"、読み取り専用ロックの場合は “ReadOnly" と表示されます。

ロックの設定を取得

PS C:\> Get-AzResourceLock

Name : delete-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-01/providers/Microsoft.Authorization/locks/delete-lock-01
ResourceName : delete-lock-01
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-01
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-01/providers/Microsoft.Authorization/locks/delete-lock-01

Name : readonly-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-02/providers/Microsoft.Authorization/locks/readonly-lock-01
ResourceName : readonly-lock-01
ResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-02
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-02/providers/Microsoft.Authorization/locks/readonly-lock-01

Name : vm-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01
ResourceName : vm-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : vm-lock-01
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-03
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01

Azure Portalで、それぞれのリソースグループのロック設定を確認します。

ロック設定を確認
ロックが正しく設定されていることを確認できます。
リソースグループのロック画面で、リソースグループ内の仮想マシンなど、個別リソースに設定したロックも確認できます。
 リソースグループに削除ロックを設定(ロック設定画面例)
リソースグループに読み取り専用ロックを設定(ロック設定画面例)
リソースグループ内の仮想マシンに削除ロックを設定(ロック設定画面例)

ロック設定を取得する対象リソースを制限する場合はAtScopeパラメーターを使う

Get-AzResourceLockコマンドレットでは、-AtScopeオプションを指定することで、指定したスコープに直接設定されているロックのみを取得できます。
リソースグループ内の特定の仮想マシンのみにリソースロックを設定した場合、リソースグループのスコープで-AtScopeを指定しても、その仮想マシンに設定したロック情報は取得できません。
配下のリソースに設定されたロックが含まれないためです。

ロック設定を取得

PS C:\> Get-AzResourceLock -ResourceGroupName “rg-lock-03" -AtScope
PS C:\> Get-AzResourceLock -ResourceGroupName “rg-lock-03"

Name : vm-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01
ResourceName : vm-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : vm-lock-01
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-03
SubscriptionId : サブスクリプションID
Properties : @{level=CanNotDelete}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Authorization/locks/vm-lock-01

ロック設定を変更する場合はSet-AzResourceLockを使う

リソースロックの設定変更には、Set-AzResourceLockコマンドレットを使用します。
今回は、仮想マシンに設定された削除ロック(CanNotDelete)を、読み取り専用ロック(ReadOnly)へ変更しています。
Get-AzResourceLock を使って既存のロック情報を取得し、そのロックIDを使って設定を変更します。
-Forceパラメーターを付与することで、確認メッセージをスキップして処理を実行できます。

※LockNotesが設定されている場合、変更時にも指定が必要となります。今回は存在有無を確認して設定変更するようにしています。

ロック設定を変更
PS C:\>$Lock = Get-AzResourceLock | Where-Object { $_.Name -eq “vm-lock-01" }  
 
if ($Lock.Properties.notes) {  
    # LockNotesが存在する場合  
    Set-AzResourceLock -LockID $Lock.LockId -LockNotes $Lock.Properties.notes -LockLevel ReadOnly -Force  
    } else {  
    # LockNotesが存在しない場合  
    Set-AzResourceLock -LockID $Lock.LockId -LockLevel ReadOnly -Force  
}  

Name : vm-lock-01
ResourceId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Aut
horization/locks/vm-lock-01
ResourceName : vm-01
ResourceType : Microsoft.Compute/virtualMachines
ExtensionResourceName : vm-lock-01
ExtensionResourceType : Microsoft.Authorization/locks
ResourceGroupName : rg-lock-03
SubscriptionId : サブスクリプションID
Properties : @{level=ReadOnly; notes=仮想マシンロック}
LockId : /subscriptions/サブスクリプションID/resourceGroups/rg-lock-03/providers/Microsoft.Compute/virtualMachines/vm-01/providers/Microsoft.Aut
horization/locks/vm-lock-01

※ロック名で対象のロックを特定しています。
※Get-AzResourceLockで取得した既存のロック設定を利用して、ロックの内容を変更しています。

ロックを削除する場合はRemove-AzResourceLockを使う

ロックの削除には Remove-AzResourceLock コマンドレットを使用します。
今回は仮想マシンに設定されたロック(vm-lock-01)を削除しています。
ロックの情報を取得し、そのロックIDを指定して削除しています。
コマンドが正常に完了すると、True が返されます。

ロック設定を削除
PS C:\> $Lock = Get-AzResourceLock | Where-Object { $_.Name -eq “vm-lock-01" }
PS C:\> Remove-AzResourceLock -LockID $Lock.LockId -Force
True

—広告—

Automation アカウントの Runbookを使ったロック設定方法

一時的にリソースロックを解除した後、ロックの再設定を忘れてしまうことがありました。
設定漏れを防止するために、Azure AutomationアカウントのRunbookを使用して、ロックの再設定を自動化する方法を試してみました。

必要な権限について

必要な権限は、"所有者"または"ユーザー アクセス管理者"となります。

今回は、Automationアカウントでシステム割り当てマネージドID(Managed Identity)を有効化し、対象のリソースグループに対して必要な権限を付与しています。
AutomationアカウントでのマネージドIDの設定方法については、こちらでご紹介しています。

必要な権限は所有者もしくはユーザー アクセス管理者になります。

誰がロックを作成または削除できるか

ロック設定をチェックして必要時のみ設定するPowerShell Runbook

指定したリソースグループに対するロック設定が存在しない場合のみ、ロックを新規作成します。
リソースグループスコープのロックが未設定の場合に、削除不可(CanNotDelete)のロックを追加します。
リソースグループ名とロック名は、Runbook実行時に指定します。

    • Runbook実行時に指定
      • リソースグループ名 : $ResourceGroupName
      • ロック名 : $LockName
    • PowerShell内で指定
      • ロックレベル : $LockLevel

Get-AzResourceGroup コマンドレットで、対象リソースグループの情報を取得します。
Get-AzResourceLock コマンドレットで、-ResourceGroupName と -AtScope パラメーターを指定し、リソースグループに直接設定されたロックを取得します。
取得したロックが存在しない場合は、New-AzResourceLock により新たにロックを作成します。
既にロックが存在する場合は、その旨をメッセージで通知します。

ロック設定するPowerShell Runbook
Param(  
    [Parameter(Mandatory = $true)]  
    [String] $ResourceGroupName,  
  
    [Parameter(Mandatory = $true)]  
    [String] $LockName  
)  
  
# サブスクリプションIDの指定  
$SubscriptionID = “サブスクリプションID"  

# コンテキストの指定  
Disable-AzContextAutosave -Scope Process  
$AzureContext = (Connect-AzAccount -Identity).Context  
$AzureContext = Set-AzContext -SubscriptionId $SubscriptionID
  
# ロックレベルの指定  
$LockLevel = “CanNotDelete"  
  
# リソースグループの情報を取得
$RG = Get-AzResourceGroup -ResourceGroupName  $ResourceGroupName

# リソースグループに設定されているロックを取得  
$Lock = Get-AzResourceLock -ResourceGroupName $ResourceGroupName -AtScope
  
# ロックの存在確認および作成  
if (-not $Lock) {  
    # ロックが存在しない場合は新規作成  
    New-AzResourceLock -LockName $LockName -LockLevel $LockLevel -Scope $RG.ResourceId -Force  
}  
else {  
    # ロックが既に存在する場合  
    Write-Output  “$ResourceGroupName には既にロック $($Lock.Name) が設定されています。"  
}  

Runbook実行のスケジュール設定手順については、こちらで紹介しています。

—広告—

最後に

PowerShellを使ったロックの設定方法を確認しました。
Runbookを活用することで、設定スケジュールの自動化ができ、設定漏れの防止にも役立つことがわかりました。

引き続き、、いろいろ試してみたいと思います。

なお、ロックを設定すると、対象リソースに対する操作が制限される場合があります。
影響を十分に確認したうえで、適切に設定ことが重要になります。

ロック適用前の考慮事項

スポンサーリンク