다음을 통해 공유


가상 머신 이미지 테스트

이 문서에서는 VM(가상 머신) 이미지를 테스트하여 최신 Azure Marketplace 게시 요구 사항을 충족하는지 확인하는 방법을 설명합니다.

Azure VM 배포

Azure Compute Gallery(이전의 Shared Image Gallery) 이미지에서 VM을 배포하려면 다음을 수행합니다.

  1. Azure Compute Gallery 이미지 버전을 엽니다.
  2. VM 만들기를 선택합니다.
  3. 가상 머신 이름을 제공하고 VM 크기를 선택합니다.
  4. 검토 + 만들기를 선택합니다. 유효성 검사에 통과하면 만들기를 선택합니다.

참고 항목

vhd 파일에서 VM을 만들려면, 인증 도구를 VM 이미지에 연결 또는 PowerShell을 사용하여 Self-Test API 사용 아래의 지침을 따릅니다.

VM 제품을 제출하기 전에 다음 단계를 완료합니다.

유효성 검사 실행

배포된 이미지에서 유효성 검사를 실행하는 방법에는 두 가지가 있습니다.

Azure Certified에 인증 테스트 도구 사용

Important

인증 테스트 도구를 실행하려면 Windows에서 Windows 원격 관리 서비스를 실행하고 구성해야 합니다. 이렇게 하면 포트 5986에 액세스할 수 있습니다. 자세한 내용은 Windows 원격 관리에 대한 설치 및 구성을 참조하세요.

인증 테스트 도구 다운로드 및 실행

Azure Certified에 대한 인증 테스트 도구는 로컬 Windows 컴퓨터에서 실행되지만 Azure 기반 Windows 또는 Linux VM을 테스트합니다. 사용자 VM 이미지를 Microsoft Azure와 함께 사용할 수 있으며 VHD 준비와 관련된 지침과 요구 사항이 충족되었음을 인증합니다.

  1. Azure Certified에 대한 최신 인증 테스트 도구를 다운로드하여 설치합니다.
  2. 인증 도구를 연 다음, 새 테스트 시작을 선택합니다.
  3. 테스트 정보 화면에서 테스트 실행의 테스트 이름을 입력합니다.
  4. Windows Server(Windows용 포트 5986 허용) 또는 Linux(Linux용 포트 22 허용) 중에서 VM용 플랫폼을 선택합니다. 플랫폼 선택은 나머지 옵션에 영향을 줍니다.
  5. VM에서 이 데이터베이스 서비스를 사용하는 경우 Azure SQL Database 테스트 확인란을 선택합니다.

VM 이미지에 인증 도구 연결

  1. SSH 인증 모드인 암호 인증 또는 키 파일 인증을 선택합니다.

  2. 암호 기반 인증을 사용하는 경우 VM DNS 이름, 사용자 이름암호 값을 입력합니다. 기본 SSH 포트 번호를 변경할 수도 있습니다.

    VM 테스트 정보의 선택을 표시합니다.

  3. 키 파일 기반 인증을 사용하는 경우 VM DNS 이름, 사용자 이름 및 프라이빗 키 위치에 대한 값을 입력합니다. 암호를 포함하거나 기본 SSH 포트 번호를 변경할 수도 있습니다.

  4. 정규화된 VM DNS 이름을 입력합니다(예: MyVMName.Cloudapp.net).

  5. 사용자 이름암호를 입력합니다.

    VM 사용자 이름 및 암호 선택 항목을 표시합니다.

  6. 다음을 선택합니다.

인증 테스트 실행

인증 도구에서 VM 이미지에 대한 매개 변수 값을 지정한 후 연결 테스트를 선택하여 VM에 대한 유효한 연결을 만듭니다. 연결이 확인되면 [다음]을 선택하여 테스트를 시작합니다. 테스트가 완료되면 결과가 테이블에 표시됩니다. 상태 열에는 각 테스트에 대한 (통과/실패/경고)가 표시됩니다. 테스트가 실패하면 이미지가 인증되지 않습니다. 이 경우 요구 사항 및 실패 메시지를 검토하고 제안된 변경을 수행하고 테스트를 다시 실행합니다.

자동화된 테스트가 완료되면 설문지 화면의 두 탭인 일반 평가 및 커널 사용자 지정에 VM 이미지에 대한 추가 정보를 제공하고 다음을 선택합니다.

마지막 화면에서는 Linux VM 이미지에 대한 SSH 액세스 정보와 예외를 찾는 경우 실패한 평가에 대한 설명과 같은 자세한 정보를 제공할 수 있습니다.

마지막으로 보고서 생성을 선택하여 설문지에 대한 답변과 함께 실행된 테스트 사례에 대한 테스트 결과 및 로그 파일을 다운로드합니다.

참고 항목

VM에 방화벽과 같은 소프트웨어가 설치되어 있으므로 VM을 잠가야 하는 시나리오가 있는 게시자는 거의 없습니다. 이 경우 여기에서 인증된 테스트 도구를 다운로드하고 파트너 센터 지원에서 보고서를 제출합니다.

PowerShell을 사용하여 Self-Test API 사용

Linux OS에서

PowerShell에서 API 호출:

  1. 액세스 토큰을 생성합니다.
  2. Invoke-WebRequest 명령을 사용하여 API를 호출합니다.
  3. 다음 코드 예제 및 화면 캡처에 표시된 것처럼 메서드는 Post이고 콘텐츠 형식은 JSON입니다.
  4. JSON 형식으로 본문 매개 변수를 지정합니다.

다음 명령을 통해 액세스 토큰을 생성합니다.

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Content-Type", "application/x-www-form-urlencoded")
$body = "grant_type=client_credentials&client_id=$clientId&client_secret=$clientSecret&resource=https%3A%2F%2Fmanagement.core.windows.net"
$response = Invoke-RestMethod "https://login.microsoftonline.com/$tenantId/oauth2/token" -Method 'POST' -Headers $headers -Body $body
$accessToken = $response.access_token

PowerShell에서 액세스 토큰을 생성하기 위한 화면 예제의 스크린샷

이 예제에서는 API에 대한 PowerShell 호출(VM을 만드는 동안 포트 22 허용)을 보여 줍니다.

$accesstoken = "token"
$headers = @{ "Authorization" = "Bearer $accesstoken" }
$DNSName = "<Machine DNS Name>"
$UserName = "<User ID>"
$Password = "<Password>"
$OS = "Linux"
$PortNo = "22"
$CompanyName = "ABCD"
$AppId = "<Application ID>"
$TenantId = "<Tenant ID>"

$body = @{
   "DNSName" = $DNSName
   "UserName" = $UserName
   "Password" = $Password
   "OS" = $OS
   "PortNo" = $PortNo
   "CompanyName" = $CompanyName
   "AppId" = $AppId
   "TenantId" = $TenantId
} | ConvertTo-Json

$body

$uri = "https://isvapp.azurewebsites.net/selftest-vm"

$res = (Invoke-WebRequest -Method "Post" -Uri $uri -Body $body -ContentType "application/json" -Headers $headers).Content


PowerShell에서 API를 호출하는 예제는 다음과 같습니다.

PowerShell에서 API를 호출하는 화면 예제입니다.


이전 예제를 사용하여 JSON을 검색하고 구문 분석하여 다음 세부 정보를 가져올 수 있습니다.

$resVar = $res | ConvertFrom-Json
$actualresult = $resVar.Response | ConvertFrom-Json

Write-Host "OSName: $($actualresult.OSName)"
Write-Host "OSVersion: $($actualresult.OSVersion)"
Write-Host "Overall Test Result: $($actualresult.TestResult)"

For ($i = 0; $i -lt $actualresult.Tests.Length; $i++) {
   Write-Host "TestID: $($actualresult.Tests[$i].TestID)"
   Write-Host "TestCaseName: $($actualresult.Tests[$i].TestCaseName)"
   Write-Host "Description: $($actualresult.Tests[$i].Description)"
   Write-Host "Result: $($actualresult.Tests[$i].Result)"
   Write-Host "ActualValue: $($actualresult.Tests[$i].ActualValue)"
}


이 샘플 화면에는 $res.Content테스트 결과의 세부 정보가 JSON 형식으로 표시됩니다.

테스트 결과의 세부 정보를 사용하여 PowerShell에서 API를 호출하기 위한 화면 예제입니다.


다음은 온라인 JSON 뷰어(예: Code Beautify 또는 JSON Viewer)에서 볼 수 있는 JSON 테스트 결과의 예입니다.

온라인 JSON 뷰어의 테스트 결과가 더 많습니다.

Windows OS에서

PowerShell에서 API 호출:

  1. Invoke-WebRequest 명령을 사용하여 API를 호출합니다.
  2. 다음 코드 예제 및 샘플 화면에 표시된 것처럼 메서드는 Post이고 콘텐츠 형식은 JSON입니다.
  3. Body 매개 변수를 JSON 형식으로 만듭니다.

이 코드 샘플에서는 API에 대한 PowerShell 호출(VM을 만드는 동안 포트 5986 허용)을 보여 줍니다.

$accesstoken = "Get token for your Client AAD App"
$headers = @{ "Authorization" = "Bearer $accesstoken" }
$Body = @{ 
   "DNSName" = "XXXX.westus.cloudapp.azure.com"
   "UserName" = "XXX"
   "Password" = "XXX@123456"
   "OS" = "Windows"
   "PortNo" = "5986"
   "CompanyName" = "ABCD"
   "AppId" = "XXXX-XXXX-XXXX"
   "TenantId" = "XXXX-XXXX-XXXX"
} | ConvertTo-Json

$res = Invoke-WebRequest -Method "Post" -Uri $uri -Body $Body -ContentType "application/json" –Headers $headers;
$Content = $res | ConvertFrom-Json

이러한 샘플 화면에서는 PowerShell에서 API를 호출하는 예제를 보여 줍니다.

SSH 키 사용:

SSH 키를 사용하여 PowerShell에서 API 호출

암호 사용:

암호를 사용하여 PowerShell에서 API를 호출합니다.


이전 예제를 사용하여 JSON을 검색하고 구문 분석하여 다음 세부 정보를 가져올 수 있습니다.

$resVar = $res | ConvertFrom-Json
$actualresult = $resVar.Response | ConvertFrom-Json

Write-Host "OSName: $($actualresult.OSName)"
Write-Host "OSVersion: $($actualresult.OSVersion)"
Write-Host "Overall Test Result: $($actualresult.TestResult)"

For ($i = 0; $i -lt $actualresult.Tests.Length; $i++) {
   Write-Host "TestID: $($actualresult.Tests[$i].TestID)"
   Write-Host "TestCaseName: $($actualresult.Tests[$i].TestCaseName)"
   Write-Host "Description: $($actualresult.Tests[$i].Description)"
   Write-Host "Result: $($actualresult.Tests[$i].Result)"
   Write-Host "ActualValue: $($actualresult.Tests[$i].ActualValue)"
}


이 화면에는 $res.Content테스트 결과의 세부 정보가 JSON 형식으로 표시됩니다.

JSON 형식의 테스트 결과에 대한 세부 정보입니다.


다음은 온라인 JSON 뷰어(예: Code Beautify 또는 json 뷰어)에 표시되는 테스트 결과의 예입니다.

온라인 JSON 뷰어에서 결과를 테스트합니다.

CURL을 사용하여 Linux OS에서 Self-Test API 사용

이 예제에서는 curl을 사용하여 Microsoft Entra ID 및 자체 호스트 VM에 대한 POST API 호출을 수행합니다.

  1. 자체 호스트 VM에 인증하도록 Microsoft Entra 토큰 요청

    curl 요청에서 올바른 값이 대체되는지 확인합니다.

    curl --location --request POST 'https://login.microsoftonline.com/{TENANT_ID}/oauth2/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'grant_type=client_credentials' \
    --data-urlencode 'client_id={CLIENT_ID} ' \
    --data-urlencode 'client_secret={CLIENT_SECRET}' \
    --data-urlencode 'resource=https://management.core.windows.net'
    

    다음은 요청의 응답 예입니다.

    {
        "token_type": "Bearer",
        "expires_in": "86399",
        "ext_expires_in": "86399",
        "expires_on": "1599663998",
        "not_before": "1599577298",
        "resource": "https://management.core.windows.net",
        "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS…"
    }
    
  2. 자체 테스트 VM에 대한 요청 제출

    전달자 토큰 및 매개 변수가 올바른 값으로 대체되었는지 확인합니다.

    curl --location --request POST 'https://isvapp.azurewebsites.net/selftest-vm' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJS…' \
    --data-raw '{
        "DNSName": "avvm1.eastus.cloudapp.azure.com",
        "UserName": "azureuser",
        "Password": "SECURE_PASSWORD_FOR_THE_SSH_INTO_VM",
        "OS": "Linux",
        "PortNo": "22",
        "CompanyName": "COMPANY_NAME",
        "AppId": "CLIENT_ID_SAME_AS_USED_FOR_AAD_TOKEN ",
        "TenantId": "TENANT_ID_SAME_AS_USED_FOR_AAD_TOKEN"
    }'
    

    자체 테스트 VM API 호출의 예제 응답:

    {
        "TrackingId": "9bffc887-dd1d-40dd-a8a2-34cee4f4c4c3",
        "Response": "{\"SchemaVersion\":1,\"AppCertificationCategory\":\"Microsoft Single VM Certification\",\"ProviderID\":\"050DE427-2A99-46D4-817C-5354D3BF2AE8\",\"OSName\":\"Ubuntu 18.04\",\"OSDistro\":\"Ubuntu 18.04.5 LTS\",\"KernelVersion\":\"5.4.0-1023-azure\",\"KernelFullVersion\":\"Linux version 5.4.0-1023-azure (buildd@lgw01-amd64-053) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #23~18.04.1-Ubuntu SMP Thu Aug 20 14:46:48 UTC 2020\\n\",\"OSVersion\":\"18.04\",\"CreatedDate\":\"09/08/2020 01:13:47\",\"TestResult\":\"Pass\",\"APIVersion\":\"1.5\",\"Tests\":[{\"TestID\":\"48\",\"TestCaseName\":\"Bash History\",\"Description\":\"Bash history files should be cleared before creating the VM image.\",\"Result\":\"Passed\",\"ActualValue\":\"No file Exist\",\"RequiredValue\":\"1024\"},{\"TestID\":\"39\",\"TestCaseName\":\"Linux Agent Version\",\"Description\":\"Azure Linux Agent Version 2.2.41 and above should be installed.\",\"Result\":\"Passed\",\"ActualValue\":\"2.2.49\",\"RequiredValue\":\"2.2.41\"},{\"TestID\":\"40\",\"TestCaseName\":\"Required Kernel Parameters\",\"Description\":\"Verifies the following kernel parameters are set console=ttyS0, earlyprintk=ttyS0, rootdelay=300\",\"Result\":\"Warning\",\"ActualValue\":\"Missing Parameter: rootdelay=300\\r\\nMatched Parameter: console=ttyS0,earlyprintk=ttyS0\",\"RequiredValue\":\"console=ttyS0#earlyprintk=ttyS0#rootdelay=300\"},{\"TestID\":\"41\",\"TestCaseName\":\"Swap Partition on OS Disk\",\"Description\":\"Verifies that no Swap partitions are created on the OS disk.\",\"Result\":\"Passed\",\"ActualValue\":\"No. of Swap Partitions: 0\",\"RequiredValue\":\"swap\"},{\"TestID\":\"42\",\"TestCaseName\":\"Root Partition on OS Disk\",\"Description\":\"It is recommended that a single root partition is created for the OS disk.\",\"Result\":\"Passed\",\"ActualValue\":\"Root Partition: 1\",\"RequiredValue\":\"1\"},{\"TestID\":\"44\",\"TestCaseName\":\"OpenSSL Version\",\"Description\":\"OpenSSL Version should be >=0.9.8.\",\"Result\":\"Passed\",\"ActualValue\":\"1.1.1\",\"RequiredValue\":\"0.9.8\"},{\"TestID\":\"45\",\"TestCaseName\":\"Python Version\",\"Description\":\"Python version 2.6+ is highly recommended. \",\"Result\":\"Passed\",\"ActualValue\":\"2.7.17\",\"RequiredValue\":\"2.6\"},{\"TestID\":\"46\",\"TestCaseName\":\"Client Alive Interval\",\"Description\":\"It is recommended to set ClientAliveInterval to 180. On the application need, it can be set between 30 to 235. \\nIf you are enabling the SSH for your end users this value must be set as explained.\",\"Result\":\"Warning\",\"ActualValue\":\"120\",\"RequiredValue\":\"ClientAliveInterval 180\"},{\"TestID\":\"49\",\"TestCaseName\":\"OS Architecture\",\"Description\":\"Only 64-bit operating system should be supported.\",\"Result\":\"Passed\",\"ActualValue\":\"x86_64\\n\",\"RequiredValue\":\"x86_64,amd64\"},{\"TestID\":\"50\",\"TestCaseName\":\"Security threats\",\"Description\":\"Identifies OS with recent high profile vulnerability that might need patching.  Ignore warning if system was patched as appropriate.\",\"Result\":\"Passed\",\"ActualValue\":\"Ubuntu 18.04\",\"RequiredValue\":\"OS impacted by GHOSTS\"},{\"TestID\":\"51\",\"TestCaseName\":\"Auto Update\",\"Description\":\"Identifies if Linux Agent Auto Update is enabled or not.\",\"Result\":\"Passed\",\"ActualValue\":\"# AutoUpdate.Enabled=y\\n\",\"RequiredValue\":\"Yes\"},{\"TestID\":\"52\",\"TestCaseName\":\"SACK Vulnerability patch verification\",\"Description\":\"Checks if the running Kernel Version has SACK vulnerability patch.\",\"Result\":\"Passed\",\"ActualValue\":\"Ubuntu 18.04.5 LTS,Linux version 5.4.0-1023-azure (buildd@lgw01-amd64-053) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #23~18.04.1-Ubuntu SMP Thu Aug 20 14:46:48 UTC 2020\",\"RequiredValue\":\"Yes\"}]}"
    }