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つが用意されています。
今回のロック設定パターン
ロック設定は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内で指定
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を活用することで、設定スケジュールの自動化ができ、設定漏れの防止にも役立つことがわかりました。
引き続き、、いろいろ試してみたいと思います。
なお、ロックを設定すると、対象リソースに対する操作が制限される場合があります。
影響を十分に確認したうえで、適切に設定ことが重要になります。
ロック適用前の考慮事項