PowerShellでAzure Resource Locksを一括適用し、誤削除を防ぐベストプラクティス

Azure環境では、仮想マシンやストレージアカウントなどの重要なリソースが誤って削除されるリスクがあります。特に、開発チームや運用チームが頻繁にリソースを作成・削除する環境では、一度削除されると元に戻せないリソースの管理が重要です。

このような誤操作を防ぐために、Azure Resource Locksを活用することで、特定のリソースを削除や変更から保護できます。手動でロックを設定する方法もありますが、多数のリソースがある環境では、PowerShellを使って一括で適用することで管理の効率を向上させることが可能です。

本記事では、Azure Resource Locksの基本概念から、PowerShellを用いた一括適用方法、ベストプラクティスまで詳しく解説します。これにより、運用ミスによるリスクを軽減し、安定したクラウド運用を実現するための知識を習得できます。

目次
  1. Azure Resource Locksとは
    1. Resource Locksの種類
    2. Resource Locksの適用範囲
    3. Resource Locksの特徴
  2. Resource Locksの適用が必要なケース
    1. 1. 重要なリソースの誤削除防止
    2. 2. 設定変更の防止(コンプライアンス対策)
    3. 3. 監査要件や運用ポリシーの遵守
    4. 4. サービスの継続性を確保するため
    5. 5. 定期的なスクリプト実行時の誤動作防止
  3. PowerShellを使用したAzureへの接続と認証
    1. Azure PowerShellのインストール
    2. Azureへの接続方法
    3. 現在のサブスクリプションの確認と設定
    4. 認証のトラブルシューティング
  4. PowerShellでのResource Locksの適用方法
    1. 1. Resource Lockの適用方法
    2. 2. 適用したロックの確認
    3. 3. Resource Lockの適用時の注意点
  5. 既存リソースへの一括ロック適用スクリプト
    1. 1. リソースグループ内のすべてのリソースにロックを適用
    2. 2. サブスクリプション内のすべてのリソースにロックを適用
    3. 3. 特定のタグが付与されたリソースのみにロックを適用
    4. 4. ロックが適用されているかを確認する
    5. 5. ロック適用時の注意点
  6. ロックの解除と削除の手順
    1. 1. リソースグループ内のロックを一覧表示
    2. 2. 特定のリソースのロックを削除する
    3. 3. リソースグループ全体のロックを削除する
    4. 4. サブスクリプション全体のロックを削除する
    5. 5. すべてのリソースに適用されたロックを一括削除
    6. 6. ロック削除時の注意点
  7. 実践的なベストプラクティス
    1. 1. Resource Locksの適用ポリシーの設計
    2. 2. ロック適用時の自動化
    3. 3. Resource Locksの管理をRBACと組み合わせる
    4. 4. Resource Locksの監査と定期レビュー
    5. まとめ
  8. トラブルシューティング
    1. 1. ロックが適用されているのに削除できてしまう
    2. 2. ReadOnlyロックが適用されたリソースの設定を変更できない
    3. 3. 特定のリソースにロックを適用しようとするとエラーが発生する
    4. 4. ロックを削除しようとしてもエラーが発生する
    5. 5. サブスクリプション全体のロックを誤って適用してしまった
    6. まとめ
  9. まとめ
    1. ✅ 重要ポイントの振り返り

Azure Resource Locksとは


Azure Resource Locksは、Azureのリソースに対して削除や変更を制限する機能です。特定のリソースやリソースグループにロックを適用することで、誤って削除や変更されるリスクを防ぐことができます。

Resource Locksの種類


Azureでは、以下の2種類のResource Locksを提供しています。

1. CanNotDelete(削除禁止)

  • リソースの変更は可能ですが、削除はできなくなります。
  • 誤って重要なリソースを削除するリスクを防ぐのに適しています。
  • 例: 運用中の仮想マシンやデータベースを誤削除から保護する場合。

2. ReadOnly(読み取り専用)

  • リソースの削除だけでなく、設定変更も禁止されます。
  • 読み取りは可能ですが、リソースの更新や変更はできません。
  • 例: 重要な設定が含まれるネットワークセキュリティグループ(NSG)や、変更が許可されないデータベースに適用する場合。

Resource Locksの適用範囲


Resource Locksは、リソース単位、リソースグループ単位、サブスクリプション単位のいずれかに適用できます。

  • リソース単位: 特定のVMやストレージアカウントなどに個別に適用。
  • リソースグループ単位: グループ内のすべてのリソースに対して適用。
  • サブスクリプション単位: すべてのリソースを対象に適用。

Resource Locksの特徴

  • Azureポータル、PowerShell、Azure CLI、ARMテンプレートを使って適用可能。
  • RBAC(ロールベースアクセス制御)と連携して、適用・解除の権限を制限可能。
  • 適用後も管理者による解除は可能(完全に削除不可にするわけではない)。

Resource Locksを適切に活用することで、重要なAzureリソースの誤削除や設定変更を防ぎ、安全なクラウド運用が可能になります。次のセクションでは、Resource Locksの適用が必要なケースについて詳しく解説します。

Resource Locksの適用が必要なケース

Azure Resource Locksは、誤操作によるリソースの削除や変更を防ぐために役立ちます。特に以下のようなケースでは、Resource Locksの適用が推奨されます。

1. 重要なリソースの誤削除防止


企業や組織のAzure環境では、仮想マシン、データベース、ストレージアカウントなどの重要なリソースが多数存在します。これらを誤って削除してしまうと、業務の継続に影響を与える可能性があります。

適用例:

  • 仮想マシン(VM): 運用環境のVMを誤削除すると、システム停止の原因となるため、CanNotDeleteロックを適用する。
  • データベース(SQL Database, Cosmos DB): 誤って削除するとデータが消失する可能性があるため、削除を禁止する。

2. 設定変更の防止(コンプライアンス対策)


組織によっては、特定のリソースの設定を変更しないようにする必要があります。たとえば、ネットワークのセキュリティ設定やアクセス制御を誤って変更すると、重大なセキュリティインシデントを引き起こす可能性があります。

適用例:

  • ネットワークセキュリティグループ(NSG): 不適切な変更により、アクセス制御が無効にならないよう、ReadOnlyロックを適用する。
  • ストレージアカウントのアクセスキー: 設定変更を防ぎ、データの安全性を確保するために、ReadOnlyロックを適用する。

3. 監査要件や運用ポリシーの遵守


多くの企業では、クラウドリソースの管理に関する社内ポリシーやコンプライアンス要件があります。誤った変更や削除が発生しないよう、リソースに対して適切なロックを適用することが求められます。

適用例:

  • リソースグループ単位でのロック: 監査対象のリソースが含まれるリソースグループ全体にロックを適用し、誤削除を防ぐ。
  • 開発環境と本番環境の分離: 本番環境のリソースに対してロックを適用し、開発者が誤って本番環境の設定を変更しないようにする。

4. サービスの継続性を確保するため


特定のリソースが削除されると、Azure環境内の他のリソースにも影響を与えることがあります。依存関係のあるリソースを保護するために、Resource Locksの適用が推奨されます。

適用例:

  • 仮想ネットワーク(VNet): 仮想ネットワークが削除されると、接続されているすべてのリソースに影響を及ぼすため、ロックを適用する。
  • リソースグループにロックを適用: すべてのリソースが一括で削除されるのを防ぐために、リソースグループ全体にCanNotDeleteロックを設定する。

5. 定期的なスクリプト実行時の誤動作防止


自動化スクリプトやTerraformなどのIaC(Infrastructure as Code)ツールを使用する場合、誤った設定でスクリプトを実行すると、意図しないリソースの削除や変更が発生する可能性があります。

適用例:

  • スクリプト適用前の一時的なロック: 重要なリソースに対して、一時的にロックを適用し、スクリプトの誤作動による削除を防ぐ。
  • データバックアップリソース: バックアップを保存するストレージアカウントが削除されないよう、CanNotDeleteロックを適用する。

これらのケースにおいて、Azure Resource Locksを適切に適用することで、誤削除や誤変更を防ぎ、クラウド環境の安定運用を実現することができます。次のセクションでは、PowerShellを使用してAzureに接続し、リソースロックを適用する方法について解説します。

PowerShellを使用したAzureへの接続と認証

Azure Resource LocksをPowerShellで管理するためには、まずAzure PowerShellモジュールをインストールし、適切な認証方法でAzureに接続する必要があります。本セクションでは、Azure PowerShellの導入手順と、サインイン方法について詳しく解説します。

Azure PowerShellのインストール

Azure PowerShellを使用するには、以下の手順でモジュールをインストールします。

1. PowerShellのバージョン確認


PowerShellが最新バージョンであることを確認するには、以下のコマンドを実行します。

$PSVersionTable.PSVersion

PowerShell 7 以上が推奨されます。

2. Azure PowerShellモジュールのインストール


Azure PowerShellモジュール (Az モジュール) をインストールするには、次のコマンドを実行します。

Install-Module -Name Az -Scope CurrentUser -Repository PSGallery -Force

モジュールがインストールされたら、PowerShellを再起動して適用します。

Azureへの接続方法

Azure PowerShellを使用してAzure環境に接続する方法は、大きく分けて3つあります。

1. Azure AD アカウントを使用する方法


個人アカウントや組織アカウントを使用してAzureにサインインする最も一般的な方法です。

Connect-AzAccount

このコマンドを実行すると、ブラウザが開き、Azureへの認証を求められます。認証が成功すると、現在のAzureサブスクリプション情報が表示されます。

2. サービスプリンシパルを使用する方法(自動化向け)


スクリプトの自動実行時に、手動ログインを避けるためにサービスプリンシパルを使用することができます。

まず、Azureでサービスプリンシパルを作成し、認証情報(AppId, TenantId, Password)を取得します。
その後、以下のコマンドを使用して、サービスプリンシパルを用いた認証を行います。

$tenantId = "<テナントID>"
$appId = "<アプリケーションID>"
$password = "<クライアントシークレット>"

$securePassword = ConvertTo-SecureString $password -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential ($appId, $securePassword)

Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credential

この方法を使うことで、スクリプトを自動実行する際に、手動のサインインを省略できます。

3. Azure Cloud Shellを使用する方法


Azureポータルには、ブラウザ上でPowerShellを実行できる Azure Cloud Shell が用意されています。Cloud Shellでは、認証済みの状態でAzure PowerShellを利用できるため、特に環境構築の手間を省きたい場合に便利です。

Cloud Shellの起動方法:

  1. Azureポータル(https://portal.azure.com)にアクセスする
  2. 画面右上の Cloud Shell アイコン(>のマーク)をクリック
  3. シェルが起動し、Connect-AzAccount コマンド不要でAzureに接続可能

現在のサブスクリプションの確認と設定

Azure環境には複数のサブスクリプションが存在する場合があるため、適用先のサブスクリプションを確認し、設定することが重要です。

現在のサブスクリプションを確認する

Get-AzSubscription

使用するサブスクリプションを変更する

Set-AzContext -SubscriptionId "<サブスクリプションID>"

認証のトラブルシューティング

Azure PowerShellへの接続時に問題が発生する場合、以下の点を確認してください。

  • Azure PowerShellモジュールが最新か確認する
  Update-Module -Name Az
  • 認証情報が正しいか確認する(特にサービスプリンシパルを使用する場合)
  • ネットワーク制限を確認する(企業のファイアウォールなどが原因でAzureに接続できない可能性あり)
  • Disconnect-AzAccount を実行し、再認証を試みる

これでAzure PowerShellを使用してAzureに接続し、適切なサブスクリプションを選択する準備が整いました。次のセクションでは、PowerShellを使用してResource Locksを適用する方法について解説します。

PowerShellでのResource Locksの適用方法

Azure Resource Locksを適用することで、重要なリソースの誤削除や設定変更を防ぐことができます。ここでは、PowerShellを使用してResource Locksを適用する方法を詳しく解説します。

1. Resource Lockの適用方法

Azure PowerShellを使用してResource Locksを適用するには、New-AzResourceLock コマンドを使用します。

1.1. 単一のリソースにロックを適用する

特定のリソースに CanNotDelete(削除禁止) または ReadOnly(読み取り専用) ロックを適用する場合、次のコマンドを使用します。

New-AzResourceLock -LockName "MyResourceLock" `
                   -LockLevel CanNotDelete `
                   -ResourceName "<リソース名>" `
                   -ResourceType "<リソースタイプ>" `
                   -ResourceGroupName "<リソースグループ名>"

例: 仮想マシン MyVM に削除禁止ロックを適用する場合

New-AzResourceLock -LockName "VMDeleteLock" `
                   -LockLevel CanNotDelete `
                   -ResourceName "MyVM" `
                   -ResourceType "Microsoft.Compute/virtualMachines" `
                   -ResourceGroupName "MyResourceGroup"

1.2. リソースグループ全体にロックを適用する

リソースグループ内のすべてのリソースにロックを適用する場合は、次のコマンドを使用します。

New-AzResourceLock -LockName "MyGroupLock" `
                   -LockLevel ReadOnly `
                   -ResourceGroupName "MyResourceGroup"

これにより、MyResourceGroup 内のすべてのリソースに対して変更や削除が制限されます。

1.3. サブスクリプション全体にロックを適用する

サブスクリプション全体に対してロックを適用する場合は、以下のコマンドを使用します。

New-AzResourceLock -LockName "MySubscriptionLock" `
                   -LockLevel CanNotDelete `
                   -Scope "/subscriptions/<サブスクリプションID>"

この方法を使うと、サブスクリプション内のすべてのリソースにロックが適用され、削除を防ぐことができます。

2. 適用したロックの確認

適用したロックを確認するには、以下のコマンドを使用します。

リソースグループのロック一覧を表示する

Get-AzResourceLock -ResourceGroupName "MyResourceGroup"

特定のリソースに適用されているロックを確認する

Get-AzResourceLock -ResourceName "MyVM" `
                   -ResourceType "Microsoft.Compute/virtualMachines" `
                   -ResourceGroupName "MyResourceGroup"

サブスクリプションに適用されているロックを確認する

Get-AzResourceLock -Scope "/subscriptions/<サブスクリプションID>"

3. Resource Lockの適用時の注意点

  • ロックは管理者(適切なRBAC権限を持つユーザー)のみ削除可能
  • 一般ユーザーはロックを解除できません。
  • リソースがロックされている場合、削除や変更はエラーになる
  • CanNotDelete ロックが適用されたリソースは、削除を試みるとエラーが発生します。
  • ReadOnly ロックが適用されたリソースは、設定変更もできなくなります。
  • ロックの適用範囲を慎重に選定する
  • サブスクリプション全体やリソースグループ単位で適用すると、一部のリソース変更ができなくなる可能性があるため、事前に適用範囲を明確にしておくことが重要です。

これでPowerShellを使用してAzure Resource Locksを適用する方法を学びました。次のセクションでは、複数のリソースに対して一括でロックを適用するスクリプトを紹介します。

既存リソースへの一括ロック適用スクリプト

複数のリソースに対して一括でResource Locksを適用する場合、PowerShellスクリプトを活用することで効率的に管理できます。本セクションでは、特定のリソースグループやサブスクリプション内のすべてのリソースに対して、PowerShellを使用して一括でロックを適用する方法を紹介します。

1. リソースグループ内のすべてのリソースにロックを適用

以下のスクリプトを使用すると、指定したリソースグループ内のすべてのリソースに CanNotDelete(削除禁止) ロックを適用できます。

# 変数の設定
$resourceGroup = "MyResourceGroup"
$lockName = "PreventDeletion"

# 指定したリソースグループ内のすべてのリソースを取得
$resources = Get-AzResource -ResourceGroupName $resourceGroup

# 各リソースに対してロックを適用
foreach ($resource in $resources) {
    New-AzResourceLock -LockName $lockName `
                       -LockLevel CanNotDelete `
                       -ResourceName $resource.Name `
                       -ResourceType $resource.ResourceType `
                       -ResourceGroupName $resourceGroup
    Write-Output "ロックを適用: $($resource.Name)"
}

このスクリプトのポイント:

  • 指定したリソースグループ内のすべてのリソースを取得
  • foreach ループを使用して、各リソースに CanNotDelete ロックを適用
  • ロックの適用状況を出力

2. サブスクリプション内のすべてのリソースにロックを適用

サブスクリプション全体のすべてのリソースに対してロックを適用したい場合は、以下のスクリプトを使用します。

# 変数の設定
$lockName = "PreventDeletion"

# サブスクリプション内のすべてのリソースを取得
$resources = Get-AzResource

# 各リソースに対してロックを適用
foreach ($resource in $resources) {
    New-AzResourceLock -LockName $lockName `
                       -LockLevel CanNotDelete `
                       -ResourceName $resource.Name `
                       -ResourceType $resource.ResourceType `
                       -ResourceGroupName $resource.ResourceGroupName
    Write-Output "ロックを適用: $($resource.Name)"
}

このスクリプトのポイント:

  • Get-AzResource を使用して、サブスクリプション内のすべてのリソースを取得
  • 各リソースに対して CanNotDelete ロックを適用
  • すべてのリソースに対して一括適用するため、適用範囲に注意

3. 特定のタグが付与されたリソースのみにロックを適用

リソースの中には、一部だけロックを適用したいケースもあります。例えば、「重要」なリソースに対してのみロックを適用する場合、タグを活用できます。以下のスクリプトは、Environment=Production というタグが付与されているリソースに対してのみロックを適用します。

# 変数の設定
$tagKey = "Environment"
$tagValue = "Production"
$lockName = "ProtectProduction"

# タグが適用されたリソースを取得
$resources = Get-AzResource | Where-Object { $_.Tags[$tagKey] -eq $tagValue }

# 各リソースに対してロックを適用
foreach ($resource in $resources) {
    New-AzResourceLock -LockName $lockName `
                       -LockLevel CanNotDelete `
                       -ResourceName $resource.Name `
                       -ResourceType $resource.ResourceType `
                       -ResourceGroupName $resource.ResourceGroupName
    Write-Output "ロックを適用: $($resource.Name)"
}

このスクリプトのポイント:

  • Get-AzResource で取得したリソースを Where-Object でフィルタリングし、特定のタグが付与されたリソースのみに適用
  • 環境(Production, Staging, Development など)に応じて異なるロックを適用可能

4. ロックが適用されているかを確認する

適用されたロックを確認するためには、Get-AzResourceLock コマンドを使用します。

# リソースグループ内のロックを確認
Get-AzResourceLock -ResourceGroupName "MyResourceGroup"

# 特定のリソースに適用されたロックを確認
Get-AzResourceLock -ResourceName "MyVM" `
                   -ResourceType "Microsoft.Compute/virtualMachines" `
                   -ResourceGroupName "MyResourceGroup"

5. ロック適用時の注意点

  • ロックは適用後も管理者権限があれば解除可能
  • 一括適用を行う前に、対象のリソースを確認する
  • Get-AzResource でリソース一覧を確認してから適用すると、安全に運用できる
  • 不要なロックが適用されていないかを定期的にチェックする
  • スクリプトの適用範囲を慎重に設定する(特にサブスクリプション全体への適用は影響範囲が大きい)

これで、PowerShellを使用して既存リソースに対して一括でResource Locksを適用する方法を学びました。次のセクションでは、適用したResource Locksを解除・削除する方法について解説します。

ロックの解除と削除の手順

Azure Resource Locksは、リソースの誤削除や変更を防ぐために重要ですが、状況によってはロックを解除・削除する必要が生じます。例えば、リソースのメンテナンスや構成変更の際に、一時的にロックを解除することが求められることがあります。本セクションでは、PowerShellを使用してResource Locksを解除・削除する方法を解説します。

1. リソースグループ内のロックを一覧表示

まず、特定のリソースグループ内に適用されているロックを確認するために、以下のコマンドを実行します。

Get-AzResourceLock -ResourceGroupName "MyResourceGroup"

このコマンドを実行すると、対象のリソースグループ内に設定されているロックの一覧が表示されます。

出力例:

LockName       LockType        ResourceName     ResourceGroupName
-------------------------------------------------------------
PreventDeletion CanNotDelete  MyVM            MyResourceGroup
ProtectConfig   ReadOnly      MyStorage       MyResourceGroup

ロック名(LockName)を確認し、削除する際に使用します。

2. 特定のリソースのロックを削除する

特定のリソースに適用されているロックを削除するには、Remove-AzResourceLock コマンドを使用します。

Remove-AzResourceLock -LockName "PreventDeletion" `
                      -ResourceName "MyVM" `
                      -ResourceType "Microsoft.Compute/virtualMachines" `
                      -ResourceGroupName "MyResourceGroup"

このコマンドのポイント:

  • -LockName には削除するロックの名前を指定
  • -ResourceName には対象のリソース名を指定
  • -ResourceType にはリソースの種類(例: 仮想マシンなら Microsoft.Compute/virtualMachines)を指定
  • -ResourceGroupName にはリソースが所属するリソースグループ名を指定

ロックの削除を確認するには:

Get-AzResourceLock -ResourceGroupName "MyResourceGroup"

削除後、対象のロックがリストから消えていれば成功です。

3. リソースグループ全体のロックを削除する

リソースグループ単位で適用されたロックを削除するには、次のコマンドを使用します。

Remove-AzResourceLock -LockName "GroupLock" -ResourceGroupName "MyResourceGroup"

このコマンドを実行すると、リソースグループ MyResourceGroup に適用された GroupLock というロックが削除されます。

4. サブスクリプション全体のロックを削除する

サブスクリプションに適用されたロックを削除する場合は、以下のコマンドを使用します。

Remove-AzResourceLock -LockName "SubscriptionLock" -Scope "/subscriptions/<サブスクリプションID>"

注意:

  • サブスクリプション単位のロックは影響範囲が大きいため、削除前に Get-AzResourceLock で確認することを推奨。

5. すべてのリソースに適用されたロックを一括削除

すべてのリソースからロックを削除する場合、以下のスクリプトを使用します。

# リソースグループ名を設定
$resourceGroup = "MyResourceGroup"

# 対象のリソースグループ内のすべてのロックを取得
$locks = Get-AzResourceLock -ResourceGroupName $resourceGroup

# すべてのロックを削除
foreach ($lock in $locks) {
    Remove-AzResourceLock -LockName $lock.Name -ResourceGroupName $resourceGroup
    Write-Output "ロック削除: $($lock.Name)"
}

このスクリプトのポイント:

  • Get-AzResourceLock で対象のリソースグループ内のすべてのロックを取得
  • foreach ループで、各ロックを Remove-AzResourceLock を使用して削除

6. ロック削除時の注意点

  • ロックの削除には適切な権限(Owner または User Access Administrator)が必要
  • Get-AzRoleAssignment で現在の権限を確認可能
  • ReadOnly ロックが適用されたリソースは、ロック解除しないと設定変更できない
  • Remove-AzResourceLock で削除後に変更を行う
  • 一括削除スクリプトを使用する際は影響範囲を慎重に確認する
  • 特に、誤ってサブスクリプション単位のロックを削除しないように注意

これで、PowerShellを使用して適用したResource Locksを解除・削除する方法を学びました。次のセクションでは、Resource Locksの運用をより効率的にするためのベストプラクティスについて解説します。

実践的なベストプラクティス

Azure Resource Locksは、リソースの誤削除や意図しない変更を防ぐために非常に有効ですが、適用の仕方を誤ると運用上のトラブルを引き起こす可能性があります。本セクションでは、PowerShellを用いたResource Locksの運用をより効率的に行うためのベストプラクティスを紹介します。

1. Resource Locksの適用ポリシーの設計

Resource Locksを適用する際には、以下のポイントを考慮して設計することが重要です。

1.1. どのリソースにロックを適用するかを明確にする

  • 重要なリソース(本番環境の仮想マシン、データベース、ネットワーク構成)に対して適用
  • テンポラリリソース(開発環境の一時的なVMやリソース)はロック不要

1.2. 適用レベルを適切に選択する

  • リソース単位でのロック → 個々のリソースを保護(推奨)
  • リソースグループ単位でのロック → まとめてロック可能だが影響範囲が広い
  • サブスクリプション単位でのロック → 管理者向けのポリシーとして適用可能だが、運用に影響を与える可能性あり

1.3. 適用するロックタイプの選択

  • CanNotDelete(削除禁止) → 誤削除防止(推奨)
  • ReadOnly(読み取り専用) → 設定変更の防止(適用範囲に注意)

2. ロック適用時の自動化

手動でResource Locksを適用すると、人的ミスや適用漏れが発生する可能性があります。PowerShellを活用して、ロックの適用を自動化することで、管理の効率を向上させることができます。

2.1. リソース作成時にロックを自動適用する

リソースの作成と同時にロックを適用するスクリプトを使用すると、適用漏れを防ぐことができます。

# 仮想マシンを作成し、ロックを適用するスクリプト
$resourceGroup = "MyResourceGroup"
$vmName = "MySecureVM"

# 仮想マシンの作成(省略)

# ロックを適用
New-AzResourceLock -LockName "VMDeleteLock" `
                   -LockLevel CanNotDelete `
                   -ResourceName $vmName `
                   -ResourceType "Microsoft.Compute/virtualMachines" `
                   -ResourceGroupName $resourceGroup
Write-Output "ロックを適用: $vmName"

2.2. 定期的にロックを適用・監視するスクリプト

ロックの適用漏れを防ぐため、定期的に実行するスクリプトを作成し、Azure AutomationAzure Functions でスケジュール実行すると効果的です。

# リソースグループ内のリソースにロックが適用されているか確認し、適用されていない場合はロックを追加する
$resourceGroup = "MyResourceGroup"
$lockName = "AutoLock"

# すべてのリソースを取得
$resources = Get-AzResource -ResourceGroupName $resourceGroup

foreach ($resource in $resources) {
    $existingLock = Get-AzResourceLock -ResourceName $resource.Name `
                                       -ResourceType $resource.ResourceType `
                                       -ResourceGroupName $resourceGroup `
                                       -ErrorAction SilentlyContinue

    if (-not $existingLock) {
        New-AzResourceLock -LockName $lockName `
                           -LockLevel CanNotDelete `
                           -ResourceName $resource.Name `
                           -ResourceType $resource.ResourceType `
                           -ResourceGroupName $resourceGroup
        Write-Output "ロックを適用: $($resource.Name)"
    }
}

このスクリプトを定期的に実行することで、ロックの適用漏れを防ぐことができます。

3. Resource Locksの管理をRBACと組み合わせる

ロックを適用しても、適切な権限を持つユーザーが解除できるため、ロック管理の権限を制限することが重要です。

3.1. ロックの変更・削除を制限する

AzureのRBAC(ロールベースアクセス制御) を使用し、ロックの管理を特定の管理者のみが行えるようにします。

以下の手順で、ロックの削除権限を制限します。

  1. Azureポータルで「アクセス制御(IAM)」を開く
  2. 「ロールの割り当て」タブを開く
  3. 「ロック削除権限を持つユーザー」を制限
  4. ロックを解除できるのは「Owner」または「User Access Administrator」のみとする

また、以下のPowerShellコマンドを使用して、特定のユーザーにロック管理権限を付与できます。

New-AzRoleAssignment -ObjectId "<ユーザーID>" `
                     -RoleDefinitionName "User Access Administrator" `
                     -Scope "/subscriptions/<サブスクリプションID>"

4. Resource Locksの監査と定期レビュー

適用されたロックが適切に機能しているか、定期的に監査を行うことが推奨されます。以下のPowerShellコマンドを使用して、適用済みのロック一覧を取得できます。

# サブスクリプション全体のロック一覧を取得
Get-AzResourceLock

監査のポイント:

  • 不要なロックが適用されていないか(開発環境や一時的なリソースに対するロックを確認)
  • 意図しないロック解除が行われていないか
  • リソースの削除・変更の制約が運用に影響を与えていないか

まとめ

  • リソースの種類や重要度に応じて適切なロックを選択する
  • PowerShellを活用してロックの適用を自動化し、適用漏れを防ぐ
  • RBACを組み合わせて、ロックの削除・変更を管理者のみに制限する
  • 定期的に監査を行い、不要なロックや設定ミスを防ぐ

これらのベストプラクティスを適用することで、Azure環境の誤削除や設定ミスを防ぎ、より安全な運用が実現できます。次のセクションでは、Resource Locks適用時のトラブルシューティングについて解説します。

トラブルシューティング

Azure Resource Locksを適用することで、リソースの削除や変更を防ぐことができますが、運用中にいくつかの問題が発生することがあります。本セクションでは、PowerShellを用いたResource Locksの適用・解除時に発生しやすいトラブルとその解決策を紹介します。


1. ロックが適用されているのに削除できてしまう

問題:
CanNotDelete(削除禁止) ロックを適用したはずのリソースが、誤って削除できてしまうケースがあります。

考えられる原因:

  1. 適用したロックが正しく反映されていない
  • ロック適用後、AzureポータルやPowerShellでリソースの状態を確認せずに削除を試みた可能性
  1. ロックが削除されてから削除された
  • RBAC権限を持つユーザーがロックを解除後に削除した可能性

解決策:

  • 適用済みのロックを確認する
Get-AzResourceLock -ResourceGroupName "MyResourceGroup"
  • RBAC権限の管理を見直す
  • ロックを解除できるユーザーを制限する
  • User Access Administrator 権限を持つユーザーのみロックの管理ができるように設定する
Get-AzRoleAssignment -Scope "/subscriptions/<サブスクリプションID>"

2. ReadOnlyロックが適用されたリソースの設定を変更できない

問題:
ReadOnly(読み取り専用) ロックを適用したリソースに対して、設定変更ができない。

考えられる原因:

  1. 設定変更もブロックされている
  • ReadOnly ロックは削除を禁止するだけでなく、設定変更も禁止するため、影響を受ける可能性がある。
  1. ARMテンプレートやスクリプトのデプロイが失敗する
  • ReadOnly ロックが適用されていると、Infrastructure as Code(IaC)ツールを使用したデプロイが失敗することがある。

解決策:

  • 一時的にロックを解除する
Remove-AzResourceLock -LockName "ReadOnlyLock" -ResourceGroupName "MyResourceGroup"
  • ReadOnly ロックではなく CanNotDelete ロックを使用する
  • 設定変更が必要なリソースには、削除防止のみの CanNotDelete ロックを適用する。

3. 特定のリソースにロックを適用しようとするとエラーが発生する

問題:
特定のリソースに対して New-AzResourceLock を実行すると、以下のようなエラーが発生することがある。

New-AzResourceLock : The specified resource does not support locks.

考えられる原因:

  1. ロックが適用できないリソースに適用しようとしている
  • 一部のリソースは、Azure Resource Locksをサポートしていない。
  1. リソースの種類(ResourceType)が間違っている
  • PowerShellスクリプトで ResourceType の指定が正しくない可能性がある。

解決策:

  • 適用可能なリソースか確認する
Get-AzResource -ResourceGroupName "MyResourceGroup" | Select-Object Name, ResourceType
  • ResourceType を明示的に指定する
New-AzResourceLock -LockName "MyLock" `
                   -LockLevel CanNotDelete `
                   -ResourceName "MyVM" `
                   -ResourceType "Microsoft.Compute/virtualMachines" `
                   -ResourceGroupName "MyResourceGroup"

4. ロックを削除しようとしてもエラーが発生する

問題:
Remove-AzResourceLock コマンドを使用してロックを削除しようとすると、以下のようなエラーが発生することがある。

Remove-AzResourceLock : The lock could not be found.

考えられる原因:

  1. 指定したロック名が間違っている
  • ロック名を正しく指定していない可能性がある。
  1. リソースグループ名やスコープの指定が間違っている
  • ロックの適用範囲が異なり、適切なスコープで削除できていない。

解決策:

  • 適用されているロック一覧を確認する
Get-AzResourceLock -ResourceGroupName "MyResourceGroup"
  • ロックの削除時にリソースの種類を明示的に指定する
Remove-AzResourceLock -LockName "MyLock" `
                      -ResourceGroupName "MyResourceGroup"

5. サブスクリプション全体のロックを誤って適用してしまった

問題:
サブスクリプション単位で CanNotDelete ロックを適用してしまい、一部のリソースが削除できなくなった。

考えられる原因:

  1. スクリプトの適用範囲を誤って設定した
  2. 影響を考慮せずに一括適用してしまった

解決策:

  • まず、適用されているロックを確認する
Get-AzResourceLock -Scope "/subscriptions/<サブスクリプションID>"
  • ロックを削除する
Remove-AzResourceLock -LockName "SubscriptionLock" -Scope "/subscriptions/<サブスクリプションID>"
  • ロックを適用する際は、テスト環境で試してから本番環境へ適用する

まとめ

Azure Resource Locksの運用時に発生しやすいトラブルを防ぐためには、以下の点に注意しましょう。

✅ ロックの適用後に適切に反映されているか Get-AzResourceLock で確認する
RBAC権限を管理 し、不要なロック解除を防ぐ
ReadOnly ロックの適用範囲に注意(設定変更不可になるため)
スクリプトの適用範囲を慎重に設定し、影響を最小限にする
削除できないリソースが発生した場合は、スコープや権限を確認する

これらの対策を適用することで、Azure Resource Locksを安全かつ適切に運用することができます。次のセクションでは、記事のまとめを行います。

まとめ

本記事では、Azure Resource Locks をPowerShellで適用し、誤操作によるリソースの削除や設定変更を防ぐ方法について解説しました。

まず、Azure Resource Locksの基本概念と適用が必要なケースを確認し、PowerShellを使用したAzureへの接続方法 を学びました。その後、個別リソース・リソースグループ・サブスクリプション単位 でのロック適用方法、一括適用スクリプト、ロックの解除・削除手順について詳しく説明しました。

また、ベストプラクティス として、ロックの適用範囲の選定、スクリプトによる自動適用、RBACを活用したアクセス制御を紹介しました。最後に、ロック適用時のトラブルシューティング について、よくある問題とその解決策を説明しました。

✅ 重要ポイントの振り返り

  • CanNotDelete(削除禁止)ロックは、リソース削除を防ぐために推奨
  • ReadOnly(読み取り専用)ロックは変更も禁止するため適用範囲に注意
  • リソースグループ・サブスクリプション単位の適用は影響が大きいため慎重に設定
  • RBACを組み合わせて、ロックの解除・変更が管理者のみに制限されるようにする
  • PowerShellスクリプトを活用してロックの適用を自動化し、適用漏れを防ぐ
  • 定期的に監査を行い、不要なロックがないか確認する

Azure Resource Locksを適切に活用することで、誤削除や不適切な変更から重要なリソースを保護し、より安全で安定したクラウド運用を実現できます。今後の運用において、PowerShellを活用した自動化や監視スクリプトを取り入れ、効率的なAzureリソース管理を行いましょう。

コメント

コメントする

目次
  1. Azure Resource Locksとは
    1. Resource Locksの種類
    2. Resource Locksの適用範囲
    3. Resource Locksの特徴
  2. Resource Locksの適用が必要なケース
    1. 1. 重要なリソースの誤削除防止
    2. 2. 設定変更の防止(コンプライアンス対策)
    3. 3. 監査要件や運用ポリシーの遵守
    4. 4. サービスの継続性を確保するため
    5. 5. 定期的なスクリプト実行時の誤動作防止
  3. PowerShellを使用したAzureへの接続と認証
    1. Azure PowerShellのインストール
    2. Azureへの接続方法
    3. 現在のサブスクリプションの確認と設定
    4. 認証のトラブルシューティング
  4. PowerShellでのResource Locksの適用方法
    1. 1. Resource Lockの適用方法
    2. 2. 適用したロックの確認
    3. 3. Resource Lockの適用時の注意点
  5. 既存リソースへの一括ロック適用スクリプト
    1. 1. リソースグループ内のすべてのリソースにロックを適用
    2. 2. サブスクリプション内のすべてのリソースにロックを適用
    3. 3. 特定のタグが付与されたリソースのみにロックを適用
    4. 4. ロックが適用されているかを確認する
    5. 5. ロック適用時の注意点
  6. ロックの解除と削除の手順
    1. 1. リソースグループ内のロックを一覧表示
    2. 2. 特定のリソースのロックを削除する
    3. 3. リソースグループ全体のロックを削除する
    4. 4. サブスクリプション全体のロックを削除する
    5. 5. すべてのリソースに適用されたロックを一括削除
    6. 6. ロック削除時の注意点
  7. 実践的なベストプラクティス
    1. 1. Resource Locksの適用ポリシーの設計
    2. 2. ロック適用時の自動化
    3. 3. Resource Locksの管理をRBACと組み合わせる
    4. 4. Resource Locksの監査と定期レビュー
    5. まとめ
  8. トラブルシューティング
    1. 1. ロックが適用されているのに削除できてしまう
    2. 2. ReadOnlyロックが適用されたリソースの設定を変更できない
    3. 3. 特定のリソースにロックを適用しようとするとエラーが発生する
    4. 4. ロックを削除しようとしてもエラーが発生する
    5. 5. サブスクリプション全体のロックを誤って適用してしまった
    6. まとめ
  9. まとめ
    1. ✅ 重要ポイントの振り返り