Como Serviço de metadados da instância versão 2 funciona
O IMDSv2 usa solicitações orientadas a sessão. Com solicitações orientadas a sessão, você cria um token de sessão que define a duração da sessão, que pode ser, no mínimo, um segundo e, no máximo, seis horas. Durante o período especificado, é possível usar o mesmo token de sessão para solicitações subsequentes. Depois que a duração especificada expira, crie um novo token de sessão para uso em solicitações futuras.
nota
Os exemplos nesta seção usam o endereço IPv4 do Serviço de metadados da instância (IMDS): 169.254.169.254
. Se você estiver recuperando metadados de instância para instâncias do EC2 pelo endereço IPv6, certifique-se de habilitar e usar o endereço IPv6: [fd00:ec2::254]
. O endereço IPv6 do IMDS é compatível com comandos IMDSv2. O endereço IPv6 só pode ser acessado em instâncias baseadas no AWS Nitro System e em uma sub-rede compatível com IPv6 (pilha dupla ou IPv6 apenas).
Os exemplos apresentados a seguir usam um script de shell e um IMDSv2 para recuperar os itens de metadados da instância de nível superior. Cada exemplo:
-
Cria um token de sessão que dura seis horas (21.600 segundos) usando a solicitação
PUT
. -
Armazena o cabeçalho do token da sessão em uma variável chamada
TOKEN
(para as instâncias do Linux) outoken
(para as instâncias do Windows) -
Solicita os itens de metadados de nível superior usando o token
É possível executar dois comandos separados ou combiná-los.
Comandos separados
Primeiro, gere um token usando o comando a seguir.
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
Em seguida, use o token para gerar itens de metadados de nível superior usando o comando a seguir.
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
Comandos combinados
É possível armazenar o token e combinar os comandos. O exemplo a seguir combina os dois comandos acima e armazena o cabeçalho do token de sessão em uma variável chamada TOKEN.
nota
Se houver um erro na criação do token, em vez de um token válido, uma mensagem de erro será armazenada na variável e o comando não funcionará.
[ec2-user ~]$
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/
Depois de criar um token, é possível reutilizá-lo até que ele expire. No comando de exemplo a seguir, que obtém o ID da AMI usada para executar a instância, o token armazenado em $TOKEN
no exemplo anterior é reutilizado.
[ec2-user ~]$
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ami-id
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
Depois de criar um token, é possível reutilizá-lo até que ele expire. No comando de exemplo a seguir, que obtém o ID da AMI usada para executar a instância, o token armazenado em $token
no exemplo anterior é reutilizado.
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
Quando você usa o IMDSv2 para solicitar os metadados da instância, a solicitação deve incluir o seguinte:
-
Use uma solicitação
PUT
para solicitar a inicialização de uma sessão para o serviço de metadados da instância. A solicitaçãoPUT
retorna um token que deve ser incluído em solicitaçõesGET
subsequentes para o serviço de metadados da instância. O token é exigido para acessar metadados usando o IMDSv2. -
Inclua o token em todas as solicitações
GET
para o IMDS. Quando o uso do token está definido comorequired
, as solicitações sem um token válido ou com um token expirado recebem um código de erro HTTP401 - Unauthorized
.-
O token é uma chave específica da instância. O token não é válido em outras instâncias do EC2 e será rejeitado se você tentar usá-lo fora da instância na qual foi gerado.
-
A solicitação
PUT
deve incluir um cabeçalho que especifique a vida útil (TTL) do token, em segundos, até um máximo de seis horas (21.600 segundos). O token representa uma sessão lógica. O TTL especifica o período de validade do token e, portanto, a duração da sessão. -
Depois que o token expira, para continuar a acessar os metadados da instância, crie uma nova sessão usando outro
PUT
. -
É possível optar por reutilizar um token ou criar um novo token para cada solicitação. Para um número pequeno de solicitações, pode ser mais fácil gerar e usar imediatamente um token a cada vez que você precisar acessar o IMDS. Mas, para obter eficiência, é possível especificar uma duração maior para o token e reutilizá-lo, em vez de precisar escrever uma solicitação
PUT
toda vez que precisar solicitar metadados da instância. Não há um limite prático para o número de tokens simultâneos, cada um representando sua própria sessão. No entanto, o IMDSv2 ainda é restringido pela conexão do IMDS e pelos limites de controle de utilização. Para ter mais informações, consulte Limitação de consulta.
-
Os métodos HTTP GET
e HEAD
são permitidos em solicitações de metadados de instâncias do IMDSv2. As solicitações PUT
serão rejeitadas se contiverem um cabeçalho X-Forwarded-For.
Por padrão, a resposta a solicitações PUT
tem um limite de saltos de resposta (vida útil) de 1
no nível de protocolo IP. Se você precisar de um limite maior de saltos, é possível ajustar o limite usando o comando modify-instance-metadata-options da AWS CLI. Por exemplo, um limite de saltos maior pode ser necessário para compatibilidade com versões anteriores de serviços de contêiner em execução na instância. Para ter mais informações, consulte Modificar as opções de metadados de instância para as instâncias existentes.