인프라를 보호하기 위해 리소스를 잠급니다.

관리자는 Azure 구독, 리소스 그룹 또는 리소스를 잠가 실수로 인한 사용자 삭제 및 수정으로부터 보호할 수 있습니다. 잠금은 모든 사용자 권한보다 우선합니다.

삭제 또는 수정을 방지하는 잠금을 설정할 수 있습니다. 포털에서 이러한 잠금을 삭제읽기 전용이라고 합니다. 명령줄에서 이러한 잠금을 CanNotDeleteReadOnly라고 합니다.

  • CanNotDelete는 승인된 사용자가 리소스를 읽고 수정할 수 있지만 삭제할 수는 없음을 의미합니다.
  • ReadOnly는 승인된 사용자가 리소스를 읽을 수 있지만 삭제하거나 업데이트할 수는 없음을 의미합니다. 이 잠금을 적용하는 것은 승인된 모든 사용자를 읽기 권한자 역할이 제공하는 권한으로 제한하는 것과 유사합니다.

RBAC(역할 기반 액세스 제어)와 달리 관리 잠금을 사용하여 모든 사용자와 역할에 걸쳐 제한을 적용합니다. 사용자 및 역할의 사용 권한 설정에 대해 알아보려면 Azure RBAC를 참조하세요.

상속 잠금

부모 범위에서 잠금을 적용하면 해당 범위 내 모든 리소스가 동일한 잠금을 상속합니다. 나중에 추가하는 리소스도 동일한 부모 잠금을 상속합니다. 상속의 가장 제한적인 잠금이 우선 적용됩니다.

확장 리소스는 적용된 리소스에서 잠금을 상속합니다. 예를 들어 Microsoft.Insights/diagnosticSettings는 확장 리소스 유형입니다. 스토리지 Blob에 진단 설정을 적용하고 스토리지 계정을 잠그면 진단 설정을 삭제할 수 없습니다. 이 상속은 진단 설정의 전체 리소스 ID는 다음과 같기 때문에 의미가 있습니다.

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}/blobServices/default/providers/microsoft.insights/diagnosticSettings/{setting-name}"

잠긴 리소스의 리소스 ID 범위와 일치하는 항목은 다음과 같습니다.

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}

리소스에 삭제 잠금이 설정되어 있고 리소스 그룹을 삭제하려고 하면 이 기능이 전체 삭제 작업을 차단합니다. 리소스 그룹 또는 리소스 그룹의 다른 리소스가 잠금 해제되어 있더라도 삭제는 발생하지 않습니다. 부분 삭제가 없습니다.

Azure 구독을 취소하는 경우:

  • 리소스 잠금은 구독 취소를 차단하지 않습니다.
  • Azure는 리소스를 즉시 삭제하는 대신 비활성화하여 리소스를 보존합니다.
  • Azure는 대기 기간 후에만 리소스를 영구적으로 삭제합니다.

잠금 범위 이해

참고

잠금은 컨트롤 플레인 Azure 작업에만 적용되고 데이터 평면 작업에는 적용되지 않습니다.

Azure 컨트롤 플레인 작업은 https://management.azure.com으로 이동합니다. Azure 데이터 평면 작업은 https://myaccount.blob.core.windows.net/과 같은 서비스 인스턴스로 이동합니다. Azure 컨트롤 플레인 및 데이터 평면을 참조하세요. 어떤 작업이 컨트롤 플레인 URL을 사용하는지 검색하려면 Azure REST API를 참조하세요.

이 구분은 잠금이 리소스를 변경으로부터 보호하지만 리소스가 함수를 수행하는 방식을 제한하지 않는다는 것을 의미합니다. 예를 들어 SQL Database 논리 서버의 읽기 전용 잠금은 삭제 또는 수정으로부터 보호합니다. 서버 데이터베이스에서 데이터를 만들기, 업데이트 또는 삭제할 수 있습니다. 데이터 평면 작업은 데이터 트랜잭션을 허용합니다. 이러한 요청은 https://management.azure.com으로 이동하지 않습니다.

잠금을 적용하기 전에 고려해야 할 사항

잠금을 적용하면 예기치 않은 결과가 발생할 수 있습니다. 리소스를 수정하지 않는 것으로 보이는 일부 작업에는 차단된 작업이 필요합니다. 잠금은 POST 메서드가 ARM(Azure Resource Manager) API로 데이터를 보내는 것을 방지합니다. 차단된 작업의 몇 가지 일반적인 예는 다음과 같습니다.

  • 스토리지 계정에 읽기 전용 잠금을 설정하면 사용자가 키를 나열할 수 없습니다. POST 요청은 Azure Storage 키 나열 작업을 처리하여 계정 키에 대한 액세스를 보호합니다. 계정 키는 스토리지 계정의 데이터에 대한 완전한 액세스를 제공합니다. 스토리지 계정에 대한 읽기 전용 잠금을 구성하는 경우 계정 키를 소유하지 않은 사용자는 Azure AD 자격 증명을 사용하여 Blob 또는 큐 데이터에 액세스해야 합니다. 또한 읽기 전용 잠금은 스토리지 계정 또는 데이터 컨테이너(Blob 컨테이너 또는 큐)로 범위가 지정된 Azure RBAC 역할의 할당을 방지합니다.

  • 스토리지 계정에 대한 읽기 전용 잠금은 스토리지 계정 또는 데이터 컨테이너(BLOB 컨테이너 또는 큐)로 범위가 할당된 Azure RBAC 할당을 보호합니다.

  • 스토리지 계정의 삭제할 수 없는 잠금은 계정 데이터가 삭제되거나 수정되지 않도록 보호하지 않습니다. 스토리지 계정만 삭제되지 않도록 보호합니다. 요청이 데이터 영역 작업을 사용하는 경우 스토리지 계정에 대한 잠금은 해당 스토리지 계정 내의 Blob, 큐, 테이블 또는 파일 데이터를 보호하지 않습니다. 그러나 요청이 컨트롤 플레인 작업을 사용하는 경우 잠금이 해당 리소스를 보호합니다.

    예를 들어 요청에서 컨트롤 플레인 작업인 파일 공유 - 삭제를 사용하는 경우 삭제에 실패합니다. 요청에서 데이터 영역 작업인 공유 삭제를 사용하는 경우 삭제가 성공합니다. 컨트롤 플레인 작업을 사용하는 것이 좋습니다.

  • 스토리지 계정에 대한 읽기 전용 잠금은 해당 데이터가 삭제 또는 수정되는 것을 방지하지 않습니다. 또한 Blob, 큐, 테이블 또는 파일 데이터를 보호하지 않습니다.

  • App Service 리소스에 읽기 전용 잠금을 설정하면 해당 상호 작용이 쓰기 액세스를 필요로 하기 때문에 Visual Studio 서버 탐색기가 리소스에 대한 파일을 표시하지 않도록 방지합니다.

  • App Service 요금제를 포함하는 리소스 그룹에 대한 읽기 전용 잠금의 경우 계획을 스케일 업하거나 스케일 아웃할수 없습니다.

  • 가상 머신을 포함하는 리소스 그룹에 대한 읽기 전용 잠금은 모든 사용자가 가상 머신을 시작하거나 다시 시작하지 못하게 합니다. 이러한 작업에는 POST 메서드 요청이 필요합니다.

  • 자동화 계정이 포함된 리소스 그룹의 읽기 전용 잠금은 모든 Runbook의 시작을 차단합니다. 이러한 작업에는 POST 메서드 요청이 필요합니다.

  • 리소스 그룹에 대한 삭제 불가 잠금을 설정하면 Azure Resource Manager가 기록에서 배포를 자동으로 삭제할 수 없습니다. 기록에서 800개의 배포에 도달하면 배포가 실패합니다.

  • Azure Backup 서비스가 생성한 리소스 그룹에 대해 잠금을 삭제할 수 없으므로 백업이 실패합니다. 이 서비스는 최대 18개의 복원 지점을 지원합니다. 잠겨 있으면 백업 서비스에서 복원 지점이 정리할 수 없습니다. 자세한 내용은 질문과 대답-Azure VM 백업을 참조하세요.

  • Azure Machine Learning 작업 영역이 포함된 리소스 그룹에 대한 잠금을 삭제할 수 없으므로 Azure Machine Learning 컴퓨팅 클러스터의 자동 크기 조정이 제대로 작동하지 않습니다. 잠금을 사용하면 자동 크기 조정에서 사용되지 않는 노드를 제거할 수 없습니다. 솔루션은 워크로드에 필요한 것보다 더 많은 리소스를 사용합니다.

  • Log Analytics 작업 영역의 읽기 전용 잠금은 UEBA(사용자 및 엔터티 동작 분석)를 활성화하지 못하게 합니다.

  • Log Analytics 작업 영역의 삭제 불가 잠금은 데이터 제거 작업을 방지하지 않고 대신 사용자로부터 데이터 제거 역할을 제거합니다.

  • 구독에 대해 읽기 전용 잠금을 설정하면 Azure Advisor가 제대로 작동하지 않습니다. Advisor가 쿼리 결과를 저장할 수 없습니다.

  • Application Gateway에 대한 읽기 전용 잠금은 애플리케이션 게이트웨이의 백 엔드 상태를 가져오지 못하게 합니다. 이 작업은 읽기 전용 잠금이 차단하는 POST 메서드를 사용합니다.

  • AKS(Azure Kubernetes Service) 클러스터에 대한 읽기 전용 잠금은 포털을 통해 클러스터 리소스에 액세스하는 방법을 제한합니다. 읽기 전용 잠금을 사용하면 Azure Portal에서 AKS 클러스터의 Kubernetes 리소스 섹션을 사용하여 클러스터 리소스를 선택할 수 없습니다. 이러한 작업에는 인증을 위한 POST 메서드 요청이 필요합니다.

  • Site Recovery에서 보호되는 Virtual Machine에서 삭제할 수 없는 잠금은 보호를 제거하거나 복제를 사용하지 않도록 설정할 때 Site Recovery에 관련된 특정 리소스 링크가 제대로 제거되지 않도록 합니다. 나중에 VM을 다시 보호하려는 경우 보호를 사용하지 않도록 설정하기 전에 잠금을 제거해야 합니다. 잠금을 제거하지 못한 경우 VM을 다시 보호하기 전에 특정 단계에 따라 부실 링크를 정리해야 합니다. 자세한 내용은 Azure VM 복제 문제 해결을 참조하세요.

잠금을 만들거나 삭제할 수 있는 사람

관리 잠금을 만들거나 삭제하려면 Microsoft.Authorization/* 또는 Microsoft.Authorization/locks/* 작업에 대한 액세스 권한이 필요합니다. 소유자사용자 액세스 관리자 기본 제공 역할만 관리 잠금을 만들고 삭제할 수 있습니다. 필요한 권한이 있는 사용자 지정 역할을 만들 수 있습니다.

관리형 애플리케이션 및 잠금

Azure Databricks와 같은 일부 Azure 서비스는 관리형 애플리케이션을 사용하여 서비스를 구현합니다. 이 경우 서비스는 두 개의 리소스 그룹을 만듭니다. 하나는 서비스 개요가 포함된 잠금 해제된 리소스 그룹입니다. 다른 하나는 서비스 인프라를 포함하는 잠긴 리소스 그룹입니다.

인프라 리소스 그룹을 삭제하려고 하면 리소스 그룹이 잠겨 있음을 나타내는 오류가 표시됩니다. 인프라 리소스 그룹에 대한 잠금을 삭제하려고 하면 시스템 애플리케이션이 잠금을 소유하기 때문에 잠금을 삭제할 수 없다는 오류가 발생합니다.

대신, 서비스를 삭제합니다. 그러면 인프라 리소스 그룹도 삭제됩니다.

관리형 애플리케이션의 경우 배포한 서비스를 선택합니다.

서비스 선택

서비스에는 관리형 리소스 그룹에 대한 링크가 포함되어 있습니다. 해당 리소스 그룹은 인프라를 보유하고 있으며 잠겨집니다. 간접적으로만 삭제할 수 있습니다.

관리형 그룹 표시

잠긴 인프라 리소스 그룹을 포함하여 서비스에 대한 모든 항목을 삭제하려면 서비스에 대해 삭제를 선택합니다.

서비스 삭제

잠금 구성

포털

왼쪽 탐색 패널에서 구독 잠금 기능의 이름은 Resource locks이고 리소스 그룹 잠금 기능의 이름은 Locks입니다.

  1. 잠그려는 리소스, 리소스 그룹 또는 구독에 대한 설정 블레이드에서 잠금을 선택합니다.

    잠금 선택

  2. 잠금을 추가하려면 추가를 선택합니다. 부모 수준에서 잠금을 만들려면 부모를 선택합니다. 현재 선택된 리소스는 부모에서 잠금을 상속합니다. 예를 들어 리소스 그룹을 잠궈 모든 리소스에 잠금을 적용할 수 있습니다.

    잠금 추가

  3. 잠금에 이름과 잠금 수준을 지정합니다. 필요한 경우 잠금을 설명하는 메모를 추가할 수 있습니다.

    잠금 설정

  4. 잠금을 삭제하려면 삭제 단추를 선택합니다.

    잠금 삭제

템플릿

ARM 템플릿 또는 Bicep 파일을 사용하여 잠금을 배포하는 경우 배포 범위와 잠금 범위가 함께 작동하는 방식을 이해하는 것이 좋습니다. 리소스 그룹 또는 구독 잠금과 같이 배포 범위에 잠금을 적용하려면 범위 속성을 설정하지 않은 상태로 둡니다. 리소스를 잠글 때 배포 범위 내에서 잠금의 범위 속성을 설정합니다.

다음 템플릿은 배포되는 리소스 그룹에 잠금을 적용합니다. 잠금 범위가 배포 범위와 일치하기 때문에 잠금 리소스에 범위 속성이 없습니다. 리소스 그룹 수준에서 이 템플릿을 배포합니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "rgLock",
      "properties": {
        "level": "CanNotDelete",
        "notes": "Resource group should not be deleted."
      }
    }
  ]
}

리소스 그룹을 만들어 잠그려면 해당 구독 수준에서 다음 템플릿을 배포합니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "lockDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "rgLock",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Resource group and its resources should not be deleted."
              }
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

리소스 그룹 내의 리소스에 잠금을 적용하는 경우 범위 속성을 추가합니다. 잠그려는 리소스의 이름으로 범위를 설정합니다.

다음 예제에서는 웹 사이트에 App Service 계획, 웹 사이트 및 잠금을 만드는 템플릿을 보여 줍니다. 잠금의 범위는 웹 사이트로 설정됩니다.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "siteName": "[concat('ExampleSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[parameters('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "tier": "Free",
        "name": "f1",
        "capacity": 0
      },
      "properties": {
        "targetWorkerCount": 1
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "name": "[variables('siteName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "serverFarmId": "[parameters('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "siteLock",
      "scope": "[concat('Microsoft.Web/sites/', variables('siteName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('siteName'))]"
      ],
      "properties": {
        "level": "CanNotDelete",
        "notes": "Site should not be deleted."
      }
    }
  ]
}

Azure PowerShell

New-AzResourceLock 명령을 사용하여 Azure PowerShell을 통해 배포된 리소스를 잠급니다.

리소스를 잠그려면 리소스 이름, 리소스 종류 및 해당 리소스 그룹 이름을 제공합니다.

New-AzResourceLock -LockLevel CanNotDelete -LockName LockSite -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

리소스 그룹을 잠그려면 해당 리소스 그룹의 이름을 제공합니다.

New-AzResourceLock -LockName LockGroup -LockLevel CanNotDelete -ResourceGroupName exampleresourcegroup

잠금에 대한 정보를 가져오려면 Get-AzResourceLock을 사용합니다. 구독의 모든 잠금을 가져오려면 다음을 사용합니다.

Get-AzResourceLock

리소스에 대한 모든 잠금을 가져오려면 다음을 사용합니다.

Get-AzResourceLock -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

리소스 그룹에 대한 모든 잠금을 가져오려면 다음을 사용합니다.

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

리소스에 대한 잠금을 삭제하려면 다음을 사용합니다.

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup -ResourceName examplesite -ResourceType Microsoft.Web/sites).LockId
Remove-AzResourceLock -LockId $lockId

리소스 그룹에 대한 잠금을 삭제하려면 다음을 사용합니다.

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup).LockId
Remove-AzResourceLock -LockId $lockId

Azure CLI

az lock create 명령을 사용하여 Azure CLI를 통해 배포된 리소스를 잠급니다.

리소스를 잠그려면 리소스 이름, 리소스 종류 및 해당 리소스 그룹 이름을 제공합니다.

az lock create --name LockSite --lock-type CanNotDelete --resource-group exampleresourcegroup --resource-name examplesite --resource-type Microsoft.Web/sites

리소스 그룹을 잠그려면 해당 리소스 그룹의 이름을 제공합니다.

az lock create --name LockGroup --lock-type CanNotDelete --resource-group exampleresourcegroup

잠금에 대한 정보를 가져오려면 az lock list를 사용합니다. 구독의 모든 잠금을 가져오려면 다음을 사용합니다.

az lock list

리소스에 대한 모든 잠금을 가져오려면 다음을 사용합니다.

az lock list --resource-group exampleresourcegroup --resource-name examplesite --namespace Microsoft.Web --resource-type sites --parent ""

리소스 그룹에 대한 모든 잠금을 가져오려면 다음을 사용합니다.

az lock list --resource-group exampleresourcegroup

리소스에 대한 잠금을 삭제하려면 다음을 사용합니다.

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup --resource-type Microsoft.Web/sites --resource-name examplesite --output tsv --query id)
az lock delete --ids $lockid

리소스 그룹에 대한 잠금을 삭제하려면 다음을 사용합니다.

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup  --output tsv --query id)
az lock delete --ids $lockid

REST API

관리 잠금을 위한 REST API를 사용하여 배포된 리소스를 잠글 수 있습니다. REST API를 사용하면 잠금을 만들고, 삭제하고, 기존 잠금에 대한 정보를 검색할 수 있습니다.

잠금을 만들려면 다음을 실행합니다.

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/locks/{lock-name}?api-version={api-version}

범위는 구독, 리소스 그룹 또는 리소스일 수 있습니다. 잠금 이름은 원하는 모든 이름이 될 수 있습니다. API 버전의 경우 2016-09-01을 사용합니다.

요청에 잠금 속성을 지정하는 JSON 개체를 포함합니다.

{
  "properties": {
  "level": "CanNotDelete",
  "notes": "Optional text notes."
  }
}

다음 단계