VM 애플리케이션은 Azure Compute Gallery의 리소스 유형으로, 가상 머신 및 확장 집합에서 애플리케이션을 관리하고 배포하는 현대적이고 유연한 접근 방식을 제공합니다. 기본 VM 이미지에서 애플리케이션 설치를 분리하여 업데이트를 간소화하고, 이미지 유지 관리 오버헤드를 줄이고, 배포 주기를 가속화할 수 있습니다. 이 방법을 사용하면 모든 애플리케이션 변경에 대해 VM 이미지를 다시 빌드하고 다시 게시할 필요가 없으므로 반복 속도가 빨라지고 운영 민첩성이 향상됩니다. VM 애플리케이션은 Azure VM에서 AI, 대규모, 짧은 대기 시간, 마이크로 서비스, 보안 및 규격 워크로드를 배포하는 데 가장 적합합니다.
리소스 | 설명 |
---|---|
Azure Compute Gallery | 갤러리는 애플리케이션 패키지를 관리하고 공유하기 위한 리포지토리입니다. 사용자는 갤러리 리소스를 공유할 수 있으며 모든 자식 리소스가 자동으로 공유됩니다. 갤러리 이름은 구독당 고유해야 합니다. 예를 들어 모든 OS 이미지를 저장할 하나의 갤러리와 모든 VM 애플리케이션을 저장할 다른 갤러리가 있을 수 있습니다. |
VM 애플리케이션 | VM 애플리케이션의 정의입니다. 모든 버전에 대한 공통 메타데이터를 저장하는 논리 리소스입니다. 예를 들어 Apache Tomcat에 대한 애플리케이션 정의가 있고 그 안에 여러 버전이 있을 수 있습니다. |
VM 애플리케이션 버전 | 애플리케이션 패키지 및 버전별 구성을 보유하는 배포 가능한 리소스입니다. VM 애플리케이션 버전을 VM 인프라에 가까운 대상 지역에 전역적으로 복제할 수 있습니다. VM 애플리케이션 버전은 해당 지역의 VM에 배포되기 전에 지역에 복제해야 합니다. |
스토리지 계정 | 애플리케이션 패키지는 먼저 스토리지 계정에 업로드됩니다. 그런 다음 Azure Compute Gallery는 SAS URL을 사용하여 이 스토리지 계정에서 애플리케이션 패키지를 다운로드하고 VM 애플리케이션 버전 내에 저장합니다. 또한 Azure Compute Gallery는 VM 애플리케이션 버전 정의에 따라 지역 및 지역 복제본 간에 이 패키지를 복제합니다. Azure Compute 갤러리에서 VM 애플리케이션 버전을 만든 후 스토리지 계정의 애플리케이션 패키지를 삭제할 수 있습니다. |
주요 이점:
-
중앙 집중식 및 유연한 애플리케이션 관리:
- 패키지 한 번: 어디서나 배포: ZIP, MSI(Microsoft 패키지 설치) 또는 EXE 형식으로 애플리케이션을 패키지하고 Azure Compute 갤러리에서 중앙에서 관리합니다.
- 버전 제어: 각 애플리케이션의 여러 버전을 유지 관리하여 최신 또는 특정 버전을 배포합니다.
-
원활한 공유 및 액세스 제어
- Tenant-Wide 공유: 팀 내에서 또는 전체 조직(테넌트)에서 애플리케이션을 공유합니다.
- 통합 RBAC: Azure Role-Based RBAC(Access Control)를 사용하여 게시 및 배포 액세스를 제어합니다.
-
안정적이고 사용자 지정 가능한 배포
- 개별 애플리케이션 제어: 애플리케이션을 독립적으로 설치, 업데이트 또는 삭제합니다. VM 이미지를 다시 빌드할 필요가 없습니다.
- 사용자 지정 가능한 작업: 다시 부팅 처리를 포함하여 애플리케이션에 대한 설치, 업데이트 및 삭제 작업을 사용자 지정합니다.
- Built-In 오류 처리: VM 애플리케이션 실패를 VM 실패에 연결하여 복원력 있는 배포를 보장합니다.
-
확장 가능하고 Low-Latency 분배
- 전역 및 Intra-Region 복제: 대기 시간을 줄이고 복원력을 향상시키기 위해 지역 간 및 지역 내에서 애플리케이션을 자동으로 복제합니다. AzCopy 또는 수동 전송은 필요하지 않습니다.
- High-Scale 시나리오에 최적화됨: 대규모 배포 중에도 짧은 생성 대기 시간을 달성합니다.
-
설계에 따라 보안 및 준수
- 정책 기반 적용: Azure Policy를 사용하여 플릿 전체에 애플리케이션 존재 및 구성을 적용합니다.
- 보안 배포: 잠긴 환경이나 보안 환경에 적합하지 않은 인터넷 기반 다운로드 및 복잡한 프라이빗 링크 설정을 사용하지 마세요.
-
광범위한 플랫폼 지원
- VM 및 확장 집합: 완전한 지원을 포함하여 개별 VM, 유연한 확장 집합, 균일한 확장 집합에 배포합니다.
- 블록 Blob 지원: 청크 업로드 및 백그라운드 스트리밍에 Azure 블록 Blob을 사용하여 큰 애플리케이션 패키지(최대 2GB)를 효율적으로 처리합니다.
VM 애플리케이션 및 VM 애플리케이션 버전 리소스
VM 애플리케이션 리소스는 VM 애플리케이션에 대해 다음을 정의합니다.
- VM 애플리케이션이 저장된 Azure Compute Gallery
- 애플리케이션의 이름입니다.
- Linux 또는 Windows 등의 지원되는 OS 유형
- VM 애플리케이션에 대한 설명
VM 애플리케이션 버전은 배포 가능한 리소스입니다. 버전은 다음 속성으로 정의됩니다.
- 버전 번호
- 스토리지 계정의 애플리케이션 패키지 파일에 대한 링크
- 애플리케이션을 제대로 설치하는 문자열 설치
- 문자열을 제거하여 애플리케이션을 제대로 제거합니다.
- VM 애플리케이션을 최신 버전으로 제대로 업데이트하도록 문자열 업데이트
- 패키지를 VM에 다운로드할 때 사용할 패키지 파일 이름입니다.
- VM에서 애플리케이션을 구성하는 데 사용할 구성 파일 이름
- 라이선스 파일을 포함할 수 있는 VM 애플리케이션의 구성 파일에 대한 링크
- 수명 종료 날짜 수명 종료 날짜는 정보 제공입니다. 수명이 종료된 후에도 VM 애플리케이션 버전을 배포할 수 있습니다.
- 최신 항목에서 제외. 애플리케이션의 최신 버전으로 사용 중인 버전을 유지할 수 있습니다.
- 복제 대상 지역
- 지역당 복제본 수
{
"$schema": "https://schema.management.azure.com/schemas/2020-06-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"galleryName": {
"type": "string"
},
"applicationName": {
"type": "string"
},
"versionName": {
"type": "string",
"metadata": {
"description": "Must follow the format: major.minor.patch (e.g., 1.0.0)"
}
},
"___location": {
"type": "string",
"defaultValue": "West US"
},
"supportedOSType": {
"type": "string",
"allowedValues": ["Windows", "Linux"]
},
"endOfLifeDate": {
"type": "string"
},
"description": {
"type": "string",
"defaultValue": "Description of the application"
},
"eula": {
"type": "string",
"defaultValue": ""
},
"privacyStatementUri": {
"type": "string",
"defaultValue": ""
},
"releaseNoteUri": {
"type": "string",
"defaultValue": ""
},
"mediaLink": {
"type": "string"
},
"configLink": {
"type": "string"
},
"appConfigFileName": {
"type": "string"
},
"appPackageFileName": {
"type": "string"
},
"replicaRegion1": {
"type": "string",
"defaultValue": "East US"
},
"replicaRegion2": {
"type": "string",
"defaultValue": "South Central US"
},
"installScript": {
"type": "string",
"metadata": {
"description": "Optional. Script to run to install the application. E.g. echo 'Installing application...'"
}
},
"updateScript": {
"type": "string",
"metadata": {
"description": "Optional. Script to run to update the application. E.g. echo 'Updating application...'"
}
},
"removeScript": {
"type": "string",
"metadata": {
"description": "Optional. Script to run to delete the application. E.g. echo 'Deleting application...'"
}
},
"storageAccountType": {
"type": "string",
"allowedValues": ["PremiumV2_LRS", "Premium_LRS", "Standard_LRS", "Standard_ZRS"],
"defaultValue": "Standard_LRS"
}
},
"resources": [
{
"type": "Microsoft.Compute/galleries",
"apiVersion": "2024-03-03",
"name": "[parameters('galleryName')]",
"___location": "[parameters('___location')]",
"properties": {
"identifier": {}
}
},
{
"type": "Microsoft.Compute/galleries/applications",
"apiVersion": "2024-03-03",
"name": "[format('{0}/{1}', parameters('galleryName'), parameters('applicationName'))]",
"___location": "[parameters('___location')]",
"dependsOn": [
"[resourceId('Microsoft.Compute/galleries', parameters('galleryName'))]"
],
"properties": {
"supportedOSType": "[parameters('supportedOSType')]",
"endOfLifeDate": "[parameters('endOfLifeDate')]",
"description": "[parameters('description')]",
"eula": "[if(equals(parameters('eula'), ''), json('null'), parameters('eula'))]",
"privacyStatementUri": "[if(equals(parameters('privacyStatementUri'), ''), json('null'), parameters('privacyStatementUri'))]",
"releaseNoteUri": "[if(equals(parameters('releaseNoteUri'), ''), json('null'), parameters('releaseNoteUri'))]"
}
},
{
"type": "Microsoft.Compute/galleries/applications/versions",
"apiVersion": "2024-03-03",
"name": "[format('{0}/{1}/{2}', parameters('galleryName'), parameters('applicationName'), parameters('versionName'))]",
"___location": "[parameters('___location')]",
"dependsOn": [
"[resourceId('Microsoft.Compute/galleries/applications', parameters('galleryName'), parameters('applicationName'))]"
],
"properties": {
"publishingProfile": {
"source": {
"mediaLink": "[parameters('mediaLink')]",
"defaultConfigurationLink": "[parameters('configLink')]"
},
"manageActions": {
"install": "[parameters('installScript')]",
"remove": "[parameters('removeScript')]",
"update": "[parameters('updateScript')]"
},
"settings": {
"scriptBehaviorAfterReboot": "Rerun",
"configFileName": "[parameters('appConfigFileName')]",
"packageFileName": "[parameters('appPackageFileName')]"
},
"targetRegions": [
{
"name": "[parameters('___location')]",
"regionalReplicaCount": 3,
"storageAccountType": "[parameters('storageAccountType')]"
},
{
"name": "[parameters('replicaRegion1')]",
"regionalReplicaCount": 1,
"storageAccountType": "[parameters('storageAccountType')]"
},
{
"name": "[parameters('replicaRegion2')]"
},
],
"excludeFromLatest": false,
"replicaCount": 2,
"storageAccountType": "[parameters('storageAccountType')]"
},
"safetyProfile": {
"allowDeletionOfReplicatedLocations": true
},
"endOfLifeDate": "[parameters('endOfLifeDate')]"
}
}
]
}
비용
VM 애플리케이션 패키지 사용에 대한 추가 요금은 없지만 다음 리소스에 대한 요금이 부과됩니다.
- 각 패키지와 모든 복제본을 저장하는 데 드는 스토리지 비용입니다.
- 이미지 버전을 원본 지역에서 복제된 지역으로 처음 복제할 때 발생하는 네트워크 송신 요금. 후속 복제본은 지역 내에서 처리되므로 추가 비용이 없습니다.
네트워크 송신에 대한 자세한 내용은 대역폭 가격 책정을 참조하세요.
기술 세부 정보
고려 사항 및 현재 제한
지역당 최대 10개의 복제본: VM 애플리케이션 버전을 만들 때 지역당 최대 복제본 수는 페이지 Blob 및 블록 Blob 모두에 대해 10개입니다.
읽기 권한이 있는 공용 액세스 및 SAS URI가 있는 스토리지: 다른 제한 수준이 배포에 실패하기 때문에 스토리지 계정에는 공용 수준 액세스 권한이 있어야 하고 읽기 권한이 있는 SAS URI를 사용해야 합니다. 익명 액세스를 허용하여 스토리지 계정에 아티팩트 게시를 통해 SAS 토큰을 무시할 수 있습니다.
실패한 설치에 대한 수동 다시 시도: 현재 실패한 설치를 다시 시도하는 유일한 방법은 프로필에서 애플리케이션을 제거한 다음 다시 추가하는 것입니다.
VM당 최대 25개의 애플리케이션: 단일 가상 머신에 최대 25개의 애플리케이션을 배포할 수 있습니다.
2GB 애플리케이션 크기: 애플리케이션 버전의
mediaLink
최대 파일 크기는 2GB입니다. 최대 파일 크기defaultConfigurationLink
는 1GB입니다.VM 에이전트 필요: VM에 VM 에이전트가 있어야 하며 목표 상태를 받을 수 있어야 합니다.
VM당 애플리케이션의 단일 버전: 지정된 애플리케이션의 버전 하나만 VM에 배포할 수 있습니다.
현재 지원되지 않는 이동 작업: 리소스 그룹 간에 연결된 VM 애플리케이션을 사용하여 VM을 이동하는 것은 현재 지원되지 않습니다.
참고 항목
Azure Compute Gallery 및 VM 애플리케이션의 경우 복제 후 스토리지 SAS를 삭제할 수 있습니다. 그러나 후속 업데이트 작업에는 유효한 SAS가 필요합니다.
VM 내에서 디렉터리 다운로드
애플리케이션 패키지 및 구성 파일의 다운로드 위치는 다음과 같습니다.
- Linux:
/var/lib/waagent/Microsoft.CPlat.Core.VMApplicationManagerLinux/<application name>/<application version>
- 윈도우:
C:\Packages\Plugins\Microsoft.CPlat.Core.VMApplicationManagerWindows\1.0.9\Downloads\<application name>\<application version>
설치/업데이트/제거 명령은 애플리케이션 패키지와 구성 파일이 현재 디렉터리에 있다고 가정하여 작성해야 합니다.
파일 이름 지정
애플리케이션 파일이 VM에 다운로드되면 파일 이름이 "MyVmApp"으로 바뀌고 파일 확장명(예: .exe, .msi)이 없습니다. VM은 파일의 원래 이름 및 확장명을 인식하지 못합니다.
이 문제를 탐색하는 몇 가지 다른 방법은 다음과 같습니다.
실행하기 전에 파일 이름을 바꾸는 명령을 포함하도록 스크립트를 수정할 수 있습니다.
move .\\MyVmApp .\\MyApp.exe & MyApp.exe /S
packageFileName
(및 해당하는 configFileName
) 속성을 사용하여 파일 이름을 바꿀 내용을 알려줄 수도 있습니다. 예를 들어 "MyApp.exe"로 설정하면 다음과 같이 설치 스크립트가 만들어집니다.
MyAppe.exe /S
팁
Blob이 원래 "myapp" 대신 "myApp.exe"로 명명된 경우 스크립트는 속성을 설정 packageFileName
하지 않고 작동합니다.
명령 인터프리터
기본 명령 인터프리터는 다음과 같습니다.
- Linux:
/bin/bash
- 윈도우:
cmd.exe
Chocolatey 또는 PowerShell과 같은 다른 인터프리터가 컴퓨터에 설치되어 있는 한 실행 파일을 호출하고 명령을 전달하여 이러한 인터프리터를 사용할 수 있습니다. 예를 들어 cmd 대신 Windows PowerShell에서 명령을 실행하려면 powershell.exe -Command '<powershell commmand>'
를 전달하면 됩니다.
업데이트 처리 방법
VM 또는 Virtual Machine Scale Sets에서 애플리케이션 버전을 업데이트하는 경우 배포 중에 제공한 업데이트 명령이 사용됩니다. 업데이트된 버전에 업데이트 명령이 없는 경우 현재 버전이 제거되고 새 버전이 설치됩니다.
업데이트 명령은 이전 버전의 VM 애플리케이션에서 업데이트될 수 있다는 기대에 따라 작성되어야 합니다.
실패를 배포 실패로 처리
VM 애플리케이션 확장은 설치/업데이트/제거 중 VM 앱이 실패했는지 여부에 관계없이 항상 성공을 반환합니다. VM 애플리케이션 확장은 확장 또는 기본 인프라에 문제가 있는 경우에만 확장 상태를 오류로 보고합니다. 이 동작은 “실패를 배포 실패로 처리” 플래그에 의해 트리거되며 기본적으로 $false
로 설정되지만 $true
로 변경할 수 있습니다. 실패 플래그는 PowerShell 또는 CLI에서 구성할 수 있습니다.
Linux에서 VM 애플리케이션 만들기
VM 애플리케이션을 만들려면 애플리케이션을 제대로 설치, 업데이트 및 삭제하려면 애플리케이션 패키지와 스크립트가 필요합니다.
Linux용 타사 애플리케이션은 몇 가지 방법으로 패키지할 수 있습니다. 가장 일반적인 몇 가지 설치 명령 만들기를 처리하는 방법을 살펴보겠습니다.
.tar 및 .gz 파일
이러한 파일은 압축된 보관 파일이며 원하는 위치로 추출할 수 있습니다. 특정 위치로 추출해야 하는 경우 원본 패키지에 대한 설치 지침을 확인합니다. .tar.gz 파일에 소스 코드가 포함된 경우 패키지 지침에서 소스에서 설치하는 방법을 참조하세요.
Linux 컴퓨터에 golang
을 설치하는 설치 명령의 예:
sudo tar -C /usr/local -xzf go_linux
제거 명령 예제:
sudo rm -rf /usr/local/go
.deb
, .rpm
및 인터넷 액세스가 제한된 VM용 기타 플랫폼별 패키지를 사용하여 애플리케이션 패키지 만들기
플랫폼별 패키지 관리자용 개별 패키지를 다운로드할 수 있지만 일반적으로 모든 종속성이 포함되어 있지는 않습니다. 이러한 파일의 경우 애플리케이션 패키지에 모든 종속성을 포함하거나 시스템 패키지 관리자가 VM에서 사용 가능한 리포지토리를 통해 종속성을 다운로드하도록 해야 합니다. 인터넷 액세스가 제한된 VM으로 작업하는 경우 모든 종속성을 직접 패키지해야 합니다.
종속성을 파악하는 것은 약간 까다로울 수 있습니다. 전체 종속성 트리를 표시할 수 있는 타사 도구가 있습니다.
Ubuntu에서 sudo apt show <package_name> | grep Depends
를 실행하여 sudo apt-get install <packge_name>
명령을 실행할 때 설치되는 모든 패키지를 표시할 수 있습니다. 그런 다음, 해당 출력을 사용해 모든 .deb
파일을 다운로드하여 애플리케이션 패키지로 사용할 수 있는 보관 파일을 만들 수 있습니다.
Ubuntu에 PowerShell을 설치하기 위한 VM 애플리케이션 패키지를 만들려면 다음 단계를 수행합니다.
- 다음 명령을 실행하여 리포지토리가 PowerShell을 다운로드할 수 있도록 설정하고 새 Ubuntu VM에 대한 패키지 종속성을 식별합니다.
# Download the Microsoft repository GPG keys
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb
sudo rm -rf packages-microsoft-prod.deb
sudo apt update
sudo apt show powershell | grep Depends
- 다음 패키지를 나열하는 Depends 줄의 출력을 확인합니다.
Depends: libc6, lib32gcc-s1, libgssapi-krb5-2, libstdc++6, zlib1g, libicu72|libicu71|libicu70|libicu69|libicu68|libicu67|libicu66|libicu65|libicu63|libicu60|libicu57|libicu55|libicu52, libssl3|libssl1.1|libssl1.0.2|libssl1.
-
sudo apt-get download <package_name>
을 사용하여 이러한 각 파일을 다운로드하고 모든 파일이 포함된 tar 압축 보관 파일을 만듭니다.
- Ubuntu 18.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu60
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
- Ubuntu 20.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl1.1
sudo apt-get download libicu66
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
- Ubuntu 22.04:
mkdir /tmp/powershell
cd /tmp/powershell
sudo apt-get download libc6
sudo apt-get download lib32gcc-s1
sudo apt-get download libgssapi-krb5-2
sudo apt-get download libstdc++6
sudo apt-get download zlib1g
sudo apt-get download libssl3
sudo apt-get download libicu70
sudo apt-get download powershell
sudo tar -cvzf powershell.tar.gz *.deb
- 이 tar 보관 파일이 애플리케이션 패키지 파일입니다.
- 이 경우 설치 명령은 다음과 같습니다.
sudo tar -xvzf powershell.tar.gz && sudo dpkg -i *.deb
- 제거 명령은 다음과 같습니다.
sudo apt remove powershell
모든 종속성을 명시적으로 제거하는 대신 sudo apt autoremove
를 사용합니다. 종속성이 겹치는 다른 애플리케이션을 설치했을 수 있으며 이 경우 명시적 제거 명령이 실패합니다.
종속성을 직접 해결하지 않으려는 경우와 apt
이 리포지토리에 연결할 수 있는 경우에는 단 하나의 .deb
파일로 애플리케이션을 설치하고 apt
이 종속성을 처리하도록 할 수 있습니다.
설치 명령 예제:
dpkg -i <package_name> || apt --fix-broken install -y
Windows에서 VM 애플리케이션 만들기
Windows에서 대부분의 타사 애플리케이션은 .exe 또는 .msi 설치 프로그램으로 사용할 수 있습니다. 일부는 추출 및 zip 파일 실행을 통해 사용할 수 있습니다. 각 모범 사례를 살펴보겠습니다.
.exe 설치 프로그램
설치 프로그램 실행 파일은 일반적으로 UI(사용자 인터페이스)를 시작하고 누군가가 UI를 통해 선택해야 합니다. 설치 프로그램이 자동 모드 매개 변수를 지원하는 경우 설치 문자열에 포함되어야 합니다.
또한 cmd.exe에는 실행 파일의 확장명으로 .exe
가 필요하므로 .exe
확장명을 갖도록 파일 이름을 바꿔야 합니다.
실행 파일로 제공되는 VM 애플리케이션 패키지를 myApp.exe
만들려면 VM 애플리케이션을 'myApp'이라고 하므로 애플리케이션 패키지가 현재 디렉터리에 있다고 가정하여 명령을 작성합니다.
"move .\\myApp .\\myApp.exe & myApp.exe /S -config myApp_config"
설치 프로그램 실행 파일이 제거 매개 변수를 지원하지 않는 경우 테스트 시스템에서 레지스트리를 조회하여 제거 프로그램이 어디에 있는지 알 수 있습니다.
레지스트리에서 제거 문자열은 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<installed application name>\UninstallString
에 저장되므로 콘텐츠를 내 제거 명령으로 사용합니다.
'\"C:\\Program Files\\myApp\\uninstall\\helper.exe\" /S'
.MSI 설치 프로그램
.msi
설치 프로그램의 명령줄 실행의 경우 애플리케이션을 설치하거나 제거하는 명령은 msiexec
를 사용해야 합니다. 일반적으로 msiexec
는 별도의 자체 프로세스로 실행되고 cmd
는 완료될 때까지 기다리지 않으므로 둘 이상의 VM 애플리케이션을 설치할 때 문제가 발생할 수 있습니다.
start
명령은 msiexec
와 함께 사용하여 명령이 반환되기 전에 설치가 완료되도록 할 수 있습니다. 예시:
start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
제거 명령 예제:
start /wait %windir%\\system32\\msiexec.exe /x myapp /quiet /forcerestart /log myapp_uninstall.log
일반적으로 start
이 명령은 일괄 처리 스크립트 내에서 호출됩니다. 매개 변수와 함께 /wait
사용하는 경우 호출된 프로세스가 종료될 때까지 호출 스크립트가 일시 중지됩니다. 완료되면 일괄 처리 스크립트는 명령으로 설정된 변수를 errorlevel
start
확인하고 다음과 같이 종료합니다.
start /wait %windir%\\system32\\msiexec.exe /i myapp /quiet /forcerestart /log myapp_install.log
if %errorlevel% neq 0 exit /b %errorlevel%
...
압축된 파일
.zip 또는 압축된 다른 파일의 경우 애플리케이션 패키지의 이름을 바꾸고 해당 콘텐츠의 압축을 원하는 대상에 풉니다.
설치 명령 예제:
rename myapp myapp.zip && mkdir C:\myapp && powershell.exe -Command "Expand-Archive -path myapp.zip -destinationpath C:\myapp"
제거 명령 예제:
rmdir /S /Q C:\\myapp
VM 애플리케이션 문제 해결
특정 VM 애플리케이션이 VM 인스턴스에 성공적으로 추가되었는지 여부를 확인하려면 VM 애플리케이션 확장의 메시지를 확인합니다.
VM 확장 상태 확인에 대한 자세한 내용은 Linux용 가상 머신 확장 및 기능 및 Windows용 가상 머신 확장 및 기능을 참조하세요.
VM 확장의 상태를 확인하려면 Get-AzVM을 사용합니다.
Get-AzVM -name <VM name> -ResourceGroupName <resource group name> -Status | convertto-json -Depth 10
확장 집합 확장의 상태를 확인하려면 Get-AzVMSS를 사용합니다.
$result = Get-AzVmssVM -ResourceGroupName $rgName -VMScaleSetName $vmssName -InstanceView
$resultSummary = New-Object System.Collections.ArrayList
$result | ForEach-Object {
$res = @{ instanceId = $_.InstanceId; vmappStatus = $_.InstanceView.Extensions | Where-Object {$_.Name -eq "VMAppExtension"}}
$resultSummary.Add($res) | Out-Null
}
$resultSummary | convertto-json -depth 5
오류 메시지
메시지 | 설명 |
---|---|
현재 VM 애플리케이션 버전 {name}은(는) {date}에 더 이상 사용되지 않습니다. | 이미 더 이상 사용되지 않는 VM 애플리케이션 버전을 배포하려고 했습니다. 특정 버전을 지정하는 대신 latest 를 사용해보세요. |
현재 VM 애플리케이션 버전 {name}은(는) OS {OS}을(를) 지원하지만 현재 OSDisk의 OS는 {OS}입니다. | Windows 인스턴스에 Linux 애플리케이션을 배포하려고 했거나 그 반대의 경우입니다. |
최대 VM 애플리케이션 수(최대=5, 현재={count})를 초과했습니다. 더 적은 수의 애플리케이션을 사용하고 요청을 다시 시도하세요. | 현재 VM 또는 확장 집합당 5개의 VM 애플리케이션만 지원합니다. |
둘 이상의 VM 애플리케이션이 동일한 packageReferenceId로 지정되었습니다. | 동일한 애플리케이션이 두 번 이상 지정되었습니다. |
이 이미지에 액세스할 권한이 없는 구독입니다. | 구독에는 이 애플리케이션 버전에 대한 액세스 권한이 없습니다. |
인수의 스토리지 계정이 없습니다. | 이 구독에 대한 애플리케이션이 없습니다. |
플랫폼 이미지 {image}를 사용할 수 없습니다. 스토리지 프로필의 모든 필드가 올바른지 확인하세요. 스토리지 프로필 정보에 대한 자세한 내용은 https://aka.ms/storageprofile를 참조하세요. | 애플리케이션이 없습니다. |
갤러리 이미지 {image}은(는) {region} 지역에서 사용할 수 없습니다. 이미지 소유자에게 문의하여 이 지역으로 복제하거나 요청한 지역을 변경합니다. | 갤러리 애플리케이션 버전이 있지만 이 지역에 복제되지 않았습니다. |
SAS가 원본 URL {uri}에 유효하지 않습니다. | URL(mediaLink 또는 defaultConfigurationLink)에 대한 정보 검색을 시도할 때 스토리지에서 Forbidden 오류가 발생했습니다. |
원본 URI {uri}에서 참조하는 Blob이 없습니다. | mediaLink 또는 defaultConfigurationLink 속성에 대해 제공된 Blob이 없습니다. |
‘원격 이름을 찾을 수 없습니다.’ 오류로 인해 갤러리 애플리케이션 버전 URL {url}에 액세스할 수 없습니다. Blob이 있고 공개적으로 액세스할 수 있거나 읽기 권한이 있는 SAS URL인지 확인합니다. | 가능성이 가장 높은 경우는 읽기 권한이 있는 SAS URI가 제공되지 않은 것입니다. |
{error description} 오류로 인해 갤러리 애플리케이션 버전 URL {url}에 액세스할 수 없습니다. Blob이 있고 공개적으로 액세스할 수 있거나 읽기 권한이 있는 SAS URL인지 확인합니다. | 제공된 스토리지 Blob에 이슈가 있었습니다. 오류 설명에 자세한 정보가 제공됩니다. |
{operationName} 작업은 삭제로 표시되어 있기 때문에 {application}에서 허용되지 않습니다. 삭제 작업만 다시 시도하거나 진행 중인 작업이 완료되기를 기다릴 수 있습니다. | 현재 삭제 중인 애플리케이션을 업데이트하려고 합니다. |
'galleryApplicationVersion.properties.publishingProfile.replicaCount' 매개변수의 {value} 값이 범위를 벗어났습니다. 값은 1에서 3(포함) 사이여야 합니다. | VM 애플리케이션 버전에는 1~3개의 복제본만 허용됩니다. |
‘galleryApplicationVersion.properties.publishingProfile.manageActions.install’ 속성을 변경할 수 없습니다. (또는 업데이트, 삭제) | 기존 VmApplication에서 관리 작업을 변경할 수 없습니다. 새 VmApplication 버전이 생성되어야 합니다. |
‘galleryApplicationVersion.properties.publishingProfile.settings.packageFileName’ 속성을 변경할 수 없습니다. (또는 configFileName) | 패키지 파일 이름 또는 구성 파일 이름과 같은 설정을 변경할 수 없습니다. 새 VmApplication 버전이 생성되어야 합니다. |
소스 URI {uri}에서 참조하는 Blob이 너무 큽니다(크기 = {size}). 허용되는 최대 Blob 크기는 '1GB'입니다. | mediaLink 또는 defaultConfigurationLink에서 참조하는 Blob의 최대 크기는 현재 1GB입니다. |
원본 URI {uri}에서 참조하는 Blob이 비어 있습니다. | 빈 Blob이 참조되었습니다. |
{type} Blob 유형은 {operation} 작업에 지원되지 않습니다. 페이지 Blob 및 블록 Blob만 지원됩니다. | VmApplications는 페이지 Blob 및 블록 Blob만 지원합니다. |
SAS가 원본 URL {uri}에 유효하지 않습니다. | mediaLink 또는 defaultConfigurationLink에 대해 제공된 SAS URI가 유효한 SAS URI가 아닙니다. |
구독에 필수 기능인 {featureName}이(가) 누락되어 대상 지역에 {region}을(를) 지정할 수 없습니다. 필요한 기능을 사용하여 구독을 등록하거나 대상 지역 목록에서 지역을 제거합니다. | 특정한 제한된 지역에서 VmApplications를 사용하려면 해당 구독에 대해 기능 플래그가 등록되어 있어야 합니다. |
갤러리 이미지 버전 게시 프로필 영역 {regions}에는 이미지 버전 {___location}의 위치가 포함되어야 합니다. | 복제 지역 목록에는 애플리케이션 버전이 있는 위치가 포함되어야 합니다. |
대상 게시 지역에는 중복 지역이 허용되지 않습니다. | 게시 지역에는 중복이 없을 수 있습니다. |
갤러리 애플리케이션 버전 리소스는 현재 암호화를 지원하지 않습니다. | 대상 지역에 대한 암호화 속성은 VM 애플리케이션에서 지원되지 않습니다. |
엔터티 이름이 요청 URL의 이름과 일치하지 않습니다. | 요청 URL에 지정된 갤러리 애플리케이션 버전이 요청 본문에 지정된 버전과 일치하지 않습니다. |
갤러리 애플리케이션 버전 이름이 유효하지 않습니다. 애플리케이션 버전 이름은 Major(int32)를 따라야 합니다. 소수(int32). Patch(int32) 형식. 여기서 int 는 0과 2,147,483,647(포함) 사이입니다. 예를 들어 1.0.0, 2018.12.1 등이 있습니다. |
갤러리 애플리케이션 버전은 지정된 형식을 따라야 합니다. |
다음 단계
- VM 애플리케이션 패키지 생성 및 배포 방법을 알아봅니다.