Azure 로컬 의 비연결 작업에 대한 알려진 문제

이 문서에서는 Azure 로컬 대한 연결이 끊긴 작업에서 중요한 알려진 문제 및 해결 방법을 식별합니다.

이러한 릴리스 정보는 중요한 문제 및 필요한 해결 방법을 포함하도록 지속적으로 업데이트됩니다. Azure 로컬 대한 연결이 끊긴 작업을 배포하기 전에 이 정보를 주의 깊게 검토합니다.

버전 2609의 알려진 문제

CA 일반 이름에 공백이 포함된 CA 루트에서 OperationsModule에서 인증서를 생성할 때 문제가 발생합니다.

적용 대상: 작업 모듈 및 공백이 포함된 CA 일반 이름을 사용하여 인증서 생성

다음 메시지와 함께 오류가 표시됩니다: 작업 디렉터리에서 Root라는 파일을 찾을 수 없어 certreq.exe가 Windows 오류 코드 0x80070002(ERROR_FILE_NOT_FOUND)와 함께 즉시 실패했습니다.

해결 방법:

  • 수정을 받으려면 Azure 포털에서 지원 케이스를 여세요.

버전 2606의 알려진 문제

업데이트 후 AKS 실패 상태

적용 대상: AKS on Azure 로컬 (미리 보기) 2606 이전 버전.

업데이트하는 동안 몇 가지 드문 경우로 인해 AKS 클러스터를 사용할 수 없게 되고 컨트롤 플레인과 통신할 수 없게 될 수 있습니다.

해결 방법:

  • Azure 로컬 오프라인 작업을 2609로 업데이트하고 AKS GA 지원을 위해 AKS 클러스터를 다시 만듭니다.
  • 또는 미리 보기 버전에 대한 완화 방법을 문의하려면 지원 티켓을 엽니다.

버전 2605의 알려진 문제

워크로드 클러스터 패치 및 업데이트 실패

적용 대상: 데이터 클러스터에 대한 첫 번째 Azure 로컬 패치 및 업데이트.

비고

이 수정은 일회성 수정입니다. InfraLocal_1 볼륨을 만든 후에는 후속 Azure 로컬 업데이트에 대해 동일한 클러스터에 이러한 단계가 필요하지 않습니다.

해결 방법:

  • 관리 권한으로 Azure 로컬 클러스터 노드에 로그인합니다.
  • 다음 PowerShell 명령을 실행하여 InfraLocal_1 볼륨을 만듭니다.
New-Volume -FriendlyName "InfraLocal_1" -Size 10GB -ProvisioningType Thin
  • 명령이 오류 없이 성공적으로 완료되었는지 확인합니다.
  • Azure 로컬 패치 및 업데이트를 진행합니다.

공기가 틈새가 있는 환경에서 서명 인증서 누락

다음 단계를 수행하지 않으면 에어갭 환경에서 Azure 로컬 오프라인 작업 릴리스 2605의 클라우드 배포가 성공하지 않습니다.

Import-Certificate -FilePath "<CertPath>\MicCodSigPCA2011_2011-07-08.crt" -CertStoreLocation "Cert:\LocalMachine\CA"

2605용 업데이트 패키지

이 릴리스에는 BitLocker 키 보호기에서 알려진 문제가 있으며 기본 배포 패키지만 사용할 수 있습니다. 2605 업데이트 패키지는 배포 릴리스와 별도로 제공됩니다. 업데이트 패키지에 대한 릴리스 정보는 업데이트를 사용할 수 있을 때 여기에 추가됩니다.

간접 로그 수집 중에 관찰 가능성 로그에 공유 자격 증명을 노출할 수 있습니다.

Invoke-AzureLocalDisconnectedLogCollection cmdlet을 실행하여 간접 로그 수집을 수행하고 수집할 역할에 Observability 역할을 포함하면, Azure 로컬 용 연결이 끊긴 작업 어플라이언스의 관찰 가능성 구성 요소가 -SaveToPath 및 -ShareCredential 매개 변수에 전달한 SMB 공유 경로, 사용자 이름 및 암호를 캡처합니다. 나중에 해당 관찰성 로그를 수집하여 진단 데이터 제출의 일부로 Microsoft에 업로드하면 공유 자격 증명도 함께 업로드됩니다.

-CloudManagementFilterByRoles 매개 변수를 지정하지 않으면 기본적으로 Observability을 포함한 모든 클라우드 관리 역할이 수집됩니다. 관찰 가능성 로그를 제외하는 유일한 방법은 관찰성 역할을 생략하는 -CloudManagementFilterByRoles 역할의 명시적 목록을 전달하는 것입니다.

해결 방법:

Invoke-AzureLocalDisconnectedLogCollection를 실행할 때 observability 역할이 제외된 역할 목록으로 -CloudManagementFilterByRoles을(를) 명시적으로 설정합니다. 기본값은 관찰 가능성을 포함하여 모든 역할을 수집하므로 기본 동작을 사용하지 마세요. 다음은 그 예입니다.

$nodeCred = Get-Credential -Message "Enter Azure Local node credentials"

# Supported roles: Agents, ArcControlPlane, ArcADiagnostics, Containers, CosmosDB, MASLogs, Messaging, Observability, Oplets, ServiceFabric, Storage, WindowsEventLogs
# The Observability role can leak credentials. Don't include it in CloudManagementFilterByRoles.
Invoke-AzureLocalDisconnectedLogCollection -FromDate (Get-Date).AddHours(-6) `
    -ToDate (Get-Date) `
    -AzureLocalNodeNames @("ALNode01", "ALNode02", "ALNode03", "ALNode04") `
    -AzureLocalNodeCredential $nodeCred `
    -SaveToPath "\\fileserver\share\FilteredLogs" `
    -ShareCredential (Get-Credential) `
    -CloudManagementEndpoint "192.168.1.100" `
    -CloudManagementClientCertificatePath "C:\ManagementCert.pfx" `
    -CloudManagementClientCertificatePassword $pfxPassword `
    -AzureLocalFilterByRoles @("BareMetal", "ECE") `
    -CloudManagementFilterByRoles @("Agents", "ArcControlPlane", "ArcADiagnostics", "Containers", "CosmosDB", "MASLogs", "Messaging", "Oplets", "WindowsEventLogs") `
    -ForceRefreshCloudManagementPsModule

버전 2604의 알려진 문제

Azure 포털 및 Azure CLI를 통해 AKS Arc 배포가 실패함

다음 오류 invalid transformation contained in extension package로 배포가 실패합니다.

완화: 최신 버전을 다시 배포하거나 Microsoft 지원 2604 빌드와 관련된 단계를 문의하세요.

Azure 로컬 작업자 클러스터에서 Arc 인프라 구성 요소 배포 중 클라우드 배포 실패

에어갭 환경에서 워크로드 클러스터가 드문 경우 배포되지 않습니다.

오류 메시지: 워커 클러스터 Azure 로컬 클라우드 배포가 "MOC 역할 StorageContainerContributor를 사용할 수 없습니다" 오류와 함께 실패했습니다. New-ArcHciApplianceConfigs가 실패했습니다.

해결 방법:

  1. Azure 로컬 클러스터의 첫 번째 노드에 연결합니다.

  2. 관리자 권한 PowerShell 세션을 엽니다(관리자 권한으로 실행).

  3. 다음 명령을 실행하여 StorageContainerContributor 역할을 만듭니다.

     New-MocRole -Name StorageContainerContributor `
             -actionProviders "StorageContainer" `
             -actionOperations "all"
    
  4. 포털 또는 ARM 템플릿 배포를 통해 시작한 것과 동일한 방법을 사용하여 배포를 다시 시작합니다.

버전 2602 및 2603의 알려진 문제

공기가 부족한 환경에서 2602에서 2604로 업그레이드하지 못함

증상: 패키지 업로드 중에 에어 갭이 있는 환경에서 빌드 2602에서 업그레이드하는 데 실패하고 다음과 유사한 오류가 발생합니다.

ErrorReports    : {Update Download: Update package 'arca.update.package.2603.1.25553.zip' did not pass validation. Below is the summary of the validation error(s) encountered:
                   - ManifestSignatureInvalid: File signature on Manifest.xml is invalid or it is not signed. The package may be tampered with or corrupted.
                   }

이 오류는 업데이트 패키지가 빌드 2602에서 사용할 수 있는 인증서와 다른 인증서로 서명되었기 때문에 발생합니다.

  1. 다음 zip 을 다운로드하여 시드 노드에 복사합니다.
  2. 다음 스크립트를 수정하고 실행합니다.

해결 방법:

    # Using the operations module:
    $targetFolder = 'C:\ALDO\2602'
    $targetFile = Join-Path $targetFolder "2602-update.zip"
    (New-Item -ItemType Directory $targetFolder -force)|Out-null

    Expand-Archive $targetFile -destinationPath $targetFolder
    Import-Module "$applianceConfigBasePath\OperationsModule\Azure.Local.DisconnectedOperations.psd1" -Force

    $managementEndpoint = "192.168.200.10" 
    $password = ConvertTo-SecureString 'RETRACTED' -AsPlainText -Force  
    $context = Set-DisconnectedOperationsClientContext -ManagementEndpointClientCertificatePath "${env:localappdata}\AzureLocalOpModuleDev\certs\ManagementEndpoint\ManagementEndpointClientAuth.pfx" -ManagementEndpointClientCertificatePassword $password -ManagementEndpointIpAddress $managementEndpoint  

    $recoveryKeys = (Get-ApplianceBitlockerRecoveryKeys).recoverykeyset
    # Run the script (This takes the control plane VM down and reboots it)
    & "$($targetFolder)\ImportCodeSignCertsOffline.ps1" -CertsFolder $targetFolder -BitLockerRecoveryKeys $recoveryKeys
  • 10분 이상 기다립니다.

  • 동일한 PowerShell 컨텍스트에서 다음을 실행합니다.

          Get-ApplianceUpdateHistory                   
    
  • 어플라이언스 VM(가상 머신)을 다시 시작한 후 업데이트 기록에 다음과 같은 오류가 표시될 수 있습니다.

      Type             : UpdatePreparation
      TargetVersion    : 2603.1.25553
      StartTime        : 2026-04-25T04:31:41.627
      EndTime          : 2026-04-25T04:38:38.445
      CompletionStatus : Failed
      FailedTasks      : {Update Download}
      InProgressTasks  : {}
      CompletedTasks   : {}
      PendingTasks     : {}
      ErrorReports     : {}
    
  • Manifest.xml 오류 파일 서명이 더 이상 유효하지 않으면 문제가 해결되고 업데이트 프로세스를 계속할 수 있습니다.

  • 업데이트 프로세스를 계속하려면 다음 명령을 수정하고 실행합니다.

        $updateTargetVersion = ""
        Wait-AppliancePreUpdate -TargetVersion $updateTargetVersion
        Start-ApplianceUpdate -TargetVersion $updateTargetVersion -Wait
    
  • 프로세스를 완료하는 데 약 3시간이 걸립니다.

잘못된 인증서로 인해 부트스트랩 또는 배포 실패(예외)

CRL(인증서 해지 목록)이 비어 있거나 잘못 구성된 경우 부트스트랩 유효성 검사가 실패합니다.

오류 메시지: 부트스트랩에서 오류를 보고했습니다. ALDO 서비스가 00:45:00분 후에 표시되지 않아 Arc 등록에 실패했습니다.

해결 방법:

인증 기관이 올바르게 구성되었는지 확인하고 인증서에 노드가 액세스할 수 있는 CRL 엔드포인트가 포함되어 있는지 확인합니다.

대체 완화 방법:

인증 기관(엔터프라이즈 공개 키 인프라)을 다시 구성할 수 없는 경우 부트스트랩 중에 CRL 검사를 무시할 수 있습니다. 각 Azure 로컬 노드에서 다음 단계를 실행합니다.

Write-Host "Updating Windows MAE Config for the Bootsrap service"
$basePath = "C:\windows\system32\bootstrap"

Write-Host "Looking for config file under $basePath"
$contentDir = Get-ChildItem -Path $basePath -Filter "content_*" -Directory -ErrorAction SilentlyContinue | Sort-Object Name -Descending | Select-Object -First 1
if (-not $contentDir) {
    Write-Warning "Could not find content_* directory under $basePath"
    return
}
Write-Host "Found content directory: $($contentDir.FullName)"

$ConfigPath = Join-Path $contentDir.FullName "Microsoft.Azure.Edge.Bootstrap.ManagementService\windows.mae.config.json"
if (-not (Test-Path $ConfigPath)) {
    Write-Warning "Config file $ConfigPath not found"
    return
}
Write-Host "Config file found at $ConfigPath"

$configContent = Get-Content -Path $ConfigPath -Raw | ConvertFrom-Json
$configContent.ManagementSettings.CheckCertificateRevocationList = $false
Write-Host "Updated existing CheckCertificateRevocationList property to false"

Stop-Service -Name "BootstrapManagementService" -Force -ErrorAction Stop
Write-Host "BootstrapManagementService stopped successfully"

$configContent | ConvertTo-Json -Depth 10 | Set-Content -Path $ConfigPath -Force
Write-Host "Successfully saved modified config"

Write-Host "Starting BootstrapManagementService..."
Start-Service -Name "BootstrapManagementService"
Write-Host "Waiting 60 seconds for service to fully initialize..."
Start-Sleep -Seconds 60
Write-Host "Successfully started BootstrapManagementService"  

포털 문제

정책

이 릴리스에서는 Azure Policy 포털 인터페이스에 알려진 문제가 있습니다. 해결 방법으로 Azure CLI 또는 Azure PowerShell 사용합니다.

SSH 키

Azure 포털에는 Linux VM 또는 AKS(Azure Kubernetes Service) 클러스터를 생성할 때 SSH 키를 생성하지 못하게 하는 잘 알려진 문제가 있습니다.

해결 방법:

명령줄 도구를 사용하여 SSH 키를 생성하고 VM 또는 AKS 생성 프로세스 중에 키를 포함합니다.

다른 클러스터 배포 실패 - 호스트 보호 인증서를 사용할 수 없음

전용 관리 클러스터를 성공적으로 배포한 후 더 많은 Azure 로컬 클러스터를 배포하면 배포가 실패합니다.

해결 방법:

관리 클러스터의 첫 번째 노드에서 다음 인증서를 복사하여 모든 Azure 로컬 노드(워크로드 클러스터)에 C:\Users\Administrator\AppData\Roaming\AzureLocal\붙여넣습니다.

새 워크로드 클러스터를 배포하기 전에 각 Azure 로컬 노드에 다음 파일이 있는지 확인합니다.

  • C:\Users\Administrator\AppData\Roaming\AzureLocal\AzsVmHostGuardian-IRVM01-encryption.pfx
  • C:\Users\Administrator\AppData\Roaming\AzureLocal\AzsVmHostGuardian-IRVM01-signing.pfx

컨트롤 플레인 배포가 멈춰 완료되지 않은 채 시간 초과됩니다

드문 경우 배포가 시간 초과될 수 있으며, 8시간이 지난 후에도 서비스가 100% 수렴 상태에 도달하지 못할 수 있습니다.

해결 방법:

연결이 끊긴 작업 어플라이언스를 다시 배포합니다. 문제가 2~3회 새로 배포된 후에도 지속되면 로그를 수집하고 지원 티켓을 엽니다.

인증서 생성이 중단됨

원격 데스크톱 세션을 통해 실행하는 경우 운영 모듈을 사용하든 스크립트 기반 접근 방식을 사용하든 인증서 생성 프로세스가 중단될 수 있습니다.

해결 방법:

원격 데스크톱 세션이 스마트 카드를 매핑하지 않는지 확인합니다. 스마트 카드 매핑이 사용 설정되어 있는 경우, 인증서를 생성하기 위해 스크립트를 실행하면 certreq이(가) 멈출 수 있습니다.

Set-MgmtClusterDenyPolicy.ps1 스크립트가 없습니다.

완화 방법: 다음 스크립트를 사용하여 파일을 생성하세요.

<#
.SYNOPSIS
    Denies resource creation on a management cluster Custom Location via Azure Policy.

.DESCRIPTION
    This script creates an Azure Policy definition with a deny effect targeting the management
    cluster's Custom Location and assigns it at subscription scope. It uses Azure PowerShell cmdlets
    to create both the policy definition and assignment.

    The policy blocks any resource creation where the extendedLocation targets the specified
    management cluster Custom Location. Due to the single-CL-per-subscription design constraint,
    the policy definition and assignment use hardcoded names. Re-running the script with a
    different Custom Location ID will overwrite the previous assignment.

.PARAMETER SubscriptionId
    The Azure subscription GUID where the policy definition and assignment will be created.
    If omitted (and -AllSubscriptions is not set), the script runs against the current
    Azure PowerShell subscription context.

.PARAMETER MgmtClusterCustomLocationId
    The fully-qualified ARM resource ID of the management cluster Custom Location to deny
    resource creation against.

.PARAMETER AllSubscriptions
    When set, the script applies the deny policy to every enabled subscription the caller
    has access to. If both -AllSubscriptions and -SubscriptionId are provided,
    -AllSubscriptions takes precedence and -SubscriptionId is ignored.

.EXAMPLE
    .\Set-MgmtClusterDenyPolicy.ps1 `
        -SubscriptionId "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e" `
        -MgmtClusterCustomLocationId "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-rg/providers/Microsoft.ExtendedLocation/customLocations/my-custom-location"

.EXAMPLE
    .\Set-MgmtClusterDenyPolicy.ps1 `
        -AllSubscriptions `
        -MgmtClusterCustomLocationId "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/my-rg/providers/Microsoft.ExtendedLocation/customLocations/my-custom-location"

.NOTES
    Rollback commands:
        Remove-AzPolicyAssignment -Name 'deny-resource-creation-on-mgmt-cluster-assignment' -Scope '/subscriptions/{subId}'
        Remove-AzPolicyDefinition -Name 'deny-resource-creation-on-mgmt-cluster' -SubscriptionId '{subId}' -Force

    Requires active Azure PowerShell session (Connect-AzAccount) and Resource Policy Contributor role.
#>
[CmdletBinding()]
param(
    [Parameter(Mandatory = $false)]
    [ValidatePattern('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$')]
    [string]$SubscriptionId,

    [Parameter(Mandatory = $true)]
    [ValidatePattern('^/subscriptions/[0-9a-fA-F-]+/resourceGroups/[^/]+/providers/Microsoft\.ExtendedLocation/customLocations/[^/]+$')]
    [string]$MgmtClusterCustomLocationId,

    [Parameter(Mandatory = $false)]
    [switch]$AllSubscriptions
)

# Validate required Az modules
$modAccounts = Get-Module -ListAvailable -Name Az.Accounts | Sort-Object Version -Descending | Select-Object -First 1
if (-not $modAccounts -or $modAccounts.Version -lt [version]'2.13.0') {
    throw "Az.Accounts module >= 2.13.0 is required. Install via: Install-Module -Name Az.Accounts -MinimumVersion 2.13.0"
}

$modResources = Get-Module -ListAvailable -Name Az.Resources | Sort-Object Version -Descending | Select-Object -First 1
if (-not $modResources -or $modResources.Version -lt [version]'6.12.0') {
    throw "Az.Resources module >= 6.12.0 is required. Install via: Install-Module -Name Az.Resources -MinimumVersion 6.12.0"
}

# Check authentication
$azContext = Get-AzContext
if (-not $azContext) {
    throw "Not connected to Azure. Run 'Connect-AzAccount' first."
}

# ---------------------------------------------------------------------------
# Determine subscription list
# ---------------------------------------------------------------------------

$subscriptions = @()

if ($AllSubscriptions) {
    if (-not [string]::IsNullOrEmpty($SubscriptionId)) {
        Write-Warning "Both -AllSubscriptions and -SubscriptionId were provided. -AllSubscriptions takes precedence; -SubscriptionId will be ignored."
    }
    Write-Host "Retrieving all enabled subscriptions..."
    try {
        $subs = Get-AzSubscription -ErrorAction Stop | Where-Object { $_.State -eq 'Enabled' }
    } catch {
        throw "Failed to retrieve subscription list. $($_.Exception.Message)"
    }
    $subscriptions = @($subs)
    if ($subscriptions.Count -eq 0) {
        throw "No enabled subscriptions found for the current account."
    }
    Write-Host "Found $($subscriptions.Count) enabled subscription(s)." -ForegroundColor Cyan
} elseif ([string]::IsNullOrEmpty($SubscriptionId)) {
    # No SubscriptionId provided — resolve from current Azure PowerShell context
    $currentCtx = Get-AzContext
    if (-not $currentCtx -or [string]::IsNullOrEmpty($currentCtx.Subscription.Id)) {
        throw "Failed to determine the current subscription context. Provide -SubscriptionId or run 'Set-AzContext' first."
    }
    Write-Host "No SubscriptionId provided. Using current subscription context: $($currentCtx.Subscription.Name) ($($currentCtx.Subscription.Id))"
    $subscriptions = @([PSCustomObject]@{ Id = $currentCtx.Subscription.Id; Name = $currentCtx.Subscription.Name })
} else {
    $subscriptions = @([PSCustomObject]@{ Id = $SubscriptionId; Name = $SubscriptionId })
}

# ---------------------------------------------------------------------------
# Prepare policy JSON definitions (inline)
# ---------------------------------------------------------------------------

$policyRuleJson = @'
{
  "if": {
    "allOf": [
      {
        "field": "extendedLocation.name",
        "equals": "[parameters('customLocationId')]"
      },
      {
        "field": "extendedLocation.type",
        "equals": "CustomLocation"
      }
    ]
  },
  "then": {
    "effect": "deny"
  }
}
'@

$policyParamJson = @'
{
  "customLocationId": {
    "type": "String",
    "metadata": {
      "displayName": "Custom Location Resource ID",
      "description": "The full ARM resource ID of the Custom Location to deny resource creation against (e.g., /subscriptions/{subId}/resourceGroups/{rg}/providers/Microsoft.ExtendedLocation/customLocations/{name})"
    }
  }
}
'@

# ---------------------------------------------------------------------------
# Process each subscription
# ---------------------------------------------------------------------------

$results  = @()
$failures = @()

foreach ($sub in $subscriptions) {
    $currentSubId   = $sub.Id
    $currentSubName = $sub.Name

    Write-Host "`n===== Processing subscription: $currentSubName ($currentSubId) =====" -ForegroundColor Cyan

    # --- Set subscription context ---
    try {
        Set-AzContext -SubscriptionId $currentSubId -ErrorAction Stop | Out-Null
    } catch {
        $msg = "Failed to set subscription context to '$currentSubId'. $($_.Exception.Message)"
        Write-Error $msg
        $failures += [PSCustomObject]@{ SubscriptionId = $currentSubId; SubscriptionName = $currentSubName; Error = $msg }
        if (-not $AllSubscriptions) { throw $msg }
        continue
    }

    # --- Create policy definition ---
    Write-Host "  Creating policy definition 'deny-resource-creation-on-mgmt-cluster'..."
    try {
        $definition = New-AzPolicyDefinition `
            -Name 'deny-resource-creation-on-mgmt-cluster' `
            -DisplayName 'Deny resource creation on management cluster Custom Location' `
            -Description 'Blocks resource creation when extendedLocation targets the management cluster Custom Location' `
            -Policy $policyRuleJson `
            -Parameter $policyParamJson `
            -Mode 'All' `
            -Metadata '{"category":"Management Cluster"}' `
            -SubscriptionId $currentSubId `
            -ErrorAction Stop
    } catch {
        $msg = "Failed to create policy definition in subscription '$currentSubId'. $($_.Exception.Message)"
        Write-Error $msg
        $failures += [PSCustomObject]@{ SubscriptionId = $currentSubId; SubscriptionName = $currentSubName; Error = $msg }
        if (-not $AllSubscriptions) { throw $msg }
        continue
    }

    if ($null -eq $definition -or [string]::IsNullOrEmpty($definition.Id)) {
        $msg = "Policy definition was created in subscription '$currentSubId' but returned unexpected output."
        Write-Error $msg
        $failures += [PSCustomObject]@{ SubscriptionId = $currentSubId; SubscriptionName = $currentSubName; Error = $msg }
        if (-not $AllSubscriptions) { throw $msg }
        continue
    }

    # --- Create policy assignment ---
    $scope = "/subscriptions/$currentSubId"

    Write-Host "  Creating policy assignment 'deny-resource-creation-on-mgmt-cluster-assignment'..."
    try {
        $assignment = New-AzPolicyAssignment `
            -Name 'deny-resource-creation-on-mgmt-cluster-assignment' `
            -DisplayName 'Deny resource creation on management cluster Custom Location' `
            -PolicyDefinition $definition `
            -Scope $scope `
            -PolicyParameterObject @{ customLocationId = $MgmtClusterCustomLocationId } `
            -EnforcementMode 'Default' `
            -ErrorAction Stop
    } catch {
        $msg = "Failed to create policy assignment in subscription '$currentSubId'. $($_.Exception.Message)"
        Write-Error $msg
        $failures += [PSCustomObject]@{ SubscriptionId = $currentSubId; SubscriptionName = $currentSubName; Error = $msg }
        if (-not $AllSubscriptions) { throw $msg }
        continue
    }

    if ($null -eq $assignment) {
        $msg = "Policy assignment was created in subscription '$currentSubId' but returned unexpected output."
        Write-Error $msg
        $failures += [PSCustomObject]@{ SubscriptionId = $currentSubId; SubscriptionName = $currentSubName; Error = $msg }
        if (-not $AllSubscriptions) { throw $msg }
        continue
    }

    Write-Host "  Policy successfully created and assigned." -ForegroundColor Green

    $results += [PSCustomObject]@{
        SubscriptionName            = $currentSubName
        SubscriptionId              = $currentSubId
        DefinitionName              = $definition.Name
        DefinitionId                = $definition.PolicyDefinitionId
        AssignmentName              = $assignment.Name
        AssignmentId                = $assignment.PolicyAssignmentId
        Scope                       = $scope
        MgmtClusterCustomLocationId = $MgmtClusterCustomLocationId
    }
}

# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------

Write-Host "`n===== Summary =====" -ForegroundColor Cyan
Write-Host "  Succeeded: $($results.Count) subscription(s)" -ForegroundColor Green
if ($failures.Count -gt 0) {
    Write-Host "  Failed:    $($failures.Count) subscription(s)" -ForegroundColor Red
    foreach ($f in $failures) {
        Write-Host "    - $($f.SubscriptionName) ($($f.SubscriptionId))" -ForegroundColor Red
    }
}

if ($results.Count -gt 0) {
    Write-Output $results
}

if ($failures.Count -gt 0 -and $results.Count -eq 0) {
    throw "All subscriptions failed. See errors above."
}

관리 엔드포인트를 사용하는 경우 SSL/TLS 오류(OperationsModule)

관리 엔드포인트(예 Get-ApplianceHealthState: )를 사용하는 cmdlet을 사용하는 경우 "예외를 throw했습니다. 요청이 중단되었습니다. SSL/TLS 보안 채널을 만들 수 없습니다... 다시 시도 중"이라고 말했다.

해결 방법:

2511의 경우 Set-DisconnectedOperationsClientContext를 사용하지 마세요. 대신 $context = New-DisconnectedOperationsClientContext를 사용하고 $context를 각 cmdlet에 전달하세요.

OEM(Original Equipment Manufacturer)에서 제공한 이미지의 노드에서 Arc 부트스트랩(Invoke-AzStackHCIArcInitialization)이 실패했습니다.

OEM 이미지를 실행하는 경우 올바른 OS 기준선에 있는지 확인합니다.

아래 단계를 수행하세요.

  1. 지원되는 동일한 버전 또는 이전 버전(예: 2508 이전 버전)에 있는지 확인합니다.

  2. 각 노드에서 0일 업데이트를 사용하지 않도록 설정합니다.

    Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment\EdgeArcBootstrapSetup" -Name "MicrosoftOSImage" -Value 1
    
  3. 연결이 끊긴 작업 버전 대상에 대해 Microsoft 제공된 ISO로 업그레이드합니다. 이 방법을 사용하여 노드를 다시 이미징할 때 업그레이드를 선택하고 설정을 유지하세요.

    • 또는 다음 명령을 실행하여 올바른 업데이트를 가져옵니다.

      # Define the solution version and local package path - review the correct versions.
      # Only do this if your OEM image is on a earlier version than the target version.
      
      $TargetSolutionVersion = "12.2511.1002.5"
      $localPlatformVersion = "12.2511.0.3038"
      $DownloadUpdateZipUrl = "https://azurestackreleases.download.prss.microsoft.com/dbazure/AzureLocal/WindowsPlatform/$($localPlatformVersion)/Platform.$($localPlatformVersion).zip"
      $LocalPlatformPackagePath = "C:\Platform.$($localPlatformVersion).zip"
      
      # Download the DownloadUpdateZipUrl to LocalPlatformPackagePath (Alternative do this from browser and copy file over if you cannot run this on your nodes/disconnected scenarios)
      Invoke-WebRequest $DownloadUpdateZipUrl -Outfile $LocalPlatformPackagePath
      
      $updateConfig = @{
        "TargetSolutionVersion" = $TargetSolutionVersion
        "LocalPlatformPackagePath" = $LocalPlatformPackagePath
      }
      
      $configHash = @{
        "UpdateConfiguration" = $updateConfig
      }
      
      # Trigger zero-day update
      $tempConfigPath = "C:\temp.json"
      $configHash | ConvertTo-Json -Depth 3 | Out-File $tempConfigPath -Force
      Start-ArcBootstrap -ConfigFilePath $tempConfigPath
      
      # Continue with Invoke-AzStackHCIArcInitialization.
      
  4. 버전 호환성 테이블을 검토합니다.

포털 환경 중에 클라우드 배포 유효성 검사 실패

다운로드할 aka.ms 링크에 도달하려고 하면 SBE(솔루션 작성기 확장) 유효성 검사가 실패합니다.

해결 방법:

  1. UX에서 유효성 검사가 실패할 때까지 클라우드 배포(포털) 흐름을 실행합니다.

  2. 패치된 버전의 ExtractOEMContent.ps1다운로드합니다.

  3. 패치된 버전의 EN-US\ExtractOEMContent.Strings.psd1을 다운로드합니다.

  4. 즐겨 찾는 편집 ExtractOEMContent.ps1기를 사용하여 다음 파일을 수정합니다.

  5. 이 파일의 줄 899를 다음 코드 조각으로 바꿉다.

    if (-not (Test-SBEXMLSignature -XmlPath $sbeDiscoveryManifestPath)) {
        throw ($localizedStrings.OEMManifestSignature -f $sbeDiscoveryManifestPath)
    }
    $packageHash = (Get-FileHash -Path $zipFile.FullName -Algorithm SHA256).Hash
    $manifestXML = New-Object -TypeName System.Xml.XmlDocument
    $manifestXML.PreserveWhitespace = $false
    $xmlTextReader = New-Object -TypeName System.Xml.XmlTextReader -ArgumentList $sbeDiscoveryManifestPath
    $manifestXML.Load($xmlTextReader)
    $xmlTextReader.Dispose()
    
    # Test that the zip file hash matches the package hash from the manifest
    $applicableUpdate = $manifestXML.SelectSingleNode("//ApplicableUpdate[UpdateInfo/PackageHash='$packageHash']")
    if ([System.String]::IsNullOrEmpty($applicableUpdate)) {
        throw "$($zipFile.FullName) hash of $packageHash does not match value in manifest at $sbeDiscoveryManifestPath"
    }
    $result = [PSCustomObject]@{
        Code = "Latest"
        Message = "Override for ALDO"
        Endpoint = "https://aka.ms/AzureStackSBEUpdate/Dell"
        ApplicableUpdate = $applicableUpdate.OuterXml
    }
    
  6. 새로 수정된 파일을 C:\CloudDeployment\Setup\Common\ExtractOEMContent.ps1 첫 번째 컴퓨터에 복사합니다.

  7. 다운로드한 수정되지 않은 파일을 C:\CloudDeployment\Setup\Common\En-US\ExtractOEMContent.Strings.psd1 첫 번째 컴퓨터에 복사합니다.

  8. 클라우드 배포를 다시 시작합니다.

클라우드 배포(유효성 검사 또는 배포)가 중단됨

유효성 검사 또는 클라우드 배포 흐름 중에 첫 번째 컴퓨터(시드 노드)가 다시 시작되어 컨트롤 플레인 어플라이언스가 다시 시작됩니다. 경우에 따라 이 프로세스가 예상보다 오래 걸리므로 HIS 엔드포인트에 연결할 수 없으므로 HIMDS(Hybrid Instance Metadata Service)가 중지됩니다. 이 문제로 인해 배포 흐름의 응답이 중지될 수 있습니다.

해결 방법:

  1. HIMDS 서비스가 중지되었는지 확인합니다.

    Get-Service HIMDS
    
  2. 서비스가 중단되어 있다면 서비스를 시작합니다.

    Start-Service HIMDS
    
  3. 에서 첫 번째 노드 C:\CloudDeployment\Logs의 로그를 확인합니다.

  4. 적절한 로그 파일을 검토합니다.

    • 유효성 검사 단계: EnvironmentValidator로 시작하는 이름으로 최신 파일을 확인합니다.
    • 배포 단계: CloudDeployment로 시작하는 이름으로 최신 파일을 확인합니다.
    • 파일의 상태가 포털에 표시되는 상태와 다른 경우 다음 단계에 따라 배포 상태를 포털과 다시 동기화합니다.

배포 상태가 클러스터에서 포털로 동기화되지 않습니다.

포털은 클라우드 배포가 완료되거나 배포가 예상보다 오래 걸리더라도 진행 중임을 보여 줍니다. 이 문제는 클라우드 배포 상태가 실제 상태와 동기화되지 않기 때문에 발생합니다.

포털과 로그 파일이 서로 동기화되지 않은 경우, Restart-Service LCMController을(를) 실행하여 릴레이와의 연결을 다시 설정하기 위해 LCM 컨트롤러 서비스를 다시 시작하십시오.

첫 번째 컴퓨터에서의 대응:

  1. 다음 파일을 찾습니다.

    • 유효성 검사 단계의 경우:C:\ECEStore\efb61d70-47ed-8f44-5d63-bed6adc0fb0f\559dd25c-9d86-dc72-4bea-b9f364d103f8
    • 배포 단계의 경우:C:\ECEStore\efb61d70-47ed-8f44-5d63-bed6adc0fb0f\086a22e3-ef1a-7b3a-dc9d-f407953b0f84
  2. 파일의 첫 번째 줄에 있는 EndTimeUtc 특성을 컴퓨터의 현재 시간에 따라 이후 시간으로 업데이트합니다. 예를 들어 <작업 유형="CloudDeployment" StartTimeUtc="2025-04-09T08:01:51.9513768Z" Status="Success" EndTimeUtc="2025-04-10T23:30:45.9821393Z">.

  3. 파일을 저장하고 닫습니다.

  4. LCM은 5-10분 이내에 HCI(Hyper-Converged Infrastructure) RP(리소스 공급자)에 알림을 보냅니다.

  5. LCM 컨트롤러 로그를 보려면 다음 명령을 사용합니다.

    Get-WinEvent -LogName "Microsoft.AzureStack.LCMController.EventSource/Admin" -MaxEvents 100 | Where-Object {$_.Message -like "*from edge common logger*"} | Select-Object TimeCreated, Message
    

비고

이 프로세스는 시간 제한(클라우드 배포 시작부터 약 48시간)으로 인해 HCI RP가 배포 상태에 실패하지 않은 경우에 작동합니다.

연결이 끊긴 작업 어플라이언스를 배포하지 못했습니다(Appliance.Operations 실패)

OperationsModule의 관리 TLS 인증서 암호, 외부 인증서 암호 또는 관찰 가능성 구성 비밀의 일부 특수 문자는 오류 출력으로 인해 배포가 실패할 수 있습니다. Appliance.Operations 작업 [옵션]

해결 방법:

암호에 작은따옴표 또는 큰따옴표와 같은 특수 문자를 사용하지 마세요.

포털에서 리소스가 사라짐

이전에 작업했던 동일한 사용자 계정으로 포털에 로그인하면 리소스가 누락되고 표시되지 않습니다.

완화: 시크릿 모드에서 브라우저를 시작하거나 브라우저를 닫고 모든 쿠키를 지웁니다. 그런 다음, 로컬 포털로 돌아가서 다시 로그인합니다. 또는 시드 노드에서 IRVM01을 다시 시작하고 서비스가 다시 온라인 상태가 될 때까지 기다립니다.

노드당 메모리가 128GB 미만인 경우 메모리 사용량

연결이 끊긴 작업 어플라이언스는 78GB의 메모리를 사용합니다. 노드에 128GB 미만의 메모리가 있는 경우 어플라이언스를 배포한 후 Azure 로컬 인스턴스를 배포하기 전에 다음 단계를 완료합니다.

해결 방법:

  1. 시드 노드에서 IRVM01VM 종료합니다.
  2. IRVM01 가상 머신 메모리 설정을 64GB로 변경합니다.
  3. IRVM01 어플라이언스 시작
  4. 수렴을 기다리세요. 모든 서비스가 수렴될 때까지 Get-ApplianceHealthState을(를) 모니터링합니다.
  5. Azure 로컬 인스턴스를 배포합니다.

배포 실패

가상 환경에서는 배포 시간이 초과될 수 있으며 서비스는 8시간 후에도 100개의% 수렴에 도달하지 못할 수 있습니다.

해결 방법:

연결이 끊긴 작업 어플라이언스를 몇 번 다시 배포합니다. 물리적 환경을 사용하고 문제가 계속되는 경우 로그를 수집하고 지원 티켓을 엽니다.

Azure Key Vault를 사용한 Azure 로컬 배포

새로 만든 Azure Key Vault 대한 RBAC(Role-Based Access Control) 권한은 전파하는 데 최대 20분이 걸릴 수 있습니다. 로컬 포털에서 Key Vault 만들고 클라우드 배포를 빠르게 완료하려고 하면 클러스터 유효성 검사 중에 권한 문제가 발생할 수 있습니다.

해결 방법:

Azure Key Vault 만든 후 20분 정도 기다렸다가 클러스터 배포를 완료하거나 Key Vault 미리 만듭니다.

미리 Key Vault를 만드는 경우, 다음의 작업을 할당해야 합니다.

  • 각 노드에 대한 관리 ID
  • Key Vault 관리자
  • 클라우드에 Key Vault에 대한 명시적 역할을 배정하는 사용자:
    • Key Vault 비밀 책임자 및 Key Vault 데이터 액세스 관리자.

다음은 예제 스크립트입니다. 이 스크립트를 수정하고 사용하여 Key Vault 미리 만듭니다.

param($resourceGroupName = "aldo-disconnected", $keyVaultName = "aldo-kv", $subscriptionName = "Starter Subscription")

$location = "autonomous"

Write-Verbose "Sign in interactive with the user who does cloud deployment"
# Sign in to Azure CLI (use the user you run the portal deployment flow with)"
az login 
az account set --subscription $subscriptionName
$accountInfo = (az account show)|convertfrom-json

# Create the Resource Group
$rg = (az group create --name $resourceGroupName --location $location)|Convertfrom-json

# Create a Key Vault
$kv = (az keyvault create --name $keyVaultName --resource-group $resourceGroupName --location $location --enable-rbac-authorization $true)|Convertfrom-json

Write-Verbose "Assigning permissions to $($accountInfo.user.name) on the Key Vault"
# Assign the secrets officer role to the resource group (you can use KV explicit).
az role assignment create --assignee $accountInfo.user.name --role "Key Vault Secrets Officer" --scope $kv.Id
az role assignment create --assignee $accountInfo.user.name --role "Key Vault Data Access Administrator" --scope $kv.Id

$machines = (az connectedmachine list -g $resourceGroupName)|ConvertFrom-Json

# For now, a minimum of 3 machines for Azure Local disconnected operations are supported.
if($machines.Count -lt 3){
    Write-Error "No machines found in the resource group $resourceGroupName. Please check the resource group and try again. Please use the same resource group as where your Azure Local nodes are"
    return 1
}

Write-Verbose "Assigning permissions to MSIs $($machines.count) on the Key Vault"

$apps =(az ad sp list)|ConvertFrom-Json
$managedIds=$machines.displayname | foreach-object {
    $name = $_
    $apps|Where-Object {$_.ServicePrincipalType -eq 'ManagedIdentity' -and $_.displayname -match $name}
}

# Assign role to each of the managed IDs (Arc-VMs) in the RG 
$managedIds|foreach-object {    
    az role assignment create --role "Key Vault Administrator" --assignee $_.Id --scope $kv.id
}

Write-Verbose "Wait 20 min before running cloud deployment from portal"

Azure 로컬 VM

Azure Resource Graph에서 태그 추가 또는 편집 오류

Azure 로컬 VM을 시작, 다시 시작 또는 중지하면 전원 작업 단추가 비활성화되고 상태가 올바르게 업데이트되지 않습니다.

해결 방법:

CLI(Azure Command-Line Interface)를 사용하여 리소스에 대한 태그를 추가하거나 편집합니다.

VM을 중지한 후 시작, 다시 시작 또는 삭제 버튼이 비활성화됩니다.

Azure 로컬 VM을 중지하면 Azure 포털에서 시작, 다시 시작 및 삭제 단추가 비활성화됩니다.

해결 방법:

브라우저와 페이지를 새로 고칩니다.

VM 리소스 삭제

포털에서 VM을 삭제하면 관련 리소스 삭제에 실패 하고 '네트워크 인터페이스' 유형의 연결된 리소스 '이름'을 삭제하지 못한 메시지가 표시될 수 있습니다.

해결 방법:

VM을 삭제한 후 CLI를 사용하여 연결된 네트워크 인터페이스를 삭제합니다. 다음 명령을 실행합니다.

az stack-hci-vm network nic delete

Azure 로컬 에서 AKS(Azure Kubernetes Service)

완전히 에어갭 환경에서 AKS 배포가 실패합니다.

AKS 배포는 완전히 에어갭으로 격리된 환경에서는 실패합니다. 현재 릴리스에서는 이 문제에 대해 완화를 사용할 수 없습니다.

AKS 클러스터를 만들 때 기존 공개 키 사용

이 릴리스에서는 AKS 클러스터를 만들 때만 기존 공개 키를 사용할 수 있습니다.

해결 방법:

SSH 키를 만들려면 다음 명령줄 도구를 사용하고 공개 키를 UI에 붙여넣습니다.

ssh-keygen -t rsa 
(cat ~\.ssh\id_rsa.pub)|set-clipboard

포털에서 노드 풀 업데이트 또는 크기 조정을 사용할 수 없습니다.

포털에서 노드 풀을 업데이트하거나 스케일링하는 기능은 이 미리 보기 릴리스에서 지원되지 않습니다.

해결 방법:

CLI를 사용하여 노드 풀을 업데이트하거나 크기를 조정합니다.

az aksarc nodepool update
az aksarc nodepool scale

크기 조정 제한

현재 Azure 로컬 연결이 끊긴 작업 크기 조정 봉투에서 20개 이상의 워크로드 클러스터를 실행하면 컨트롤 플레인 안정성에 영향을 줄 수 있습니다. 지속적인 부하에서 연결이 끊긴 작업 제어 평면은 시간이 지남에 따라 응답성이 저하될 수 있으므로 클러스터 수가 많을수록 관리 효율성과 안정성에 영향을 줄 수 있습니다.

해결 방법:

지원 가능한 규모 범위가 확대될 때까지 안정적이고 신뢰할 수 있는 분리된 환경에서의 운영을 유지하려면 워크로드 클러스터 수를 20개 이하로 제한하십시오.

Azure 로컬 (Kubernetes 클러스터) 아래에 비어 있는 Kubernetes 클러스터 목록

Azure 로컬 이동하여 Kubernetes 클러스터 클릭하면 빈 클러스터 목록이 표시될 수 있습니다.

해결 방법:

왼쪽 메뉴에서 Kubernetes>Azure Arc 이동하거나 검색 창을 사용합니다. 클러스터가 목록에 표시됩니다.

Kubernetes 서비스 알림 저장이 중단됨

최신 버전의 Kubernetes로 업데이트한 후 중단된 알림이 Save Kubernetes service표시될 수 있습니다.

해결 방법:

클러스터 보기 페이지로 이동하여 새로 고칩니다. 상태가 업그레이드 또는 완료된 것으로 표시되는지 확인합니다. 업데이트가 성공적으로 완료되면 알림을 무시할 수 있습니다.

활동 로그에 인증 문제가 표시됨

이 릴리스에서 포털 경고를 무시합니다.

Kubernetes RBAC를 사용한 Microsoft Entra 인증 실패

Entra 인증을 사용하여 Kubernetes 클러스터를 만들려고 하면 오류가 발생합니다.

Kubernetes RBAC를 사용하는 로컬 계정만 이 미리 보기 릴리스에서 지원됩니다.

Azure Arc 확장

AKS 클러스터의 확장으로 이동하면 추가 단추가 비활성화되고 확장이 표시되지 않습니다.

Azure Arc 확장은 이 미리 보기 릴리스에서 지원되지 않습니다.

삭제 후 포털에 AKS 리소스 표시

포털에서 AKS 클러스터를 삭제하면 리소스가 계속 표시됩니다.

해결 방법:

CLI를 사용하여 클러스터를 삭제하고 정리합니다. 다음 명령을 실행합니다.

az aksarc delete

노드 또는 컨트롤 플레인 VM 다시 시작

노드 또는 컨트롤 플레인 VM을 다시 시작하면 시스템이 완전히 준비되는 데 최대 1시간이 걸릴 수 있습니다. 로컬 포털, 누락된 리소스 또는 실패한 배포와 관련된 문제가 발견되면 OperationsModule 을 사용하여 어플라이언스 상태를 확인하여 모든 서비스가 완전히 수렴되었는지 확인합니다.

구독

운영자가 구독을 만듭니다.

운영자로 새 구독을 만든 후 구독이 목록에 클릭할 수 없는 것으로 표시되고 소유자에 대한 액세스 권한이 표시되지 않습니다 .

해결 방법:

브라우저 창을 새로 고칩니다.

운영자 구독 목록 보기(시간 제한)

운영자로 로그인한 경우 시간 제한 화면이 표시되고 구독을 보거나 나열하거나 만들 수 없습니다.

원인:

이 문제는 구독 소유자가 삭제되거나 원본 ID 시스템에서 로컬 컨트롤 플레인으로 동기화되지 않을 때 발생합니다. 구독을 보려고 하면 소유자의 ID를 사용할 수 없으므로 프로세스가 실패합니다.

해결 방법:

포털이 작동하지 않는 경우 Azure CLI 또는 REST API를 사용하여 구독을 만들고 나열합니다. 다른 소유자를 할당하려면 REST API를 사용하고 구독을 subscriptionOwnerId 만들 때 매개 변수를 입력합니다.

Azure CLI

클라우드 관리

az cloud 명령(예: az cloud register, az cloud show, az cloud set)을 사용할 때 클라우드 이름에 대문자를 사용하면 문제가 발생할 수 있습니다.

해결 방법:

하위 명령의 클라우드 이름(예: az cloud, register또는 show.)에 set 소문자만 사용합니다.

구독 만들기

Azure CLI 새 구독에 대한 subscriptionOwnerId 제공을 지원하지 않습니다. 이 제한은 운영자가 소유자를 변경할 수 없는 새로 만든 구독의 기본 소유자임을 의미합니다.

해결 방법:

다른 소유자를 사용하여 프로세스를 자동화해야 하는 경우 다른 소유자와 함께 구독을 만드는 데 사용합니다 az rest .

Azure 포털

로그아웃 실패

로그아웃을 선택하면 요청이 작동하지 않습니다.

해결 방법:

브라우저를 닫은 다음 포털 URL로 이동합니다.

Azure Resource Manager

템플릿 사양

템플릿 사양은 지원되지 않습니다. 템플릿 사양과 함께 ARM 템플릿을 사용하는 배포는 실패합니다.

지원되지 않는 시나리오

다음 시나리오는 지원되지 않습니다.

  • Azure 로컬 이 아닌 VM
  • AKS가 아닌 클러스터

이러한 시나리오를 테스트할 때, 이러한 시스템이 여러분의 맞춤형 CA를 신뢰하도록 해야 하며, Arc를 사용하도록 설정할 때 -custom-ca-cert을(를) 지정해야 합니다.

이 기능은 Azure 로컬 2602 이상에서만 사용할 수 있습니다.