Como migrar para o endpoint do servidor de metadados v1

Visão geral da migração

Para migrar para a v1.0, conclua as etapas a seguir:

  1. Identifique as instâncias de VM que estão usando os endpoints do servidor de metadados obsoletos.

    Se você tiver clusters do Google Kubernetes Engine, será necessário identificar os nós do GKE que usam o endpoint obsoleto.

  2. Nas instâncias de VM ou nós identificados, encontre os processos que usam os endpoints do servidor de metadados obsoletos.

    • Se o processo pertence a um aplicativo que você não desenvolveu, atualize o aplicativo para usar um endpoint do servidor de metadados v1. Para uma lista de aplicativos conhecidos que exigem uma atualização, consulte esta seção.
    • Se o processo pertence a um aplicativo que você desenvolveu, e seu código chama qualquer um dos endpoints legados, conclua as etapas a seguir:
      1. Revise as diferenças entre a v1 e os endpoints do servidor de metadados obsoletos.
      2. Atualize as consultas para usar o endpoint do servidor de metadados v1.
    • Se o processo pertence a um aplicativo que você desenvolveu, mas o código não faz solicitações para nenhum dos endpoints legados, as solicitações podem ser feitas por SDKs ou outras dependências. Para corrigir esse problema, atualize todos os SDKs e dependências usados pelo aplicativo. Para acessar as versões das bibliotecas do Google que exigem uma atualização, consulte versões de biblioteca compatíveis.
  3. Opcional: desative os endpoints do servidor de metadados v0.1 e v1beta1.

    Como identificar as instâncias de VM

    Para identificar quais instâncias de VM usam os endpoints v0.1 e v1beta1, faça solicitações para dois novos endpoints.

    A saída da consulta desses novos endpoints informa quantas vezes uma determinada instância de VM acessou os endpoints obsoletos. Observação: sempre que uma instância de VM é interrompida, o contador é redefinido.

    Para verificar se uma instância de VM acessou os endpoints v0.1 e v1beta1, execute os comandos a seguir:

    curl -H "Metadata-Flavor: Google" computeMetadata/v1/instance/legacy-metadata-access/0.1
    curl -H "Metadata-Flavor: Google" computeMetadata/v1/instance/legacy-metadata-access/v1beta1
    

    Como identificar os nós do GKE

    Para identificar os nós nos clusters do Google Kubernetes Engine que usam os endpoints v0.1 e v1beta1, consulte Como identificar as cargas de trabalho que usam os endpoints do servidor de metadados legados.

    Como identificar os processos

    Depois de identificar as instâncias de VM que fazem solicitações para os endpoints do servidor de metadados obsoletos, encontre os processos nessas instâncias que fazem as solicitações.

    Para identificar os processos, use as ferramentas de geração de registros ou monitoramento, como ngrep ou auditd.

    ngrep

    Use o ngrep (rede grep) para coletar pacotes e filtrar o conteúdo deles. Para coletar informações de pacote dos processos que fazem solicitações aos endpoints obsoletos, na instância de VM, execute o comando a seguir:

    sudo ngrep -l -q "v1beta1|0\.1/meta-data" tcp \
    and dst host 169.254.169.254 or metadata.google.internal \
    and dst port 80
    

    Se alguma solicitação for feita para os endpoints obsoletos, a saída será assim:

    T 10.128.0.4:41312 -> 169.254.169.254:80 [AP]
    GET /computeMetadata/v1beta1/instance/id HTTP/1.1..Host: metadata.goog..User-Agent: curl/7.52.1..Accept: */*....
    

    A saída contém as informações a seguir:

    • O URL raiz: /computeMetadata/v1beta1/instance/id.
    • O user agent utilizado para fazer a solicitação. Neste exemplo, é curl/7.52.1.
    • O endereço IP e a porta da instância de VM de origem da solicitação. Neste exemplo, o endereço IP é 10.128.0.4, e a porta é 41312.
    • Se o processo ainda estiver ativo, analise as informações da porta para encontrar o ID dele.

    Como revisar as informações da porta

    Com o procedimento a seguir, você identifica processos com solicitações pendentes GET HTTP. Você localiza os processos que se comunicam com os endpoints de metadados atuais e obsoletos.

    Para listar os soquetes com conexões abertas com o servidor de metadados, na instância de VM, execute o comando a seguir:

    sudo lsof -n -P +c 0 -i @169.254.169.254

    A saída será assim:

    COMMAND         PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
    google_network_ 798 root    7u  IPv4 1674967626      0t0  TCP 10.128.0.4:44876->169.254.169.254:80 (ESTABLISHED)
    google_accounts 805 root    5u  IPv4 1674980506      0t0  TCP 10.128.0.4:44878->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    5u  IPv4 1674982496      0t0  TCP 10.128.0.4:44880->169.254.169.254:80 (ESTABLISHED)
    google_clock_sk 809 root    6u  IPv4 1674914460      0t0  TCP 10.128.0.4:44874->169.254.169.254:80 (CLOSE_WAIT)
    

    A coluna NAME mostra o IP de origem, o IP de destino e as portas. Se isso não for o suficiente para identificar um processo, use o comando ps para ver mais informações.

    ps 798 805 809

    A saída será assim:

    PID TTY      STAT   TIME COMMAND
    798 ?        Ss     9:07 /usr/bin/python /usr/bin/google_network_daemon
    805 ?        Ss    14:19 /usr/bin/python /usr/bin/google_accounts_daemon
    809 ?        Ss     4:33 /usr/bin/python /usr/bin/google_clock_skew_daemon
    

    auditd (somente Linux)

    O Auditd é um daemon que grava registros de auditoria no disco com base em um conjunto de regras. Ao configurar uma regra na chamada de sistema connect, você identifica qual processo cria cada conexão com os endpoints do servidor de metadados obsoletos.

    1. Para configurar uma regra para auditar as chamadas de sistema connect, na instância de VM, execute o comando a seguir:

      sudo auditctl -a exit,always -F arch=b64 -S connect -k CONNECT
    2. Para consultar conexões com os endpoints obsoletos, na instância de VM, execute o comando a seguir:

      sudo ausearch -m SOCKADDR -k CONNECT --interpret | grep -C 3 'computeMetadata/v1beta1\|0\.1/meta-data'

      A saída será assim:

      type=PROCTITLE msg=audit(09/26/2019 22:20:21.498:847) : proctitle=curl metadata.goog/computeMetadata/v1beta1/instance/id
      type=SOCKADDR msg=audit(09/26/2019 22:20:21.498:847) : saddr={ fam=inet laddr=169.254.169.254 lport=80 }
      type=SYSCALL msg=audit(09/26/2019 22:20:21.498:847) : arch=x86_64 syscall=connect success=no exit=EINPROGRESS(Operation now in progress) a0=0x3 a1=0x7fffd965bd50 a2=0x10 a3=0x14856d3402026e items=0 ppid=27641 pid=28977 auid=alice uid=alice gid=alice euid=alice suid=alice fsuid=alice egid=alice sgid=alice fsgid=alice tty=pts9 ses=2828 comm=curl exe=/usr/bin/curl key=CONNECT
      

      A saída contém as informações a seguir:

      • Título do processo: proctitle
      • URL da solicitação: curl metadata.goog/computeMetadata/v1beta1/instance/id
      • Local do executável: exe=/usr/bin/curl
      • Usuário: uid=alice

      Depois de identificar os processos, é possível remover a regra. Para fazer isso, execute o comando a seguir:

      sudo auditctl -d exit,always -F arch=b64 -S connect -k CONNECT

    Diferenças entre os endpoints do servidor de metadados v1beta1 e v1.0

    O servidor de metadados v1 tem um funcionamento um pouco diferente do servidor v1beta1 anterior. O novo servidor de metadados exige que todas as solicitações forneçam o cabeçalho Metadata-Flavor: Google. Ele indica que a solicitação foi feita para recuperar valores de metadados.

    Atualize as solicitações para incluir esse novo cabeçalho. Por exemplo, uma solicitação para o atributo disks/ agora será assim:

    user@myinst:~$ curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
    

    Diferenças entre os endpoints do servidor de metadados v0.1 e v1.0

    Em geral, os endpoints do servidor de metadados v0.1 e v1 têm estas diferenças:

    • A raiz usada para consultar o endpoint do servidor de metadados foi alterada de http://metadata.google.internal/0.1/meta-data/ para http://metadata.google.internal/computeMetadata/v1/.
    • As solicitações do servidor de metadados v1 precisam incluir o cabeçalho Metadata-Flavor: Google. Por exemplo, uma solicitação para o atributo disks/ agora será assim:

      curl "http://metadata.google.internal/computeMetadata/v1/instance/disks/" -H "Metadata-Flavor: Google"
    • É possível consultar os metadados personalizados no nível do projeto e da instância.

      No servidor de metadados v0.1, para a propriedade attributes/, os valores de metadados da instância e do projeto estão no mesmo diretório. Se um atributo tiver valores de metadados de instância e projeto, o valor de metadados da instância em uma determinada chave será retornado.

      Nas consultas v1, o URL precisa especificar se os metadados da instância ou do projeto foram solicitados. Por exemplo, para consultar o atributo sshKeys, execute um dos itens a seguir ou ambos:

      Para as sshKeys que estão definidas no projeto, execute o comando a seguir:

      curl "http://metadata.google.internal/computeMetadata/v1/project/attributes/sshKeys" -H "Metadata-Flavor: Google"

      Para as sshKeys que estão definidas nessa instância, execute o comando a seguir:

      curl "http://metadata.google.internal/computeMetadata/v1/instance/attributes/sshKeys" -H "Metadata-Flavor: Google"
    • Algumas entradas de metadados na v0.1 retornam objetos JSON. No servidor de metadados v1, essas entradas de metadados são organizadas por diretório. Isso possibilita que você consulte entradas e valores de índice específicos para esses campos aninhados anteriormente. Para mais informações sobre como consultar uma listagem de diretórios ou acessar objetos JSON na v1, consulte Atributos como listagens de diretórios.

    Para acessar um mapeamento mais detalhado dos endpoints do servidor de metadados v0.1 para v1, consulte as tabelas a seguir.

    Atributos da instância

    As entradas de metadados a seguir são movidas para o diretório instance/:

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    Descrição v0.1 description My instance description
    v1 instance/description
    Nome do host v0.1 hostname my-instance.c.my-project.internal
    v1 instance/hostname
    Imagem v0.1 image projects/eip-images/global/images/debian-9-drawfork-v20180109
    v1 instance/image
    Tipo de máquina v0.1 machine-type projects/12345/machineTypes/n1-standard-1
    v1 instance/machine-type
    Tags da instância v0.1 tags ["cheese", "lettuce"]
    v1 instance/tags
    Zona v0.1 zone projects/12345/zones/us-central1-c
    v1 instance/zone

    Atributos do projeto

    As entradas de metadados a seguir são movidas para o diretório project/:

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    ID do projeto v0.1 project-id my-project
    v1 project/project-id
    ID do projeto numérico v0.1 numeric-project-id 12345
    v1 project/numeric-project-id

    Atributos movidos

    As entradas de metadados a seguir são movidas para um novo endpoint:

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    Domínio v0.1 domain c.my-project.internal
    v1 instance/hostname my-instance.c.my-project.internal

    Atributos renomeados

    As entradas de metadados a seguir são renomeadas:

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    ID da instância v0.1 instance-id 123456789
    v1 instance/id 123456789

    Atributos como listagens de diretórios

    As entradas de metadados a seguir retornam objetos JSON na v0.1 e estão organizadas em diretórios na v1.

    Nessas entradas, é possível usar um dos métodos a seguir para acessar os endpoints:

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    Discos v0.1 disks
    
    {"disks":[{
    "deviceName":"persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]}
    v1 instance/attached-disks/?recursive=true
    
    [{"deviceName": "persistent-disk-0",
    "index":0,
    "mode":"READ_WRITE",
    "type":"PERSISTENT"}]
    Interfaces de rede v0.1 network
    
    {"networkInterface":
    [{"accessConfiguration":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "ip":"10.128.0.4",
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default"}]}
    v1 instance/network-interfaces/?recursive=true
    
    [{"accessConfigs":
    [{"externalIp":"35.194.6.47",
    "type":"ONE_TO_ONE_NAT"}],
    "dnsServers":["169.254.169.254"],
    "forwardedIps":[],
    "gateway":"10.128.0.1",
    "ip":"10.128.0.4",
    "ipAliases [],
    "mac":"42:01:0a:80:00:04","mtu":1460,
    "network":"projects/12345/networks/default",
    "subnetmask":"255.255.240.0","targetInstanceIps":[]}]
    Informações da conta de serviço (todas as contas de serviço) v0.1 service-accounts
    
    {"serviceAccounts":
    [{"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"12345-compute@developer.gserviceaccount.com"}]}
    v1 instance/service-accounts/?recursive=true
    
    {"123451-compute@developer.gserviceaccount.com":
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]},
    "default":{"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}}
    Informações da conta de serviço (uma conta de serviço) v0.1 service-accounts/<email|default>
    
    {"scopes":["https://www.googleapis.com/auth/devstorage.read_only"],
    "serviceAccount":"123451-compute@developer.gserviceaccount.com"}
    
    v1 instance/service-accounts/<email|default>/?recursive=true
    
    {"aliases":["default"],
    "email":"123451-compute@developer.gserviceaccount.com",
    "scopes":["https://www.googleapis.com/auth/devstorage.read_only"]}
    

    Como consultar tokens de acesso OAuth 2.0

    As entradas de metadados a seguir retornam tokens de acesso OAuth2.

    raiz v0.1 - http://metadata.google.internal/0.1/meta-data/
    raiz v1 - http://metadata.google.internal/computeMetadata/v1
    Entrada de metadados Versão URI (relativo à raiz) Exemplo de saída
    Token OAuth2 v0.1 (método 1)

    auth-token?service_account=<email|default>&scope=scopeA,scopeB

    ou

    auth_token?service_account=<email|default>&scope=scopeA,scopeB

    
    {"expires":1568854217,
    "oauth2_access_token":"ya29.c.KmyIB0i4tH1xLzKGrqeeK6TGWEW3b18Lcq...."}
    
    v0.1 (método 2) service-accounts/<email|default>/acquire
    
    {"accessToken":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq.....",
    "expiresAt":1568854217,"expiresIn":2022}
    v1 instance/service-accounts/<email|default>/token
    
    {"access_token":"ya29.c.KmyIB0i4tH1xLNzKGrqeeK6TGWEW3b18Lcq....",
    "expires_in":2022,"token_type":"Bearer"}

    Aplicativos que exigem uma atualização

    Para usar o endpoint do servidor de metadados v1, atualize os aplicativos a seguir para a versão mínima compatível ou outra superior.

    Aplicativo Versão mínima compatível
    Facter (desenvolvido pelo Puppet) [em inglês] 3.14.5
    Agente do Stackdriver Monitoring 5.5.2-375

    Versões de biblioteca compatíveis

    Algumas bibliotecas do Google não são afetadas pela migração para o endpoint do servidor de metadados v1. No entanto, se você estiver usando uma das bibliotecas listadas na tabela a seguir, faça upgrade para a versão mínima compatível ou outra superior. Há links em inglês.

    Linguagem Biblioteca do Google Versão mínima compatível
    Java com.google.api-client 1.18.0-rc
    Node.js google-cloud/debug-agent 3.0.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js dialogflow 0.6.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js google-cloud/pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/vision 0.21.0
    Node.js google-cloud/profiler 0.2.0
    Node.js google-cloud/trace-agent 2.11.0
    Node.js google-gax 0.17.0
    Node.js gce-images 1.0.0
    Node.js gcp-metadata 0.5.0
    Node.js gcs-resumable-upload 0.13.0
    Node.js googleapis 27.0.0
    Node.js google-auth-library 1.3.0
    Node.js google-cloud/bigquery 2.0.0
    Node.js google-cloud/bigquery-data-transfer 0.4.0
    Node.js google-cloud/bigtable 0.15.0
    Node.js google-cloud/cloud-container 0.3.0
    Node.js google-cloud/common 0.18.0
    Node.js google-cloud/common-grpc 0.7.0
    Node.js google-cloud/compute 0.11.0
    Node.js google-cloud/datastore 2.0.0
    Node.js dialogflow 0.6.0
    Node.js google-cloud/dlp 0.8.0
    Node.js google-cloud/dns 0.8.0
    Node.js google-cloud/error-reporting 0.5.0
    Node.js google-cloud/firestore 0.16.1
    Node.js google-cloud/language 2.0.0
    Node.js google-cloud/logging 2.0.0
    Node.js google-cloud/logging-bunyan 0.9.0
    Node.js google-cloud/logging-winston 0.10.0
    Node.js google-cloud/monitoring 0.6.0
    Node.js google-cloud/os-login 0.3.0
    Node.js googleapis/nodejs-pubsub 0.20.0
    Node.js google-cloud/redis 0.2.0
    Node.js google-cloud/resource 0.9.0
    Node.js google-cloud/spanner 2.0.0
    Node.js google-cloud/speech 2.0.0
    Node.js google-cloud/storage 2.0.0
    Node.js google-cloud/tasks 0.2.0
    Node.js google-cloud/text-to-speech 0.3.0
    Node.js google-cloud/translate 2.0.0
    Node.js google-cloud/video-intelligence 1.3.0
    Node.js google-cloud/vision 0.21.0
    PHP google-cloud/video-intelligence 1.3.3
    Python oauth2client 2.0.0
    Python google-api-python-client 1.6.0
    Python googleapis/google-cloud-python 0.10.0
    Python google-cloud-happybase 0.20.0
    Ruby gcloud 0.11.1
    Ruby google-api-client 0.8.6
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine