Azure Instance Metadata Service

Aplica-se a: ✔️ VMs do Windows VMs ✔️ do Linux Conjuntos ✔️ de dimensionamento flexíveis

O Azure Instance Metadata Service (IMDS) disponibiliza informações sobre as instâncias de máquinas virtuais atualmente em execução. Pode utilizá-lo para gerir e configurar as suas máquinas virtuais. Estas informações incluem o SKU, o armazenamento, as configurações de rede e os eventos de manutenção futuros. Para obter uma lista completa dos dados disponíveis, veja o Resumo das Categorias de Pontos Finais.

O IMDS está disponível para executar instâncias de máquinas virtuais (VMs) e instâncias de conjuntos de dimensionamento. Todos os pontos finais suportam VMs criadas e geridas com o Azure Resource Manager. Apenas a categoria Atestado e a parte de Rede da categoria Instância suportam VMs criadas com o modelo de implementação clássica. O ponto final Atestado só o faz numa extensão limitada.

O IMDS é uma API REST que está disponível num endereço IP bem conhecido e não encaminhável (169.254.169.254). Só é possível aceder ao mesmo a partir da VM. A comunicação entre a VM e o IMDS nunca sai do anfitrião. Peça aos clientes HTTP que ignorem os proxies Web na VM ao consultar o IMDS e tratem 169.254.169.254 o mesmo que 168.63.129.16.

Utilização

Aceder ao Serviço de Metadados do Azure Instance

Para aceder ao IMDS, crie uma VM a partir do Azure Resource Manager ou do portal do Azure e utilize os exemplos seguintes. Para obter mais exemplos, veja Exemplos de Metadados da Instância do Azure.

Eis o código de exemplo para obter todos os metadados de uma instância. Para aceder a uma origem de dados específica, veja Categorias de Ponto Final para obter uma descrição geral de todas as funcionalidades disponíveis.

Pedir

Importante

Este exemplo ignora os proxies. Tem de ignorar proxies ao consultar o IMDS. Veja Proxies para obter informações adicionais.

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 requer o PowerShell V6 ou superior. Veja o nosso repositório de exemplos para obter exemplos com versões mais antigas do PowerShell.

Response

Nota

A resposta é uma cadeia JSON. A seguinte resposta de exemplo é bastante impressa para legibilidade.

{
    "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"
            },
            "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"
        }]
    }
}

Segurança e autenticação

O Serviço de Metadados de Instância só está acessível a partir de uma instância de máquina virtual em execução num endereço IP não encaminhável. As VMs só podem interagir com os seus próprios metadados/funcionalidades. A API é apenas HTTP e nunca sai do anfitrião.

Para garantir que os pedidos se destinam diretamente ao IMDS e impedir o redirecionamento indesejado ou indesejado de pedidos, os pedidos:

  • Tem de conter o cabeçalho Metadata: true
  • Não pode conter um X-Forwarded-For cabeçalho

Qualquer pedido que não cumpra ambos os requisitos é rejeitado pelo serviço.

Importante

O IMDS não é um canal para dados confidenciais. A API não está autenticada e está aberta a todos os processos na VM. As informações expostas através deste serviço devem ser consideradas informações partilhadas para todas as aplicações em execução dentro da VM.

Se não for necessário que todos os processos na VM acedam ao ponto final do IMDS, pode definir regras de firewall locais para limitar o acesso. Por exemplo, se apenas um serviço de sistema conhecido precisar de aceder ao serviço de metadados de instâncias, pode definir uma regra de firewall no ponto final IMDS, permitindo apenas o acesso a processos específicos ou a negação de acesso para o resto dos processos.

Proxies

O IMDS não se destina a ser utilizado por trás de um proxy e fazê-lo não é suportado. A maioria dos clientes HTTP fornece uma opção para desativar proxies nos seus pedidos e esta funcionalidade tem de ser utilizada ao comunicar com o IMDS. Consulte a documentação do cliente para obter detalhes.

Importante

Mesmo que não saiba de nenhuma configuração de proxy no seu ambiente, ainda tem de substituir quaisquer definições de proxy de cliente predefinidas. As configurações de proxy podem ser detetadas automaticamente e não ignorar essas configurações expõe-no a riscos de indisponibilidade caso a configuração da máquina seja alterada no futuro.

Rate limiting (Limitação de taxa)

Em geral, os pedidos ao IMDS estão limitados a 5 pedidos por segundo (por VM). Os pedidos que excedam este limiar serão rejeitados com respostas 429. Os pedidos para a categoria Identidade Gerida estão limitados a 20 pedidos por segundo e 5 pedidos simultâneos (por VM).

Verbos HTTP

Os seguintes verbos HTTP são atualmente suportados:

Verbo Description
GET Obter o recurso pedido

Parâmetros

Os pontos finais podem suportar os parâmetros obrigatórios e/ou opcionais. Veja Esquema e a documentação do ponto final específico em questão para obter detalhes.

Parâmetros de consulta

Os pontos finais IMDS suportam parâmetros de cadeia de consulta HTTP. Por exemplo:

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

Especifica os parâmetros:

Name Valor
api-version 2021-01-01
format json

Os pedidos com nomes de parâmetros de consulta duplicados serão rejeitados.

Parâmetros de rota

Para alguns pontos finais que devolvem blobs json maiores, suportamos parâmetros de rota de acréscimo para o ponto final do pedido para filtrar para um subconjunto da resposta:

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

Os parâmetros correspondem aos índices/chaves que seriam utilizados para descer o objeto json se estivesse a interagir com uma representação analisada.

Por exemplo, /metadata/instance devolve o objeto json:

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

Se quisermos filtrar a resposta apenas para a propriedade de computação, enviaríamos o pedido:

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

Da mesma forma, se quisermos filtrar para uma propriedade aninhada ou um elemento de matriz específico, continuamos a acrescentar chaves:

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

filtraria para o primeiro elemento a Network.interface partir da propriedade e devolveria:

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

Nota

Ao filtrar para um nó de folha, format=json não funciona. Para estas consultas format=text tem de ser especificada explicitamente, uma vez que o formato predefinido é json.

Esquema

Formato de dados

Por predefinição, o IMDS devolve dados no formato JSON (Content-Type: application/json). No entanto, os pontos finais que suportam a filtragem de respostas (veja Parâmetros de Rota) também suportam o formato text.

Para aceder a um formato de resposta não predefinido, especifique o formato pedido como um parâmetro de cadeia de consulta no pedido. Por exemplo:

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

Nas respostas json, todos os primitivos serão do tipo stringe os valores em falta ou inaplicáveis são sempre incluídos, mas serão definidos como uma cadeia vazia.

Controlo de versões

O IMDS tem uma versão e a especificação da versão da API no pedido HTTP é obrigatória. A única exceção a este requisito é o ponto final de versões , que pode ser utilizado para obter dinamicamente as versões de API disponíveis.

À medida que as versões mais recentes são adicionadas, as versões mais antigas ainda podem ser acedidas para compatibilidade se os scripts tiverem dependências em formatos de dados específicos.

Quando não especifica uma versão, obtém um erro com uma lista das versões suportadas mais recentes:

{
    "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"
    ]
}

Versões de API suportadas

  • 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

Está disponível uma definição completa do Swagger para IMDS em: https://github.com/Azure/azure-rest-api-specs/blob/main/specification/imds/data-plane/readme.md

Disponibilidade regional

O serviço está geralmente disponível em todas as clouds do Azure.

Ponto final de raiz

O ponto final de raiz é http://169.254.169.254/metadata.

Categorias de pontos finais

A API IMDS contém várias categorias de pontos finais que representam diferentes origens de dados, cada uma das quais contém um ou mais pontos finais. Veja cada categoria para obter detalhes.

Raiz da categoria Description Versão introduzida
/metadata/attested Ver Dados Atestados 2018-10-01
/metadata/identity Veja Identidade Gerida através do IMDS 2018-02-01
/metadata/instance Veja Metadados de Instância 2017-04-02
/metadata/loadbalancer Veja Obter metadados de Balanceador de Carga através do IMDS 2020-10-01
/metadata/scheduledevents Ver Eventos Agendados através do IMDS 2017-08-01
/metadata/versions Ver Versões N/D

Versões

Nota

Esta funcionalidade foi lançada juntamente com a versão 2020-10-01, que está atualmente a ser implementada e pode ainda não estar disponível em todas as regiões.

Listar versões da API

Devolve o conjunto de versões de API suportadas.

GET /metadata/versions

Parâmetros

Nenhum (este ponto final não estáversionado).

Resposta

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

Metadados de instância

Obter metadados de VM

Expõe os metadados importantes para a instância da VM, incluindo computação, rede e armazenamento.

GET /metadata/instance

Parâmetros

Name Obrigatório/Opcional Descrição
api-version Obrigatório A versão utilizada para atender o pedido.
format Opcional* O formato (json ou text) da resposta. *Nota: pode ser necessário ao utilizar parâmetros de pedido

Este ponto final suporta a filtragem de respostas através de parâmetros de rota.

Resposta

{
    "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"
            },
            "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"
        }]
    }
}

Discriminação do esquema:

Computação

Dados Description Versão introduzida
azEnvironment Ambiente do Azure onde a VM está em execução 2018-10-01
additionalCapabilities.hibernationEnabled Identifica se a hibernação está ativada na VM 2021-11-01
customData Esta funcionalidade foi preterida e desativada no IMDS. Foi substituído por userData 2019-02-01
evictionPolicy Define como uma VM spot será expulsa. 2020-12-01
extendedLocation.type Tipo da localização expandida da VM. 2021-03-01
extendedLocation.name Nome da localização expandida da VM 2021-03-01
host.id Nome do anfitrião da VM. Tenha em atenção que uma VM terá um anfitrião ou um hostGroup, mas não ambos. 2021-11-15
hostGroup.id Nome do hostGroup da VM. Tenha em atenção que uma VM terá um anfitrião ou um hostGroup, mas não ambos. 2021-11-15
isHostCompatibilityLayerVm Identifica se a VM é executada na Camada de Compatibilidade do Anfitrião 2020-06-01
licenseType Tipo de licença para Benefício Híbrido do Azure. Isto só está presente para VMs ativadas para AHB 2020-09-01
location Região do Azure em que a VM está em execução 2017-04-02
name Nome da VM 2017-04-02
offer Disponibilizar informações para a imagem da VM e só está presente para imagens implementadas a partir da galeria de imagens do Azure 2017-04-02
osProfile.adminUsername Especifica o nome da conta de administrador 2020-07-15
osProfile.computerName Especifica o nome do computador 2020-07-15
osProfile.disablePasswordAuthentication Especifica se a autenticação por palavra-passe está desativada. Isto só está presente para VMs do Linux 2020-10-01
osType Linux ou Windows 2017-04-02
placementGroupId Grupo de Colocação do conjunto de dimensionamento 2017-08-01
plan Plano que contém o nome, o produto e o publicador de uma VM se for uma Imagem de Azure Marketplace 2018-04-02
platformUpdateDomain Atualizar o domínio em que a VM está a ser executada 2017-04-02
platformFaultDomain Domínio de falha no qual a VM está em execução 2017-04-02
platformSubFaultDomain Sub domínio de falha em que a VM está em execução, se aplicável. 2021-10-01
priority Prioridade da VM. Veja VMs spot para obter mais informações 2020-12-01
provider Fornecedor da VM 2018-10-01
publicKeys Coleção de Chaves Públicas atribuída à VM e caminhos 2018-04-02
publisher Publicador da imagem da VM 2017-04-02
resourceGroupName Grupo de recursos para a máquina virtual 2017-08-01
resourceId O ID completamente qualificado do recurso 2019-03-11
sku SKU específico para a imagem da VM 2017-04-02
securityProfile.secureBootEnabled Identifica se o arranque seguro UEFI está ativado na VM 2020-06-01
securityProfile.virtualTpmEnabled Identifica se o Virtual Trusted Platform Module (TPM) está ativado na VM 2020-06-01
securityProfile.encryptionAtHost Identifica se a Encriptação no Anfitrião está ativada na VM 2021-11-01
securityProfile.securityType Identifica se a VM é uma VM Fidedigna ou uma VM Confidencial 2021-12-13
storageProfile Veja o Perfil de Armazenamento abaixo 2019-06-01
subscriptionId Subscrição do Azure para a Máquina Virtual 2017-08-01
tags Etiquetas para a máquina virtual 2017-08-01
tagsList Etiquetas formatadas como uma matriz JSON para análise programática mais fácil 2019-06-04
userData O conjunto de dados especificado quando a VM foi criada para utilização durante ou após o aprovisionamento (codificado em Base64) 2021-01-01
version Versão da imagem da VM 2017-04-02
virtualMachineScaleSet.id ID do Conjunto de Dimensionamento de Máquinas Virtuais criado com orquestração flexível em que a Máquina Virtual faz parte. Este campo não está disponível para Conjuntos de Dimensionamento de Máquinas Virtuais criados com orquestração uniforme. 2021-03-01
vmId Identificador exclusivo da VM. O blogue referenciava apenas fatos para VMs com SMBIOS < 2.6. Para VMs que têm SMBIOS >= 2.6, o UUID da DMI é apresentado em formato pouco endiano, pelo que não é necessário mudar de bytes. 2017-04-02
vmScaleSetName Nome do Conjunto de Dimensionamento de Máquinas Virtuais do conjunto de dimensionamento 2017-12-01
vmSize Tamanho da VM 2017-04-02
zone Zona de Disponibilidade da máquina virtual 2017-12-01

† Esta versão ainda não está totalmente disponível e poderá não ser suportada em todas as regiões.

Perfil de armazenamento

O perfil de armazenamento de uma VM está dividido em três categorias: referência de imagem, disco do SO e discos de dados, além de um objeto adicional para o disco temporário local.

O objeto de referência de imagem contém as seguintes informações sobre a imagem do SO:

Dados Description
id ID do Recurso
offer Oferta da imagem da plataforma ou do marketplace
publisher Publicador de imagens
sku SKU da imagem
version Versão da imagem da plataforma ou do marketplace

O objeto de disco do SO contém as seguintes informações sobre o disco do SO utilizado pela VM:

Dados Description
caching Requisitos de colocação em cache
createOption Informações sobre como a VM foi criada
diffDiskSettings Definições de disco efémero
diskSizeGB Tamanho do disco em GB
image Disco rígido virtual da imagem do utilizador de origem
managedDisk Parâmetros de disco gerido
name Nome do disco
vhd Disco rígido virtual
writeAcceleratorEnabled Se writeAccelerator está ou não ativado no disco

A matriz de discos de dados contém uma lista de discos de dados anexados à VM. Cada objeto de disco de dados contém as seguintes informações:

Dados Description Versão introduzida
bytesPerSecondThrottle* Quota de leitura/escrita do disco em bytes 2021-05-01
caching Requisitos de colocação em cache 2019-06-01
createOption Informações sobre como a VM foi criada 2019-06-01
diffDiskSettings Definições de disco efémero 2019-06-01
diskCapacityBytes* Tamanho do disco em bytes 2021-05-01
diskSizeGB Tamanho do disco em GB 2019-06-01
encryptionSettings Definições de encriptação para o disco 2019-06-01
image Disco rígido virtual da imagem do utilizador de origem 2019-06-01
isSharedDisk†† Identifica se o disco é partilhado entre recursos 2021-05-01
isUltraDisk Identifica se o disco de dados é um Disco Ultra 2021-05-01
lun Número de unidade lógica do disco 2019-06-01
managedDisk Parâmetros de disco gerido 2019-06-01
name Nome do disco 2019-06-01
opsPerSecondThrottle* Quota de leitura/escrita do disco em IOPS 2021-05-01
osType Tipo de SO incluído no disco 2019-06-01
vhd Disco rígido virtual 2019-06-01
writeAcceleratorEnabled Se writeAccelerator está ou não ativado no disco 2019-06-01

†† Estes campos só são preenchidos para Discos Ultra; são cadeias vazias de discos não Ultra.

O blob de definições de encriptação contém dados sobre como o disco é encriptado (se estiver encriptado):

Dados Description Versão introduzida
diskEncryptionKey.sourceVault.id A localização da chave de encriptação do disco 2021-11-01
diskEncryptionKey.secretUrl A localização do segredo 2021-11-01
keyEncryptionKey.sourceVault.id A localização da chave de encriptação da chave 2021-11-01
keyEncryptionKey.keyUrl A localização da chave 2021-11-01

O objeto de disco de recurso contém o tamanho do Disco Temporário Local anexado à VM, se tiver um, em quilobytes. Se não existir nenhum disco temporário local para a VM, este valor é 0.

Dados Description Versão introduzida
resourceDisk.size Tamanho do disco temporário local para a VM (em kB) 2021-02-01

Rede

Dados Description Versão introduzida
ipv4.privateIpAddress Endereço IPv4 local da VM 2017-04-02
ipv4.publicIpAddress Endereço IPv4 público da VM 2017-04-02
subnet.address Endereço da sub-rede da VM 2017-04-02
subnet.prefix Prefixo de sub-rede, exemplo 24 2017-04-02
ipv6.ipAddress Endereço IPv6 local da VM 2017-04-02
macAddress Endereço mac da VM 2017-04-02

Nota

As nics devolvidas pela chamada de rede não estão garantidas por ordem.

Obter dados de utilizador

Ao criar uma nova VM, pode especificar um conjunto de dados a utilizar durante ou após o aprovisionamento da VM e obtê-lo através do IMDS. Veja a experiência de dados do utilizador ponto a ponto aqui.

Para configurar os dados do utilizador, utilize o modelo de início rápido aqui. O exemplo abaixo mostra como obter estes dados através do IMDS. Esta funcionalidade é lançada com versão e versão 2021-01-01 superior.

Nota

Aviso de segurança: o IMDS está aberto a todas as aplicações na VM. Os dados confidenciais não devem ser colocados nos dados do utilizador.

$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))

Exemplo 1: Controlar a VM em execução no Azure

Enquanto fornecedor de serviços, poderá ter de controlar o número de VMs que executam o software ou ter agentes que precisam de controlar a exclusividade da VM. Para obter um ID exclusivo para uma VM, utilize o campo do vmId Instance Metadata Service.

Pedir

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

Exemplo 2: Colocação de réplicas de dados diferentes

Para determinados cenários, a colocação de réplicas de dados diferentes é de importância privilegiada. Por exemplo, a colocação de réplicas do HDFS ou o posicionamento do contentor através de um orquestrador poderá exigir que saiba o platformFaultDomain e platformUpdateDomain a VM está em execução. Também pode utilizar Zonas de Disponibilidade para as instâncias tomarem estas decisões. Pode consultar estes dados diretamente através do IMDS.

Pedir

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

Exemplo 3: Obter etiquetas de VM

As etiquetas de VM estão incluídas na API de instância no ponto final de instância/computação/etiquetas. As etiquetas podem ter sido aplicadas à sua VM do Azure para organizá-las logicamente numa taxonomia. As etiquetas atribuídas a uma VM podem ser obtidas com o pedido abaixo.

Pedir

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

O tags campo é uma cadeia com as etiquetas delimitadas por ponto e vírgula. Este resultado pode ser um problema se forem utilizados pontos e vírgulas nas próprias etiquetas. Se um analisador for escrito para extrair programaticamente as etiquetas, deve confiar no tagsList campo . O tagsList campo é uma matriz JSON sem delimitadores e, consequentemente, mais fácil de analisar. A tagsList atribuída a uma VM pode ser obtida com o pedido abaixo.

Pedir

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
}

Exemplo 4: Obter mais informações sobre a VM durante o pedido de suporte

Enquanto fornecedor de serviços, poderá receber uma chamada de suporte onde gostaria de saber mais informações sobre a VM. Pedir ao cliente para partilhar os metadados de computação pode fornecer informações básicas para o profissional de suporte saber sobre o tipo de VM no Azure.

Pedir

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

Response

Nota

A resposta é uma cadeia JSON. A seguinte resposta de exemplo é bastante impressa para legibilidade.

{
    "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"
        },
        "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": ""
}

Exemplo 5: Obter o Ambiente do Azure onde a VM está em execução

O Azure tem várias clouds soberanas, como Azure Government. Por vezes, precisa do Ambiente do Azure para tomar algumas decisões de runtime. O exemplo seguinte mostra-lhe como pode alcançar este comportamento.

Pedir

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

A cloud e os valores do ambiente do Azure estão listados aqui.

Cloud Ambiente do Azure
Todas as regiões globais do Azure disponíveis geralmente AzurePublicCloud
Azure Government AzureUSGovernmentCloud
Azure China 21Vianet AzureChinaCloud
Azure Alemanha AzureGermanCloud

Exemplo 6: Obter informações de rede

Pedir

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"
    }
  ]
}

Exemplo 7: Obter o endereço IP público

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"

Nota

Dados atestados

Obter dados atestados

O IMDS ajuda a fornecer garantias de que os dados fornecidos provêm do Azure. A Microsoft assina parte destas informações, pelo que pode confirmar que uma imagem no Azure Marketplace é a que está a executar no Azure.

GET /metadata/attested/document

Parâmetros

Name Obrigatório/Opcional Descrição
api-version Obrigatório A versão utilizada para atender o pedido.
nonce Opcional Uma cadeia de 10 dígitos que serve como um nonce criptográfico. Se não for fornecido nenhum valor, o IMDS utiliza o carimbo de data/hora UTC atual.

Resposta

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

O blob de assinaturas é uma versão do documento assinada por pkcs7. Contém o certificado utilizado para assinar juntamente com determinados detalhes específicos da VM.

Para VMs criadas com o Azure Resource Manager, o documento inclui vmId, sku, nonce, , subscriptionIdpara timeStamp criação e expiração do documento e as informações do plano sobre a imagem. As informações do plano só são preenchidas para Azure Marketplace imagens.

Para VMs criadas com o modelo de implementação clássica, apenas as vmId e subscriptionId têm a garantia de ser preenchidas. Pode extrair o certificado da resposta e utilizá-lo para confirmar que a resposta é válida e vem do Azure.

O documento descodificado contém os seguintes campos:

Dados Description Versão introduzida
licenseType Tipo de licença para Benefício Híbrido do Azure. Isto só está presente para VMs ativadas por AHB. 2020-09-01
nonce Uma cadeia que pode ser fornecida opcionalmente com o pedido. Se não nonce tiver sido fornecido, é utilizado o carimbo de data/hora da Hora Universal Coordenada atual. 2018-10-01
plan O plano imagem do Azure Marketplace. Contém o ID do plano (nome), a imagem ou oferta do produto (produto) e o ID do publicador (publicador). 2018-10-01
timestamp.createdOn O carimbo de data/hora UTC para quando o documento assinado foi criado 2018-20-01
timestamp.expiresOn O carimbo de data/hora UTC para quando o documento assinado expirar 2018-10-01
vmId Identificador exclusivo da VM 2018-10-01
subscriptionId Subscrição do Azure para a Máquina Virtual 2019-04-30
sku SKU específico para a imagem da VM (correlaciona com a compute/sku propriedade do ponto final de Metadados de Instância [/metadata/instance]) 2019-11-01

Nota

Para VMs Clássicas (não Azure Resource Manager), apenas o vmId é garantido para ser preenchido.

Documento de exemplo:

{
   "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"
}

Exemplo 1: Validar que a VM está em execução no Azure

Os fornecedores no Azure Marketplace querem garantir que o software está licenciado para ser executado apenas no Azure. Se alguém copiar o VHD para um ambiente no local, o fornecedor tem de conseguir detetá-lo. Através do IMDS, estes fornecedores podem obter dados assinados que garantem apenas a resposta do Azure.

Nota

Este exemplo requer que o utilitário jq seja instalado.

Validação

# 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)

Verifique se a assinatura é do Microsoft Azure e verifica se existem erros na cadeia de certificados.

# 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

O nonce no documento assinado pode ser comparado se tiver fornecido um nonce parâmetro no pedido inicial.

Nota

O certificado para a cloud pública e cada cloud soberana será diferente.

Cloud Certificado
Todas as regiões globais do Azure disponíveis geralmente *.metadata.azure.com
Azure Government *.metadata.azure.us
Azure China 21Vianet *.metadata.azure.cn
Azure Alemanha *.metadata.microsoftazure.de

Nota

Os certificados podem não ter uma correspondência exata de metadata.azure.com para a cloud pública. Por este motivo, a validação da certificação deve permitir um nome comum a partir de qualquer .metadata.azure.com subdomínio.

Nos casos em que não é possível transferir o certificado intermédio devido a restrições de rede durante a validação, pode afixar o certificado intermédio. O Azure implementa os certificados, o que é uma prática PKI padrão. Tem de atualizar os certificados afixados quando ocorre o rollover. Sempre que estiver planeada uma alteração para atualizar o certificado intermédio, o blogue do Azure é atualizado e os clientes do Azure são notificados.

Pode encontrar os certificados intermédios nesta página. Os certificados intermédios para cada uma das regiões podem ser diferentes.

Nota

O certificado intermédio para o Azure China 21Vianet será da DigiCert Global Root CA, em vez de Baltimore. Se afixou os certificados intermédios para o Azure China como parte de uma alteração da autoridade de cadeia de raiz, os certificados intermédios têm de ser atualizados.

Nota

A partir de fevereiro de 2022, os nossos certificados de Dados Atestados serão afetados por uma alteração do TLS. Devido a isso, a AC de raiz mudará de Baltimore CyberTrust para DigiCert Global G2 apenas para clouds públicas e do Governo dos EUA. Se tiver o certificado Baltimore CyberTrust ou outros certificados intermédios listados nesta mensagem afixados, siga as instruções indicadas imediatamente para evitar quaisquer interrupções da utilização do ponto final Dados Atestados.

Identidade gerida

Uma identidade gerida, atribuída pelo sistema, pode ser ativada na VM. Também pode atribuir uma ou mais identidades geridas atribuídas pelo utilizador à VM. Em seguida, pode pedir tokens para identidades geridas do IMDS. Utilize estes tokens para se autenticar com outros serviços do Azure, como o Azure Key Vault.

Para obter passos detalhados para ativar esta funcionalidade, veja Adquirir um token de acesso.

Metadados do Balanceador de Carga

Quando coloca instâncias de máquina virtual ou de conjunto de máquinas virtuais atrás de um Balanceador de Carga Standard do Azure, pode utilizar o IMDS para obter metadados relacionados com o balanceador de carga e as instâncias. Para obter mais informações, veja Obter informações do balanceador de carga.

Eventos agendados

Pode obter o estado dos eventos agendados com o IMDS. Em seguida, o utilizador pode especificar um conjunto de ações a executar nestes eventos. Para obter mais informações, veja Scheduled events for Linux or Scheduled events for Windows (Eventos agendados para o Linux ou Eventos agendados para o Windows).

Código de exemplo em idiomas diferentes

A tabela seguinte lista exemplos de IMDS de chamada através de idiomas diferentes dentro da VM:

Linguagem Exemplo
Bash https://github.com/Microsoft/azureimds/blob/master/IMDSSample.sh
C# https://github.com/Microsoft/azureimds/blob/master/IMDSSample.cs
Ir 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

Erros e depuração

Se não for encontrado um elemento de dados ou um pedido com formato incorreto, o Instance Metadata Service devolve erros HTTP padrão. Por exemplo:

Código de estado de HTTP Razão
200 OK O pedido foi efetuado com êxito.
400 Bad Request Cabeçalho em falta Metadata: true ou parâmetro format=json em falta ao consultar um nó de folha
404 Not Found O elemento pedido não existe
405 Method Not Allowed O método HTTP (verbo) não é suportado no ponto final.
410 Gone Repetir após algum tempo durante um máximo de 70 segundos
429 Too Many Requests Os Limites da Taxa de API foram excedidos
500 Service Error Tentar novamente após algum tempo

Perguntas mais frequentes

  • Estou a receber o erro 400 Bad Request, Required metadata header not specified. O que é que isto quer dizer?

    • O IMDS requer que o cabeçalho Metadata: true seja transmitido no pedido. Transmitir este cabeçalho na chamada REST permite o acesso ao IMDS.
  • Por que motivo não estou a obter informações de computação para a minha VM?

    • Atualmente, o IMDS só suporta instâncias criadas com o Azure Resource Manager.
  • Criei a minha VM através do Azure Resource Manager há algum tempo. Por que motivo não estou a ver informações de metadados de computação?

    • Se tiver criado a VM depois de setembro de 2016, adicione uma etiqueta para começar a ver metadados de computação. Se tiver criado a VM antes de setembro de 2016, adicione ou remova extensões ou discos de dados à instância da VM para atualizar metadados.
  • Os dados de utilizador são os mesmos que os dados personalizados?

    • Os dados de utilizador oferecem uma funcionalidade semelhante aos dados personalizados, permitindo-lhe transmitir os seus próprios metadados para a instância da VM. A diferença é que os dados do utilizador são obtidos através do IMDS e são persistentes ao longo da duração da instância da VM. A funcionalidade de dados personalizados existente continuará a funcionar conforme descrito neste artigo. No entanto, só pode obter dados personalizados através da pasta do sistema local, não através do IMDS.
  • Por que motivo não vejo todos os dados preenchidos para uma nova versão?

    • Se tiver criado a VM depois de setembro de 2016, adicione uma etiqueta para começar a ver metadados de computação. Se tiver criado a VM antes de setembro de 2016, adicione ou remova extensões ou discos de dados à instância da VM para atualizar metadados.
  • Por que motivo estou a receber o erro 500 Internal Server Error ou 410 Resource Gone?

  • Isto funcionaria para instâncias de conjuntos de dimensionamento?

    • Sim, o IMDS está disponível para instâncias de conjuntos de dimensionamento.
  • Atualizei as minhas etiquetas nos meus conjuntos de dimensionamento, mas não aparecem nas instâncias (ao contrário das VMs de instância única). Estou a fazer algo de errado?

    • Atualmente, as etiquetas para conjuntos de dimensionamento só são apresentadas à VM numa alteração de reinício, imagem ou disco para a instância.
  • Por que motivo não estou a ver as informações do SKU da minha VM em instance/compute detalhes?

    • Para imagens personalizadas criadas a partir de Azure Marketplace, a plataforma do Azure não retém as informações de SKU da imagem personalizada e os detalhes de quaisquer VMs criadas a partir da imagem personalizada. Isto é por predefinição e, portanto, não é apresentado nos detalhes da VM instance/compute .
  • Porque é que o meu pedido excedeu o limite de tempo para a minha chamada para o serviço?

    • As chamadas de metadados têm de ser efetuadas a partir do endereço IP primário atribuído à placa de rede principal da VM. Além disso, se tiver alterado as rotas, tem de existir uma rota para o endereço 169.254.169.254/32 na tabela de encaminhamento local da VM.

      1. Despeje a tabela de encaminhamento local e procure a entrada IMDS. Por exemplo:
        > 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. Verifique se existe uma rota para 169.254.169.254e anote a interface de rede correspondente (por exemplo, 172.16.69.7).
      3. Despeje a configuração da interface e localize a interface que corresponde à referenciada na tabela de encaminhamento, observando o endereço MAC (físico).
        > 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. Confirme que a interface corresponde ao NIC primário e ao IP primário da VM. Pode encontrar o NIC e o IP primários ao observar a configuração de rede no portal do Azure ou ao procurá-lo com a CLI do Azure. Tenha em atenção os IPs privados (e o endereço MAC, se estiver a utilizar a CLI). Eis um exemplo da CLI do PowerShell:
        $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
        }
        # Output: wintest767 True 00-0D-3A-E5-1C-C0
        
      5. Se não corresponderem, atualize a tabela de encaminhamento para que o NIC e o IP primários sejam visados.

  • Ativação pós-falha do clustering no Windows Server

    • Ao consultar o IMDS com o clustering de ativação pós-falha, por vezes é necessário adicionar uma rota à tabela de encaminhamento. Eis como:

      1. Abra uma linha de comandos com privilégios de administrador.

      2. Execute o seguinte comando e anote o endereço da Interface para Destino de Rede (0.0.0.0) na Tabela de Rotas IPv4.

      route print
      

      Nota

      O seguinte exemplo de saída é de uma VM do Windows Server com o cluster de ativação pós-falha ativado. Para simplificar, a saída contém apenas a Tabela de Rotas 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
      

      Execute o seguinte comando e utilize o endereço da Interface para Destino de Rede (0.0.0.0), que é (10.0.1.10) neste exemplo.

      route add 169.254.169.254/32 10.0.1.10 metric 1 -p
      

Suporte

Se não conseguir obter uma resposta de metadados após várias tentativas, pode criar um problema de suporte no portal do Azure.

Comentários sobre o produto

Pode fornecer comentários e ideias de produtos ao nosso canal de comentários dos utilizadores em Máquinas Virtuais > Instance Metadata Service aqui

Passos seguintes