Azure Instance Metadata Service

적용 대상: ✔️ Linux VM ✔️ Windows VM ✔️ 유연한 확장 집합

IMDS(Azure Instance Metadata Service)는 현재 실행 중인 가상 머신 인스턴스에 대한 정보를 제공합니다. 이를 사용하여 가상 머신을 관리하고 구성할 수 있습니다. 이 정보에는 SKU, 스토리지, 네트워크 구성 및 예정된 유지 관리 이벤트가 포함됩니다. 사용 가능한 데이터의 전체 목록은 엔드포인트 범주 요약을 참조하세요.

IMDS는 VM(가상 머신) 및 확장 집합 인스턴스를 실행하는 데 사용할 수 있습니다. 모든 엔드포인트는 Azure Resource Manager를 사용하여 만들고 관리하는 VM을 지원합니다. 인스턴스 범주의 증명된 범주 및 네트워크 부분만 클래식 배포 모델을 사용하여 만든 VM을 지원합니다. 증명된 엔드포인트는 제한된 범위에만 해당됩니다.

IMDS는 잘 알려진 라우팅할 수 없는 IP 주소(169.254.169.254)에서 사용할 수 있는 REST API입니다. VM 내에서만 액세스할 수 있습니다. VM과 IMDS 간의 통신은 호스트를 떠나지 않습니다. IMDS를 쿼리할 때 HTTP 클라이언트에서 VM 내의 웹 프록시를 무시하도록 하고 169.254.169.254168.63.129.16과 동일하게 처리합니다.

사용

Azure Instance Metadata Service에 액세스

IMDS에 액세스하려면 Azure Resource Manager 또는 Azure Portal에서 VM을 만들고 다음 샘플을 사용합니다. 자세한 예제는 Azure Instance Metadata 샘플을 참조하세요.

인스턴스에 대한 모든 메타데이터를 검색하는 샘플 코드는 다음과 같습니다. 특정 데이터 원본에 액세스하기 위해 사용 가능한 모든 기능에 대한 개요를 보려면 엔드포인트 범주를 참조하세요.

요청

Important

이 예제에서는 프록시를 무시합니다. IMDS를 쿼리할 때 프록시를 무시해야 합니다. 자세한 내용은 프록시를 참조하세요.

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2021-02-01" | ConvertTo-Json -Depth 64

-NoProxy에는 PowerShell V6 이상이 필요합니다. 이전 PowerShell 버전의 예는 샘플 리포지토리를 참조하세요.

응답

참고 항목

응답은 JSON 문자열입니다. 다음 예제 응답은 가독성을 높이기 위해 적절히 인쇄되었습니다.

{
    "compute": {
        "azEnvironment": "AZUREPUBLICCLOUD",
        "additionalCapabilities": {
            "hibernationEnabled": "true"
        },
        "hostGroup": {
          "id": "testHostGroupId"
        }, 
        "extendedLocation": {
            "type": "edgeZone",
            "name": "microsoftlosangeles"
        },
        "evictionPolicy": "",
        "isHostCompatibilityLayerVm": "true",
        "licenseType":  "Windows_Client",
        "location": "westus",
        "name": "examplevmname",
        "offer": "WindowsServer",
        "osProfile": {
            "adminUsername": "admin",
            "computerName": "examplevmname",
            "disablePasswordAuthentication": "true"
        },
        "osType": "Windows",
        "placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
        "plan": {
            "name": "planName",
            "product": "planProduct",
            "publisher": "planPublisher"
        },
        "platformFaultDomain": "36",
        "platformSubFaultDomain": "",        
        "platformUpdateDomain": "42",
        "priority": "Regular",
        "publicKeys": [{
                "keyData": "ssh-rsa 0",
                "path": "/home/user/.ssh/authorized_keys0"
            },
            {
                "keyData": "ssh-rsa 1",
                "path": "/home/user/.ssh/authorized_keys1"
            }
        ],
        "publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
        "resourceGroupName": "macikgo-test-may-23",
        "resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
        "securityProfile": {
            "secureBootEnabled": "true",
            "virtualTpmEnabled": "false",
            "encryptionAtHost": "true",
            "securityType": "TrustedLaunch"
        },
        "sku": "2019-Datacenter",
        "storageProfile": {
            "dataDisks": [{
                "bytesPerSecondThrottle": "979202048",
                "caching": "None",
                "createOption": "Empty",
                "diskCapacityBytes": "274877906944",
                "diskSizeGB": "1024",
                "image": {
                  "uri": ""
                },
                "isSharedDisk": "false",
                "isUltraDisk": "true",
                "lun": "0",
                "managedDisk": {
                  "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampledatadiskname",
                  "storageAccountType": "StandardSSD_LRS"
                },
                "name": "exampledatadiskname",
                "opsPerSecondThrottle": "65280",
                "vhd": {
                  "uri": ""
                },
                "writeAcceleratorEnabled": "false"
            }],
            "imageReference": {
                "id": "",
                "offer": "WindowsServer",
                "publisher": "MicrosoftWindowsServer",
                "sku": "2019-Datacenter",
                "version": "latest",
                "communityGalleryImageId": "/CommunityGalleries/testgallery/Images/1804Gen2/Versions/latest",
                "sharedGalleryImageId": "/SharedGalleries/1P/Images/gen2/Versions/latest",
                "exactVersion": "1.1686127202.30113"
            },
            "osDisk": {
                "caching": "ReadWrite",
                "createOption": "FromImage",
                "diskSizeGB": "30",
                "diffDiskSettings": {
                    "option": "Local"
                },
                "encryptionSettings": {
                  "enabled": "false",
                  "diskEncryptionKey": {
                    "sourceVault": {
                      "id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                    },
                    "secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
                  },
                  "keyEncryptionKey": {
                    "sourceVault": {
                      "id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                    },
                    "keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
                  }
                },
                "image": {
                    "uri": ""
                },
                "managedDisk": {
                    "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
                    "storageAccountType": "StandardSSD_LRS"
                },
                "name": "exampleosdiskname",
                "osType": "Windows",
                "vhd": {
                    "uri": ""
                },
                "writeAcceleratorEnabled": "false"
            },
            "resourceDisk": {
                "size": "4096"
            }
        },
        "subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
        "tags": "baz:bash;foo:bar",
        "userData": "Zm9vYmFy",
        "version": "15.05.22",
        "virtualMachineScaleSet": {
            "id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
        },
        "vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
        "vmScaleSetName": "crpteste9vflji9",
        "vmSize": "Standard_A3",
        "zone": ""
    },
    "network": {
        "interface": [{
            "ipv4": {
               "ipAddress": [{
                    "privateIpAddress": "10.144.133.132",
                    "publicIpAddress": ""
                }],
                "subnet": [{
                    "address": "10.144.133.128",
                    "prefix": "26"
                }]
            },
            "ipv6": {
                "ipAddress": [
                 ]
            },
            "macAddress": "0011AAFFBB22"
        }]
    }
}

보안 및 인증

Instance Metadata Service는 라우팅할 수 없는 IP 주소에서 실행 중인 가상 머신 인스턴스 내에서만 액세스할 수 있습니다. VM은 자체 메타데이터/기능과만 상호 작용할 수 있습니다. API는 HTTP 전용이며 호스트를 떠나지 않습니다.

IMDS에 대한 요청이 직접 의도된 것인지 확인하고, 의도하지 않거나 원치 않는 요청 리디렉션을 방지하기 위해 다음과 같이 요구합니다.

  • Metadata: true 헤더를 포함해야 함
  • X-Forwarded-For 헤더를 포함하지 않아야 함

이러한 두 요구 사항을 모두 충족하지 않는 요청은 서비스에서 거부됩니다.

Important

IMDS는 중요한 데이터를 위한 채널이 아닙니다. API는 인증되지 않았으며 VM의 모든 프로세스에 열려 있습니다. 이 서비스를 통해 노출되는 정보는 VM 내에서 실행 중인 모든 애플리케이션에 대한 공유 정보로 간주되어야 합니다.

VM의 모든 프로세스가 IMDS 엔드포인트에 액세스할 필요가 없는 경우 로컬 방화벽 규칙을 설정하여 액세스를 제한할 수 있습니다. 예를 들어 알려진 시스템 서비스만 Instance Metadata Service에 액세스해야 하는 경우 IMDS 엔드포인트에 방화벽 규칙을 설정하여 특정 프로세스만 액세스하도록 허용하거나 나머지 프로세스에 대해서는 액세스를 거부할 수 있습니다.

프록시

IMDS는 프록시 뒤에서 사용할 수 없으며 지원되지 않습니다. 대부분의 HTTP 클라이언트는 요청 시 프록시를 사용하지 않도록 설정하는 옵션을 제공하며, 이 기능은 IMDS와 통신할 때 활용해야 합니다. 자세한 내용은 클라이언트 설명서를 참조하세요.

Important

사용자 환경의 프록시 구성을 알지 못하는 경우에도 여전히 기본 클라이언트 프록시 설정을 재정의해야 합니다. 프록시 구성은 자동으로 검색할 수 있으며, 이러한 구성을 무시하지 못하면 나중에 컴퓨터의 구성을 변경해야 하는 경우 중단 위험에 노출됩니다.

속도 제한

일반적으로 IMDS에 대한 요청은 초당 5개의 요청으로 제한됩니다(VM 기준). 이 임계값을 초과하는 요청은 429 응답으로 거부됩니다. 관리 ID 범주에 대한 요청은 (VM당 기준으로) 초당 20개 요청, 5개 동시 요청으로 제한됩니다.

HTTP 동사

현재 지원되는 HTTP 동사는 다음과 같습니다.

동사 설명
GET 요청된 리소스를 검색합니다.

매개 변수

엔드포인트는 필수 및/또는 선택적 매개 변수를 지원할 수 있습니다. 자세한 내용은 해당 엔드포인트에 대한 스키마 및 설명서를 참조하세요.

쿼리 매개 변수

IMDS 엔드포인트는 HTTP 쿼리 문자열 매개 변수를 지원합니다. 예시:

http://169.254.169.254/metadata/instance/compute?api-version=2021-01-01&format=json

매개 변수를 지정합니다.

속성
api-version 2021-01-01
format json

중복된 쿼리 매개 변수 이름이 있는 요청은 거부됩니다.

경로 매개 변수

더 큰 json Blob을 반환하는 일부 엔드포인트의 경우 경로 매개 변수를 요청 엔드포인트에 추가하여 응답의 하위 집합으로 필터링할 수 있습니다.

http://169.254.169.254/metadata/<endpoint>/[<filter parameter>/...]?<query parameters>

매개 변수는 구문 분석된 표현과 상호 작용할 때 json 개체를 탐색하는 데 사용되는 인덱스/키에 해당합니다.

예를 들어 /metadata/instance는 json 개체를 반환합니다.

{
    "compute": { ... },
    "network": {
        "interface": [
            {
                "ipv4": {
                   "ipAddress": [{
                        "privateIpAddress": "10.144.133.132",
                        "publicIpAddress": ""
                    }],
                    "subnet": [{
                        "address": "10.144.133.128",
                        "prefix": "26"
                    }]
                },
                "ipv6": {
                    "ipAddress": [
                     ]
                },
                "macAddress": "0011AAFFBB22"
            },
            ...
        ]
    }
}

응답을 컴퓨팅 속성으로만 필터링하려면 다음 요청을 보냅니다.

http://169.254.169.254/metadata/instance/compute?api-version=<version>

마찬가지로 중첩된 속성 또는 특정 배열 요소로 필터링하려면 키를 계속 추가합니다.

http://169.254.169.254/metadata/instance/network/interface/0?api-version=<version>

Network.interface 속성에서 첫 번째 요소로 필터링하고 반환합니다.

{
    "ipv4": {
       "ipAddress": [{
            "privateIpAddress": "10.144.133.132",
            "publicIpAddress": ""
        }],
        "subnet": [{
            "address": "10.144.133.128",
            "prefix": "26"
        }]
    },
    "ipv6": {
        "ipAddress": [
         ]
    },
    "macAddress": "0011AAFFBB22"
}

참고 항목

리프 노드로 필터링하는 경우 format=json이 작동하지 않습니다. 이러한 쿼리의 경우 기본 형식이 json이므로 format=text를 명시적으로 지정해야 합니다.

스키마

데이터 형식

기본적으로 IMDS는 데이터를 JSON 형식(Content-Type: application/json)으로 반환합니다. 그러나 응답 필터링을 지원하는 엔드포인트(경로 매개 변수 참조)는 text 형식도 지원합니다.

기본이 아닌 응답 형식에 액세스하려면 요청된 형식을 요청의 쿼리 문자열 매개 변수로 지정합니다. 예시:

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2017-08-01&format=text"

json 응답에서 모든 기본 요소는 string 형식이며, 누락되거나 적용할 수 없는 값은 항상 포함되지만 빈 문자열로 설정됩니다.

버전 관리

IMDS에 대한 버전이 관리되므로 반드시 API 버전을 HTTP 요청에 지정해야 합니다. 이 요구 사항에 대한 유일한 예외는 사용 가능한 API 버전을 동적으로 검색하는 데 사용할 수 있는 versions 엔드포인트입니다.

새로운 버전이 추가되더라도 스크립트가 특정 데이터 형식에 종속성이 있는 경우 이전 버전에 여전히 액세스할 수 있습니다.

버전을 지정하지 않으면 지원되는 최신 버전 목록이 포함된 오류가 표시됩니다.

{
    "error": "Bad request. api-version was not specified in the request. For more information refer to aka.ms/azureimds",
    "newest-versions": [
        "2020-10-01",
        "2020-09-01",
        "2020-07-15"
    ]
}

지원되는 API 버전

참고 항목

버전 2023-07-01은 아직 롤아웃 중이며 일부 지역에서는 사용하지 못할 수도 있습니다.

  • 2023-07-01
  • 2021-12-13
  • 2021-11-15
  • 2021-11-01
  • 2021-10-01
  • 2021-08-01
  • 2021-05-01
  • 2021-03-01
  • 2021-02-01
  • 2021-01-01
  • 2020-12-01
  • 2020-10-01
  • 2020-09-01
  • 2020-07-15
  • 2020-06-01
  • 2019-11-01
  • 2019-08-15
  • 2019-08-01
  • 2019-06-04
  • 2019-06-01
  • 2019-04-30
  • 2019-03-11
  • 2019-02-01
  • 2018-10-01
  • 2018-04-02
  • 2018-02-01
  • 2017-12-01
  • 2017-10-01
  • 2017-08-01
  • 2017-04-02
  • 2017-03-01

Swagger

IMDS에 대한 전체 Swagger 정의는 https://github.com/Azure/azure-rest-api-specs/blob/main/specification/imds/data-plane/readme.md에서 제공됩니다.

국가별 가용성

이 서비스는 모든 Azure 클라우드에서 일반 공급됩니다.

루트 엔드포인트

루트 엔드포인트는 http://169.254.169.254/metadata입니다.

엔드포인트 범주

IMDS API에는 서로 다른 데이터 원본을 나타내는 여러 엔드포인트 범주가 포함되며, 각 범주에는 하나 이상의 엔드포인트가 포함됩니다. 자세한 내용은 각 범주를 참조하세요.

루트 범주 설명 도입된 버전
/metadata/attested 증명된 데이터 참조 2018-10-01
/metadata/identity IMDS를 통한 관리 ID 참조 2018-02-01
/metadata/instance 인스턴스 메타데이터 참조 2017-04-02
/metadata/loadbalancer IMDS를 통한 Load Balancer 메타데이터 검색 참조 2020-10-01
/metadata/scheduledevents IMDS를 통한 Scheduled Events 참조 2017-08-01
/metadata/versions 버전 참조 해당 없음

버전

API 버전 나열

지원되는 API 버전 세트를 반환합니다.

GET /metadata/versions

매개 변수

없음(이 엔드포인트에 대한 버전이 없음)

응답

{
  "apiVersions": [
    "2017-03-01",
    "2017-04-02",
    ...
  ]
}

인스턴스 메타데이터

VM 메타데이터 가져오기

컴퓨팅, 네트워크 및 스토리지를 포함하여 VM 인스턴스에 대한 중요한 메타데이터를 공개합니다.

GET /metadata/instance

매개 변수

속성 필수/선택 사항 설명
api-version 필수 요청을 처리하는 데 사용되는 버전입니다.
format 선택 사항* 응답의 형식(json 또는 text)입니다. *참고: 요청 매개 변수를 사용할 때 필요할 수 있습니다.

이 엔드포인트는 경로 매개 변수를 통한 응답 필터링을 지원합니다.

응답

{
    "compute": {
        "azEnvironment": "AZUREPUBLICCLOUD",
        "additionalCapabilities": {
            "hibernationEnabled": "true"
        },
        "hostGroup": {
          "id": "testHostGroupId"
        }, 
        "extendedLocation": {
            "type": "edgeZone",
            "name": "microsoftlosangeles"
        },
        "evictionPolicy": "",
        "isHostCompatibilityLayerVm": "true",
        "licenseType":  "Windows_Client",
        "location": "westus",
        "name": "examplevmname",
        "offer": "WindowsServer",
        "osProfile": {
            "adminUsername": "admin",
            "computerName": "examplevmname",
            "disablePasswordAuthentication": "true"
        },
        "osType": "Windows",
        "placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
        "plan": {
            "name": "planName",
            "product": "planProduct",
            "publisher": "planPublisher"
        },
        "platformFaultDomain": "36",
        "platformSubFaultDomain": "",        
        "platformUpdateDomain": "42",
        "priority": "Regular",
        "publicKeys": [{
                "keyData": "ssh-rsa 0",
                "path": "/home/user/.ssh/authorized_keys0"
            },
            {
                "keyData": "ssh-rsa 1",
                "path": "/home/user/.ssh/authorized_keys1"
            }
        ],
        "publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
        "resourceGroupName": "macikgo-test-may-23",
        "resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
        "securityProfile": {
            "secureBootEnabled": "true",
            "virtualTpmEnabled": "false",
            "encryptionAtHost": "true",
            "securityType": "TrustedLaunch"
        },
        "sku": "2019-Datacenter",
        "storageProfile": {
            "dataDisks": [{
                "bytesPerSecondThrottle": "979202048",
                "caching": "None",
                "createOption": "Empty",
                "diskCapacityBytes": "274877906944",
                "diskSizeGB": "1024",
                "image": {
                  "uri": ""
                },
                "isSharedDisk": "false",
                "isUltraDisk": "true",
                "lun": "0",
                "managedDisk": {
                  "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampledatadiskname",
                  "storageAccountType": "StandardSSD_LRS"
                },
                "name": "exampledatadiskname",
                "opsPerSecondThrottle": "65280",
                "vhd": {
                  "uri": ""
                },
                "writeAcceleratorEnabled": "false"
            }],
            "imageReference": {
                "id": "",
                "offer": "WindowsServer",
                "publisher": "MicrosoftWindowsServer",
                "sku": "2019-Datacenter",
                "version": "latest",
                "communityGalleryImageId": "/CommunityGalleries/testgallery/Images/1804Gen2/Versions/latest",
                "sharedGalleryImageId": "/SharedGalleries/1P/Images/gen2/Versions/latest",
                "exactVersion": "1.1686127202.30113"
            },
            "osDisk": {
                "caching": "ReadWrite",
                "createOption": "FromImage",
                "diskSizeGB": "30",
                "diffDiskSettings": {
                    "option": "Local"
                },
                "encryptionSettings": {
                  "enabled": "false",
                  "diskEncryptionKey": {
                    "sourceVault": {
                      "id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                    },
                    "secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
                  },
                  "keyEncryptionKey": {
                    "sourceVault": {
                      "id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                    },
                    "keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
                  }
                },
                "image": {
                    "uri": ""
                },
                "managedDisk": {
                    "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
                    "storageAccountType": "StandardSSD_LRS"
                },
                "name": "exampleosdiskname",
                "osType": "Windows",
                "vhd": {
                    "uri": ""
                },
                "writeAcceleratorEnabled": "false"
            },
            "resourceDisk": {
                "size": "4096"
            }
        },
        "subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
        "tags": "baz:bash;foo:bar",
        "userData": "Zm9vYmFy",
        "version": "15.05.22",
        "virtualMachineScaleSet": {
            "id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
        },
        "vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
        "vmScaleSetName": "crpteste9vflji9",
        "vmSize": "Standard_A3",
        "zone": ""
    },
    "network": {
        "interface": [{
            "ipv4": {
               "ipAddress": [{
                    "privateIpAddress": "10.144.133.132",
                    "publicIpAddress": ""
                }],
                "subnet": [{
                    "address": "10.144.133.128",
                    "prefix": "26"
                }]
            },
            "ipv6": {
                "ipAddress": [
                 ]
            },
            "macAddress": "0011AAFFBB22"
        }]
    }
}

스키마 분석:

컴퓨팅

데이터 설명 도입된 버전
azEnvironment VM이 실행되는 Azure 환경 2018-10-01
additionalCapabilities.hibernationEnabled VM에서 최대 절전 모드가 사용하도록 설정되어 있는지 여부를 식별합니다. 2021-11-01
customData IMDS에서는 이 기능이 사용되지 않으며 비활성화됩니다. userData로 대체되었습니다. 2019-02-01
evictionPolicy 스폿 VM이 제거되는 방법을 설정합니다. 2020-12-01
extendedLocation.type VM의 확장 위치 유형입니다. 2021-03-01
extendedLocation.name VM의 확장 위치 이름 2021-03-01
host.id VM의 호스트 이름입니다. VM에는 호스트 또는 hostGroup이 있지만 둘 다 있지는 않습니다. 2021-11-15
hostGroup.id VM의 hostGroup 이름입니다. VM에는 호스트 또는 hostGroup이 있지만 둘 다 있지는 않습니다. 2021-11-15
isHostCompatibilityLayerVm VM이 호스트 호환성 계층에서 실행되는지 여부를 식별합니다. 2020-06-01
licenseType Azure 하이브리드 혜택에 대한 라이선스 유형입니다. 이는 AHB 사용 VM에 대해서만 제공됩니다. 2020-09-01
location VM을 실행하는 Azure 지역 2017-04-02
name VM의 이름 2017-04-02
offer VM 이미지에 대한 제품 정보이며 Azure 이미지 갤러리에서 배포된 이미지에만 있습니다. 2017-04-02
osProfile.adminUsername 관리자 계정의 이름을 지정합니다. 2020-07-15
osProfile.computerName 컴퓨터의 이름을 지정합니다. 2020-07-15
osProfile.disablePasswordAuthentication 암호 인증을 비활성화할지 여부를 지정합니다. 이는 Linux VM에 대해서만 제공됩니다. 2020-10-01
osType Linux 또는or Windows 2017-04-02
placementGroupId 확장 집합의 배치 그룹 2017-08-01
plan Azure Marketplace 이미지에 해당하는 VM의 이름, 제품 및 게시자를 포함하는 계획 2018-04-02
platformUpdateDomain VM을 실행 중인 업데이트 도메인 2017-04-02
platformFaultDomain VM을 실행 중인 장애 도메인 2017-04-02
platformSubFaultDomain 해당하는 경우 VM이 실행 중인 하위 장애 도메인입니다. 2021-10-01
priority VM의 우선 순위입니다. 자세한 내용은 스폿 VM을 참조하세요. 2020-12-01
provider VM의 공급자 2018-10-01
publicKeys VM 및 경로에 할당된 공개 키 컬렉션 2018-04-02
publisher VM 이미지 게시자 2017-04-02
resourceGroupName Virtual Machine에 대한 리소스 그룹 2017-08-01
resourceId 리소스의 정규화된 ID 2019-03-11
sku VM 이미지에 해당하는 SKU 2017-04-02
securityProfile.secureBootEnabled VM에서 UEFI 보안 부팅을 사용하도록 설정하는지 여부를 확인합니다. 2020-06-01
securityProfile.virtualTpmEnabled VM에서 가상 TPM(신뢰할 수 있는 플랫폼 모듈)이 사용하도록 설정되어 있는지 여부를 식별합니다. 2020-06-01
securityProfile.encryptionAtHost VM에서 호스트에서 암호화가 사용하도록 설정되어 있는지 여부를 식별합니다. 2021-11-01
securityProfile.securityType VM이 신뢰할 수 있는 VM인지, 아니면 기밀 VM인지 여부를 식별합니다. 2021-12-13
storageProfile 아래 '스토리지 프로필' 참조 2019-06-01
subscriptionId Virtual Machine에 대한 Azure 구독 2017-08-01
tags Virtual Machine에 대한 태그 2017-08-01
tagsList 원활한 프로그래매틱 구문 분석을 위해 JSON 배열로 형식이 지정된 태그 2019-06-04
userData 프로비저닝 중 또는 후에 사용하기 위해 VM을 만들 때 지정된 데이터 세트(Base64 인코딩) 2021-01-01
version VM 이미지의 버전 2017-04-02
virtualMachineScaleSet.id 유연한 오케스트레이션을 사용하여 만든 Virtual Machine Scale Set의 ID는 Virtual Machine의 일부입니다. 이 필드는 균일한 오케스트레이션을 사용하여 만든 Virtual Machine Scale Sets에 사용할 수 없습니다. 2021-03-01
vmId VM의 고유 식별자. 참조된 블로그는 SMBIOS < 2.6이 있는 VM에만 적합합니다. SMBIOS >= 2.6이 있는 VM의 경우 DMI의 UUID는 little-endian 형식으로 표시되므로 바이트를 전환할 필요가 없습니다. 2017-04-02
vmScaleSetName 확장 집합의 가상 머신 확장 집합 이름 2017-12-01
vmSize VM 크기 2017-04-02
zone 가상 머신의 가용성 영역 2017-12-01

† 이 버전은 아직 완전히 사용할 수 없으며 일부 지역에서 지원되지 않을 수 있습니다.

스토리지 프로필

VM의 스토리지 프로필은 이미지 참조, OS 디스크, 데이터 디스크의 세 가지 범주와 로컬 임시 디스크에 대한 추가 개체로 구분됩니다.

이미지 참조 개체에는 OS 이미지에 대한 다음 정보가 포함되어 있습니다. 이미지는 플랫폼, 마켓플레이스, 커뮤니티 갤러리 또는 직접 공유 갤러리에서 가져올 수 있지만 둘 다에서 가져올 수는 없습니다.

데이터 설명 도입된 버전
id 리소스 ID 2019-06-01
offer 플랫폼의 제품 또는 마켓플레이스 이미지 2019-06-01
publisher 플랫폼 또는 마켓플레이스 이미지의 게시자 2019-06-01
sku 플랫폼 또는 마켓플레이스 이미지의 SKU 2019-06-01
version 이미지 버전 2019-06-01
communityGalleryImageId 커뮤니티 이미지의 리소스 ID입니다. 그렇지 않으면 비어 있습니다. 2023-07-01
sharedGalleryImageId 리소스 ID 직접 공유 이미지입니다. 그렇지 않으면 비어 있습니다. 2023-07-01
exactVersion 커뮤니티 버전 또는 직접 공유 이미지 2023-07-01

OS 디스크 개체에는 VM에서 사용하는 OS 디스크에 대한 다음 정보가 포함됩니다.

데이터 설명
caching 캐싱 요구 사항
createOption VM이 생성된 방법에 대한 정보
diffDiskSettings 임시 디스크 설정
diskSizeGB 디스크의 크기(GB)
image 원본 사용자 이미지 가상 하드 디스크
managedDisk 관리 디스크 매개 변수
name 디스크 이름
vhd 가상 하드 디스크
writeAcceleratorEnabled writeAccelerator를 디스크에서 사용할 수 있는지 여부

데이터 디스크 배열에는 VM에 연결된 데이터 디스크 목록이 포함됩니다. 각 데이터 디스크 개체에는 다음 정보가 들어 있습니다.

데이터 설명 도입된 버전
bytesPerSecondThrottle* 디스크 읽기/쓰기 할당량(바이트) 2021-05-01
caching 캐싱 요구 사항 2019-06-01
createOption VM이 생성된 방법에 대한 정보 2019-06-01
diffDiskSettings 임시 디스크 설정 2019-06-01
diskCapacityBytes* 디스크 크기(바이트) 2021-05-01
diskSizeGB 디스크의 크기(GB) 2019-06-01
encryptionSettings 디스크의 암호화 설정 2019-06-01
image 원본 사용자 이미지 가상 하드 디스크 2019-06-01
isSharedDisk* 리소스 간에 디스크가 공유되는지 식별 2021-05-01
isUltraDisk 데이터 디스크가 Ultra Disk인지 식별 2021-05-01
lun 디스크의 논리 단위 번호 2019-06-01
managedDisk 관리 디스크 매개 변수 2019-06-01
name 디스크 이름 2019-06-01
opsPerSecondThrottle* IOPS의 디스크 읽기/쓰기 할당량 2021-05-01
osType 디스크에 포함된 OS 유형 2019-06-01
vhd 가상 하드 디스크 2019-06-01
writeAcceleratorEnabled writeAccelerator를 디스크에서 사용할 수 있는지 여부 2019-06-01

*이 필드는 Ultra Disk에 대해서만 채워지며 Ultra Disk가 아닌 경우 빈 문자열이 됩니다.

암호화 설정 Blob에는 디스크가 암호화되는 방법(암호화된 경우)에 대한 데이터가 포함됩니다.

데이터 설명 도입된 버전
diskEncryptionKey.sourceVault.id 디스크 암호화 키의 위치 2021-11-01
diskEncryptionKey.secretUrl 비밀의 위치 2021-11-01
keyEncryptionKey.sourceVault.id 키 암호화 키의 위치 2021-11-01
keyEncryptionKey.keyUrl 키의 위치 2021-11-01

리소스 디스크 개체는 VM에 연결된 로컬 임시 디스크의 크기(KB)를 포함합니다. VM에 대한 로컬 임시 디스크가 없으면 이 값은 0입니다.

데이터 설명 도입된 버전
resourceDisk.size VM에 대한 로컬 임시 디스크 크기(KB) 2021-02-01

네트워크

데이터 설명 도입된 버전
ipv4.privateIpAddress VM의 로컬 IPv4 주소 2017-04-02
ipv4.publicIpAddress VM의 공용 IPv4 주소 2017-04-02
subnet.address VM의 서브넷 주소 2017-04-02
subnet.prefix 서브넷 접두사, 예:24 2017-04-02
ipv6.ipAddress VM의 로컬 IPv6 주소 2017-04-02
macAddress VM MAC 주소 2017-04-02

참고 항목

네트워크 호출을 통해 반환된 nics는 순서대로 보장되지 않습니다.

사용자 데이터 가져오기

새 VM을 만들 때는 VM 프로비저닝 중 또는 후에 사용할 데이터 세트를 지정하고 IMDS를 통해 검색할 수 있습니다. 여기에서 최종 사용자 데이터 환경을 확인하세요.

사용자 데이터를 설정하려면 여기에서 빠른 시작 템플릿을 활용합니다. 아래 샘플에서는 IMDS를 통해 이 데이터를 검색하는 방법을 보여줍니다. 이 기능은 버전 2021-01-01 이상으로 릴리스되었습니다.

참고 항목

보안 알림: IMDS는 VM의 모든 애플리케이션에 공개되기 때문에 중요한 데이터를 사용자 데이터에 저장해서는 안 됩니다.

$userData = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021-01-01&format=text"
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))

샘플 1: Azure에서 실행 중인 VM 추적

서비스 공급자는 소프트웨어를 실행 중인 VM의 수를 추적하거나 VM의 고유성을 추적해야 하는 에이전트가 있어야 합니다. VM의 고유 ID를 가져오려면 Instance Metadata Service의 vmId 필드를 사용합니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/vmId?api-version=2017-08-01&format=text"

Response

5c08b38e-4d57-4c23-ac45-aca61037f084

샘플 2: 여러 데이터 복제본 배치

특정 시나리오의 경우 다양한 데이터 복제본 배치가 매우 중요합니다. 예를 들어 HDFS 복제본 배치 또는 오케스트레이터를 통한 컨테이너 배치를 수행하려면 VM이 실행되는 platformFaultDomainplatformUpdateDomain을 알아야 할 수 있습니다. 인스턴스에 대해 가용성 영역을 사용하여 이러한 결정을 내릴 수도 있습니다. 이 데이터는 IMDS를 통해 직접 쿼리할 수 있습니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/platformFaultDomain?api-version=2017-08-01&format=text"

Response

0

샘플 3: VM 태그 가져오기

VM 태그는 인스턴스/컴퓨팅/태그 엔드포인트 아래 인스턴스 API에 포함되어 있습니다. 태그를 특정 분류법에 따라 논리적으로 정리하기 위해 Azure VM에 태그가 적용되었을 수 있습니다. VM에 할당된 태그는 아래 요청을 사용하여 검색할 수 있습니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/tags?api-version=2017-08-01&format=text"

Response

Department:IT;ReferenceNumber:123456;TestStatus:Pending

tags 필드는 태그가 세미콜론으로 구분된 문자열입니다. 세미콜론이 태그 자체에 사용되는 경우 이 출력이 문제가 될 수 있습니다. 태그를 프로그래밍 방식으로 추출하도록 파서가 작성된 경우 tagsList 필드를 사용해야 합니다. tagsList 필드는 구분 기호가 없는 JSON 배열이며, 이에 따라 구문 분석이 더 쉽습니다. VM에 할당된 tagsList는 아래 요청을 사용하여 검색할 수 있습니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/tagsList?api-version=2019-06-04" | ConvertTo-Json -Depth 64

Response

{
    "value":  [
                  {
                      "name":  "Department",
                      "value":  "IT"
                  },
                  {
                      "name":  "ReferenceNumber",
                      "value":  "123456"
                  },
                  {
                      "name":  "TestStatus",
                      "value":  "Pending"
                  }
              ],
    "Count":  3
}

샘플 4: 지원 사례 중 VM에 대한 자세한 정보 가져오기

서비스 공급자는 지원 요청을 받을 수 있으며 이 때 VM에 대해 자세한 정보를 알아야 하는 경우가 있습니다. 고객에게 컴퓨팅 메타데이터를 공유하도록 요청하면 지원 전문가가 Azure에서 VM의 종류에 대해 알 수 있도록 기본 정보가 제공될 수 있습니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute?api-version=2020-09-01" | ConvertTo-Json -Depth 64

응답

참고 항목

응답은 JSON 문자열입니다. 다음 예제 응답은 가독성을 높이기 위해 적절히 인쇄되었습니다.

{
    "azEnvironment": "AZUREPUBLICCLOUD",
    "extendedLocation": {
      "type": "edgeZone",
      "name": "microsoftlosangeles"
    },
    "evictionPolicy": "",
    "additionalCapabilities": {
        "hibernationEnabled": "false"
    },
    "hostGroup": {
      "id": "testHostGroupId"
    },
    "isHostCompatibilityLayerVm": "true",
    "licenseType":  "Windows_Client",
    "location": "westus",
    "name": "examplevmname",
    "offer": "WindowsServer",
    "osProfile": {
        "adminUsername": "admin",
        "computerName": "examplevmname",
        "disablePasswordAuthentication": "true"
    },
    "osType": "Windows",
    "placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
    "plan": {
        "name": "planName",
        "product": "planProduct",
        "publisher": "planPublisher"
    },
    "platformFaultDomain": "36",
    "platformUpdateDomain": "42",
    "priority": "Regular",
    "publicKeys": [{
            "keyData": "ssh-rsa 0",
            "path": "/home/user/.ssh/authorized_keys0"
        },
        {
            "keyData": "ssh-rsa 1",
            "path": "/home/user/.ssh/authorized_keys1"
        }
    ],
    "publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
    "resourceGroupName": "macikgo-test-may-23",
    "resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
    "securityProfile": {
        "secureBootEnabled": "true",
        "virtualTpmEnabled": "false",
        "encryptionAtHost": "true",
        "securityType": "TrustedLaunch"
    },
    "sku": "2019-Datacenter",
    "storageProfile": {
        "dataDisks": [{
            "bytesPerSecondThrottle": "979202048",
            "caching": "None",
            "createOption": "Empty",
            "diskCapacityBytes": "274877906944",
            "diskSizeGB": "1024",
            "image": {
              "uri": ""
            },
            "isSharedDisk": "false",
            "isUltraDisk": "true",
            "lun": "0",
            "managedDisk": {
              "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/MicrosoftCompute/disks/exampledatadiskname",
              "storageAccountType": "StandardSSD_LRS"
            },
            "name": "exampledatadiskname",
            "opsPerSecondThrottle": "65280",
            "vhd": {
              "uri": ""
            },
            "writeAcceleratorEnabled": "false"
        }],
        "imageReference": {
            "id": "",
            "offer": "WindowsServer",
            "publisher": "MicrosoftWindowsServer",
            "sku": "2019-Datacenter",
            "version": "latest",
            "communityGalleryImageId": "/CommunityGalleries/testgallery/Images/1804Gen2/Versions/latest",
            "sharedGalleryImageId": "/SharedGalleries/1P/Images/gen2/Versions/latest",
            "exactVersion": "1.1686127202.30113"
        },
        "osDisk": {
            "caching": "ReadWrite",
            "createOption": "FromImage",
            "diskSizeGB": "30",
            "diffDiskSettings": {
                "option": "Local"
            },
            "encryptionSettings": {
              "enabled": "false",
              "diskEncryptionKey": {
                "sourceVault": {
                  "id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                },
                "secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
              },
              "keyEncryptionKey": {
                "sourceVault": {
                  "id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
                },
                "keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
              }
            },
            "image": {
                "uri": ""
            },
            "managedDisk": {
                "id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
                "storageAccountType": "StandardSSD_LRS"
            },
            "name": "exampleosdiskname",
            "osType": "Windows",
            "vhd": {
                "uri": ""
            },
            "writeAcceleratorEnabled": "false"
        },
        "resourceDisk": {
            "size": "4096"
        }
    },
    "subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
    "tags": "baz:bash;foo:bar",
    "version": "15.05.22",
    "virtualMachineScaleSet": {
      "id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
    },
    "vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
    "vmScaleSetName": "crpteste9vflji9",
    "vmSize": "Standard_A3",
    "zone": ""
}

샘플 5: VM이 실행되는 Azure 환경 가져오기

Azure에는 Azure Government와 같은 다양한 소버린 클라우드가 있습니다. 경우에 따라 몇 가지 런타임 결정을 내리려면 Azure 환경이 필요합니다. 다음 샘플에서는 이러한 동작을 수행하는 방법을 보여줍니다.

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/azEnvironment?api-version=2018-10-01&format=text"

Response

AzurePublicCloud

클라우드 및 Azure 환경의 값은 아래에 나와 있습니다.

클라우드 Azure 환경
일반 공급되는 모든 글로벌 Azure 지역 AzurePublicCloud
Azure Government AzureUSGovernmentCloud
21Vianet에서 운영하는 Microsoft Azure AzureChinaCloud
Azure 독일 AzureGermanCloud

샘플 6: 네트워크 정보 검색

요청

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/network?api-version=2017-08-01" | ConvertTo-Json  -Depth 64

Response

{
  "interface": [
    {
      "ipv4": {
        "ipAddress": [
          {
            "privateIpAddress": "10.1.0.4",
            "publicIpAddress": "X.X.X.X"
          }
        ],
        "subnet": [
          {
            "address": "10.1.0.0",
            "prefix": "24"
          }
        ]
      },
      "ipv6": {
        "ipAddress": []
      },
      "macAddress": "000D3AF806EC"
    }
  ]
}

샘플 7: 공용 IP 주소 검색

Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-08-01&format=text"

참고 항목

증명된 데이터

증명된 데이터 가져오기

IMDS는 제공된 데이터가 Azure에서 제공되도록 보장하는 데 도움이 됩니다. Microsoft는 이 정보의 일부에 서명하므로 Azure Marketplace의 이미지가 Azure에서 실행되는 이미지인지 확인할 수 있습니다.

GET /metadata/attested/document

매개 변수

속성 필수/선택 사항 설명
api-version 필수 요청을 처리하는 데 사용되는 버전입니다.
nonce 선택 사항 암호화 nonce 역할을 하는 10자리 문자열입니다. 값이 제공되지 않는 경우 IMDS는 현재 UTC 타임스탬프를 사용합니다.

응답

{
    "encoding":"pkcs7",
    "signature":"MIIEEgYJKoZIhvcNAQcCoIIEAzCCA/8CAQExDzANBgkqhkiG9w0BAQsFADCBugYJKoZIhvcNAQcBoIGsBIGpeyJub25jZSI6IjEyMzQ1NjY3NjYiLCJwbGFuIjp7Im5hbWUiOiIiLCJwcm9kdWN0IjoiIiwicHVibGlzaGVyIjoiIn0sInRpbWVTdGFtcCI6eyJjcmVhdGVkT24iOiIxMS8yMC8xOCAyMjowNzozOSAtMDAwMCIsImV4cGlyZXNPbiI6IjExLzIwLzE4IDIyOjA4OjI0IC0wMDAwIn0sInZtSWQiOiIifaCCAj8wggI7MIIBpKADAgECAhBnxW5Kh8dslEBA0E2mIBJ0MA0GCSqGSIb3DQEBBAUAMCsxKTAnBgNVBAMTIHRlc3RzdWJkb21haW4ubWV0YWRhdGEuYXp1cmUuY29tMB4XDTE4MTEyMDIxNTc1N1oXDTE4MTIyMDIxNTc1NlowKzEpMCcGA1UEAxMgdGVzdHN1YmRvbWFpbi5tZXRhZGF0YS5henVyZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAML/tBo86ENWPzmXZ0kPkX5dY5QZ150mA8lommszE71x2sCLonzv4/UWk4H+jMMWRRwIea2CuQ5RhdWAHvKq6if4okKNt66fxm+YTVz9z0CTfCLmLT+nsdfOAsG1xZppEapC0Cd9vD6NCKyE8aYI1pliaeOnFjG0WvMY04uWz2MdAgMBAAGjYDBeMFwGA1UdAQRVMFOAENnYkHLa04Ut4Mpt7TkJFfyhLTArMSkwJwYDVQQDEyB0ZXN0c3ViZG9tYWluLm1ldGFkYXRhLmF6dXJlLmNvbYIQZ8VuSofHbJRAQNBNpiASdDANBgkqhkiG9w0BAQQFAAOBgQCLSM6aX5Bs1KHCJp4VQtxZPzXF71rVKCocHy3N9PTJQ9Fpnd+bYw2vSpQHg/AiG82WuDFpPReJvr7Pa938mZqW9HUOGjQKK2FYDTg6fXD8pkPdyghlX5boGWAMMrf7bFkup+lsT+n2tRw2wbNknO1tQ0wICtqy2VqzWwLi45RBwTGB6DCB5QIBATA/MCsxKTAnBgNVBAMTIHRlc3RzdWJkb21haW4ubWV0YWRhdGEuYXp1cmUuY29tAhBnxW5Kh8dslEBA0E2mIBJ0MA0GCSqGSIb3DQEBCwUAMA0GCSqGSIb3DQEBAQUABIGAld1BM/yYIqqv8SDE4kjQo3Ul/IKAVR8ETKcve5BAdGSNkTUooUGVniTXeuvDj5NkmazOaKZp9fEtByqqPOyw/nlXaZgOO44HDGiPUJ90xVYmfeK6p9RpJBu6kiKhnnYTelUk5u75phe5ZbMZfBhuPhXmYAdjc7Nmw97nx8NnprQ="
}

서명 Blob은 pkcs7로 서명된 버전의 문서입니다. 여기에는 특정 VM별 세부 정보와 함께 서명에 사용되는 인증서가 포함됩니다.

Azure Resource Manager를 사용하여 만든 VM의 경우 문서에는 문서 만들기 및 만료에 대한 vmId, sku, nonce, subscriptionId, timeStamp 및 이미지에 대한 계획 정보가 포함됩니다. 요금제 정보는 Azure Marketplace 이미지에 대해서만 채워집니다.

클래식 배포 모델을 사용하여 만든 VM의 경우 vmIdsubscriptionId만 채워집니다. 응답에서 인증서를 추출하고, 이를 사용하여 여 응답이 유효하고 Azure에서 제공되는지 확인할 수 있습니다.

디코딩된 문서에 포함되는 필드는 다음과 같습니다.

데이터 설명 도입된 버전
licenseType Azure 하이브리드 혜택에 대한 라이선스 유형입니다. 이는 AHB 사용 VM에 대해서만 제공됩니다. 2020-09-01
nonce 요청에 선택적으로 제공할 수 있는 문자열입니다. nonce가 제공되지 않은 경우 현재 협정 세계시 타임스탬프가 사용됩니다. 2018-10-01
plan Azure Marketplace 이미지 계획입니다. 계획 ID(이름), 제품 이미지 또는 제안(제품) 및 게시자 ID(게시자)를 포함합니다. 2018-10-01
timestamp.createdOn 서명된 문서가 작성된 시점의 UTC 타임스탬프입니다. 2018-20-01
timestamp.expiresOn 서명된 문서가 만료되는 시점의 UTC 타임스탬프입니다. 2018-10-01
vmId VM의 고유 식별자 2018-10-01
subscriptionId Virtual Machine에 대한 Azure 구독 2019-04-30
sku VM 이미지에 대한 특정 SKU(인스턴스 메타데이터 엔드포인트[/metadata/instance]의 compute/sku 속성과 관련됨) 2019-11-01

참고 항목

클래식(비 Azure Resource Manager) VM의 경우 vmId만 채워집니다.

예제 문서:

{
   "nonce":"20201130-211924",
   "plan":{
      "name":"planName",
      "product":"planProduct",
      "publisher":"planPublisher"
   },
   "sku":"Windows-Server-2012-R2-Datacenter",
   "subscriptionId":"8d10da13-8125-4ba9-a717-bf7490507b3d",
   "timeStamp":{
      "createdOn":"11/30/20 21:19:19 -0000",
      "expiresOn":"11/30/20 21:19:24 -0000"
   },
   "vmId":"02aab8a4-74ef-476e-8182-f6d2ba4166a6"
}

서명 유효성 검사 지침

서명의 유효성을 검사할 때 서명이 Azure의 인증서를 사용하여 만들어졌는지 확인해야 합니다. 이 작업은 인증서 SAN(주체 대체 이름)의 유효성을 검사하여 수행됩니다.

SAN DNS Name=eastus.metadata.azure.com, DNS Name=metadata.azure.com 예제

참고 항목

퍼블릭 클라우드 및 각 소버린 클라우드의 인증서는 서로 다릅니다.

클라우드 SAN의 도메인
일반 공급되는 모든 글로벌 Azure 지역 *.metadata.azure.com
Azure Government *.metadata.azure.us
21Vianet에서 운영하는 Azure *.metadata.azure.cn
Azure 독일 *.metadata.microsoftazure.de

참고 항목

인증서가 도메인과 정확히 일치하지 않을 수 있습니다. 이러한 이유로 인증 유효성 검사는 모든 하위 도메인을 허용해야 합니다(예: 퍼블릭 클라우드 일반 공급 지역에서는 *.metadata.azure.com 허용).

중간 인증서에는 인증서 고정을 권장하지 않습니다. 자세한 지침은 인증서 고정 - 인증서 고정 및 Azure 서비스를 참조하세요. Azure Instance Metadata Service는 향후 인증 기관 변경에 대한 알림을 제공하지 않습니다. 대신 향후 모든 업데이트에 대해서는 중앙 집중식 Azure 인증 기관 세부 정보 문서를 따라야 합니다.

샘플 1: VM이 Azure에서 실행되는지 확인

Azure Marketplace의 공급업체는 자체 소프트웨어가 Azure에서만 실행되도록 사용이 허가되었는지 확인하려고 합니다. 누군가가 VHD를 온-프레미스 환경에 복사하는 경우 공급업체에서 이를 검색할 수 있어야 합니다. IMDS를 통해 이러한 공급업체는 Azure의 응답만 보장하는 서명된 데이터를 가져올 수 있습니다.

참고 항목

이 샘플을 사용하려면 jq 유틸리티를 설치해야 합니다.

유효성 검사

# Get the signature
$attestedDoc = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri http://169.254.169.254/metadata/attested/document?api-version=2020-09-01
# Decode the signature
$signature = [System.Convert]::FromBase64String($attestedDoc.signature)

서명이 Microsoft Azure에서 제공된 것인지 확인하고, 인증서 체인에서 오류를 확인합니다.

# Get certificate chain
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]($signature)
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
# Print the Subject of each certificate in the chain
foreach($element in $chain.ChainElements)
{
    Write-Host $element.Certificate.Subject
}

# Get the content of the signed document
Add-Type -AssemblyName System.Security
$signedCms = New-Object -TypeName System.Security.Cryptography.Pkcs.SignedCms
$signedCms.Decode($signature);
$content = [System.Text.Encoding]::UTF8.GetString($signedCms.ContentInfo.Content)
Write-Host "Attested data: " $content
$json = $content | ConvertFrom-Json
# Do additional validation here

초기 요청에서 nonce 매개 변수를 제공한 경우 서명된 문서의 nonce를 비교할 수 있습니다.

관리 ID

시스템이 할당한 관리 ID는 VM에서 사용하도록 설정할 수 있습니다. 하나 이상의 사용자가 할당한 관리 ID를 VM에 할당할 수도 있습니다. 그런 다음, IMDS에서 관리 ID에 대한 토큰을 요청할 수 있습니다. 이러한 토큰을 사용하여 Azure Key Vault와 같은 다른 Azure 서비스를 인증합니다.

이 기능을 사용하도록 설정하는 자세한 단계는 액세스 토큰 획득을 참조하세요.

Load Balancer 메타데이터

Azure 표준 Load Balancer 내부에 가상 머신 또는 가상 머신 집합 인스턴스를 배치하는 경우 IMDS를 사용하여 부하 분산 장치 및 인스턴스와 관련된 메타데이터를 검색할 수 있습니다. 자세한 내용은 부하 분산 장치 정보 검색을 참조하세요.

예약된 이벤트

IMDS를 사용하여 예약된 이벤트의 상태를 가져올 수 있습니다. 그런 다음, 사용자는 이러한 이벤트에 대해 실행할 작업 세트를 지정할 수 있습니다. 자세한 내용은 Linux의 예약된 이벤트 또는 Windows의 예약된 이벤트를 참조하세요.

다양한 언어의 샘플 코드

다음 표에는 VM 내에서 다른 언어를 사용하여 IMDS를 호출하는 샘플이 나와 있습니다.

언어 예시
Bash https://github.com/Microsoft/azureimds/blob/master/IMDSSample.sh
C# https://github.com/Microsoft/azureimds/blob/master/IMDSSample.cs
Go https://github.com/Microsoft/azureimds/blob/master/imdssample.go
Java https://github.com/Microsoft/azureimds/blob/master/imdssample.java
NodeJS https://github.com/Microsoft/azureimds/blob/master/IMDSSample.js
Perl https://github.com/Microsoft/azureimds/blob/master/IMDSSample.pl
PowerShell https://github.com/Microsoft/azureimds/blob/master/IMDSSample.ps1
Puppet https://github.com/keirans/azuremetadata
Python https://github.com/Microsoft/azureimds/blob/master/IMDSSample.py
Ruby https://github.com/Microsoft/azureimds/blob/master/IMDSSample.rb

오류 및 디버깅

찾을 수 없는 데이터 요소 또는 형식이 잘못된 요청이 있으면 Instance Metadata Service는 표준 HTTP 오류를 반환합니다. 예시:

HTTP 상태 코드 원인
200 OK 요청에 성공했습니다.
400 Bad Request 리프 노드를 쿼리할 때 Metadata: true 헤더 또는 format=json 매개 변수가 없습니다.
404 Not Found 요청된 요소가 없음
405 Method Not Allowed HTTP 메서드(동사)는 엔드포인트에서 지원되지 않습니다.
410 Gone 최대 70초 후 다시 시도
429 Too Many Requests API 속도 한도를 초과했습니다.
500 Service Error 잠시 후 다시 시도하세요.

자주 묻는 질문

  • 400 Bad Request, Required metadata header not specified 오류가 발생했습니다. 무슨 의미인가요?

    • IMDS를 사용하려면 Metadata: true 헤더를 요청에 전달해야 합니다. REST 호출에서 이 헤더를 전달하면 IMDS에 액세스할 수 있습니다.
  • VM에 대한 컴퓨팅 정보를 받지 못하는 이유는 무엇인가요?

    • 현재 IMDS는 Azure Resource Manager를 사용하여 만든 인스턴스만 지원합니다.
  • 최근에 Azure Resource Manager를 통해 VM을 만들었습니다. 컴퓨팅 메타데이터 정보가 왜 표시되지 않나요?

    • 2016년 9월 이후에 VM을 만든 경우 태그를 추가하여 컴퓨팅 메타데이터 보기를 시작합니다. 2016년 9월 이전에 VM을 만든 경우 VM 인스턴스에서 확장 또는 데이터 디스크를 추가하거나 제거하여 메타데이터를 새로 고칩니다.
  • 사용자 데이터는 사용자 지정 데이터와 동일한가요?

    • 사용자 데이터는 사용자 지정 데이터와 유사한 기능을 제공하여 VM 인스턴스에 사용자의 메타데이터를 전달할 수 있도록 합니다. 차이점은, 사용자 데이터는 IMDS를 통해 검색되며 VM 인스턴스의 수명 전체에 걸쳐 유지된다는 점입니다. 기존의 사용자 지정 데이터 기능은 이 문서에 설명된 대로 계속 작동합니다. 그러나 IMDS를 통해서가 아니라 로컬 시스템 폴더를 통해서만 사용자 지정 데이터를 가져올 수 있습니다.
  • 새 버전의 모든 데이터가 채워지지 않는 이유는 무엇인가요?

    • 2016년 9월 이후에 VM을 만든 경우 태그를 추가하여 컴퓨팅 메타데이터 보기를 시작합니다. 2016년 9월 이전에 VM을 만든 경우 VM 인스턴스에서 확장 또는 데이터 디스크를 추가하거나 제거하여 메타데이터를 새로 고칩니다.
  • 500 Internal Server Error 또는 410 Resource Gone 오류가 발생하는 이유는 무엇인가요?

    • 요청을 다시 시도하십시오. 자세한 내용은 일시적인 오류 처리를 참조하세요. 문제가 지속되면 Azure Portal에서 VM에 대한 지원 문제를 만듭니다.
  • 확장 집합 인스턴스에서 작동하나요?

    • 예, IMDS는 확장 집합 인스턴스에 사용할 수 있습니다.
  • 내 확장 집합에서 내 태그를 업데이트했지만 단일 인스턴스 VM과 달리 인스턴스에 표시되지 않습니다. 내가 무엇인가 잘못했나요?

    • 현재 확장 집합에 대한 태그는 재부팅, 이미지로 다시 설치 또는 인스턴스에 대한 디스크 변경 시에만 VM에 표시됩니다.
  • instance/compute 세부 정보에서 내 VM에 대한 SKU 정보가 표시되지 않는 이유는 무엇인가요?

    • Azure Marketplace에서 만든 사용자 지정 이미지의 경우 Azure 플랫폼은 사용자 지정 이미지에 대한 SKU 정보 및 사용자 지정 이미지에서 만든 모든 VM에 대한 세부 정보를 유지하지 않습니다. 이는 의도적으로 설계된 것이므로 VM instance/compute 세부 정보에 표시되지 않습니다.
  • 서비스에 대한 내 요청의 시간이 초과되거나 연결에 실패한 이유는 무엇인가요?

    • 메타데이터 호출은 VM의 기본 네트워크 카드에 할당된 기본 IP 주소에서 수행해야 합니다. 또한 경로를 변경한 경우 169.254.169.254/32 주소에 대한 경로가 VM의 로컬 라우팅 테이블에 있어야 합니다.

      1. 로컬 라우팅 테이블을 덤프하고 IMDS 항목을 찾습니다. 예시:

        route print
        
        IPv4 Route Table
        ===========================================================================
        Active Routes:
        Network Destination        Netmask          Gateway       Interface  Metric
                0.0.0.0          0.0.0.0      172.16.69.1      172.16.69.7     10
                127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
                127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
        127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
            168.63.129.16  255.255.255.255      172.16.69.1      172.16.69.7     11
        169.254.169.254  255.255.255.255      172.16.69.1      172.16.69.7     11
        ... (continues) ...
        
      2. 169.254.169.254에 대한 경로가 있는지 확인하고, 해당 네트워크 인터페이스(예: 172.16.69.7)를 확인합니다.

      3. 인터페이스 구성을 덤프하고, MAC(물리적) 주소를 확인하여 라우팅 테이블에서 참조된 항목에 해당하는 인터페이스를 찾습니다.

        ipconfig /all
        
        ... (continues) ...
        Ethernet adapter Ethernet:
        
        Connection-specific DNS Suffix  . : xic3mnxjiefupcwr1mcs1rjiqa.cx.internal.cloudapp.net
        Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter
        Physical Address. . . . . . . . . : 00-0D-3A-E5-1C-C0
        DHCP Enabled. . . . . . . . . . . : Yes
        Autoconfiguration Enabled . . . . : Yes
        Link-local IPv6 Address . . . . . : fe80::3166:ce5a:2bd5:a6d1%3(Preferred)
        IPv4 Address. . . . . . . . . . . : 172.16.69.7(Preferred)
        Subnet Mask . . . . . . . . . . . : 255.255.255.0
        ... (continues) ...
        
      4. 인터페이스가 VM의 기본 NIC 및 기본 IP에 해당하는지 확인합니다. 기본 NIC 및 IP는 Azure Portal에서 네트워크 구성을 확인하거나 Azure CLI를 통해 조회하여 확인할 수 있습니다. 개인 IP(및 CLI를 사용하는 경우 MAC 주소)를 확인합니다. PowerShell CLI 예제는 다음과 같습니다.

        $ResourceGroup = '<Resource_Group>'
        $VmName = '<VM_Name>'
        $NicNames = az vm nic list --resource-group $ResourceGroup --vm-name $VmName | ConvertFrom-Json | Foreach-Object { $_.id.Split('/')[-1] }
        foreach($NicName in $NicNames)
        {
            $Nic = az vm nic show --resource-group $ResourceGroup --vm-name $VmName --nic $NicName | ConvertFrom-Json
            Write-Host $NicName, $Nic.primary, $Nic.macAddress
        }
        
        wintest767 True 00-0D-3A-E5-1C-C0
        
      5. 일치하지 않는 경우 기본 NIC 및 IP가 대상으로 지정되도록 라우팅 테이블을 업데이트합니다.


  • Windows Server의 장애 조치(failover) 클러스터링

    • 장애 조치(failover) 클러스터링을 사용하여 IMDS를 쿼리하는 경우 경로를 라우팅 테이블에 추가해야 하는 경우가 있습니다. 이 경우 가능한 방법은 다음과 같습니다.

      1. 관리자 권한으로 명령 프롬프트를 엽니다.

      2. 다음 명령을 실행하고, IPv4 라우팅 테이블의 네트워크 대상 인터페이스(0.0.0.0) 주소를 확인합니다.

      route print
      

      참고 항목

      다음 예제 출력은 장애 조치(failover) 클러스터가 사용하도록 설정된 Windows Server VM에서 제공한 것입니다. 간단히 하기 위해 출력에는 IPv4 라우팅 테이블만 포함되었습니다.

      IPv4 Route Table
      ===========================================================================
      Active Routes:
      Network Destination        Netmask          Gateway       Interface  Metric
              0.0.0.0          0.0.0.0         10.0.1.1        10.0.1.10    266
              10.0.1.0  255.255.255.192         On-link         10.0.1.10    266
              10.0.1.10  255.255.255.255         On-link         10.0.1.10    266
              10.0.1.15  255.255.255.255         On-link         10.0.1.10    266
              10.0.1.63  255.255.255.255         On-link         10.0.1.10    266
              127.0.0.0        255.0.0.0         On-link         127.0.0.1    331
              127.0.0.1  255.255.255.255         On-link         127.0.0.1    331
      127.255.255.255  255.255.255.255         On-link         127.0.0.1    331
          169.254.0.0      255.255.0.0         On-link     169.254.1.156    271
          169.254.1.156  255.255.255.255         On-link     169.254.1.156    271
      169.254.255.255  255.255.255.255         On-link     169.254.1.156    271
              224.0.0.0        240.0.0.0         On-link         127.0.0.1    331
              224.0.0.0        240.0.0.0         On-link     169.254.1.156    271
      255.255.255.255  255.255.255.255         On-link         127.0.0.1    331
      255.255.255.255  255.255.255.255         On-link     169.254.1.156    271
      255.255.255.255  255.255.255.255         On-link         10.0.1.10    266
      

      다음 명령을 실행하고, 네트워크 대상의 인터페이스 주소(0.0.0.0)를 사용합니다(이 예제에서는 10.0.1.10).

      route add 169.254.169.254/32 10.0.1.10 metric 1 -p
      

지원

여러 번 시도한 후에도 메타데이터 응답을 받을 수 없는 경우 Azure Portal에서 지원 문제를 만들 수 있습니다.

제품 피드백

여기의 Virtual Machines > Instance Metadata Service 아래에서 제품 피드백 및 아이디어를 사용자 피드백 채널에 제공할 수 있습니다.

다음 단계