Como obter metadados da instância AWS EC2 com curl no Linux

A AWS possui o IMDS (Instance Metadata Service) que fornece dados da sua instância em execução. Vamos ver como obter metadados da instância EC2 com curl no Linux. Quero dizer que a partir da própria instância você consegue obter dados como IP público, grupos de segurança e diversas outras informações que possam ser úteis pra você.

Para ter acesso aos metadados, quando a instância é criada, a opção Metadata accessible precisa estar habilitada. Caso contrário o serviço estará indisponível.

Os dados são obtidos através do endereço local 169.254.169.254 usando protocolo http. Sim, este IP representa a máquina local, ele é um Automatic Private IP Addressing – APIPA.

Portanto, para obter as informações faremos requisição GET no endereço base http://169.254.169.254/. A seguir listo quais informações vamos capturar via IMDS:

  • ID da imagem da instância
  • ID da instância
  • Tipo da instância
  • Nome da instância
  • IPv4 local
  • Hostname público
  • IPv4 público
  • Mac Address da interface local
  • Lista de interfaces conectadas na instância
  • Security Groups da instância

Bora para a prática?

Primeiro precisamos criar um token de sessão para definir a duração da sessão, que pode ser, no mínimo, um segundo e, no máximo, seis horas. Aqui vamos criar um com duração de 300 segundos (5 minutos):

$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 300"`

Feito! Com o token criado e armazenado na variável $TOKEN podemos começar a capturar os dados da nossa instância.

ID da imagem da instância: /latest/meta-data/ami-id

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/ami-id

Output:
ami-04505e74c0741db8d

ID da instância: /latest/meta-data/instance-id

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/instance-id

Output:
i-0df8f0b76ad5d64af

Tipo da instância: /latest/meta-data/instance-type

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/instance-type

Output:
t2.small

Nome da instância: /latest/meta-data/local-hostname

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/local-hostname

Output:
ip-172-31-70-191.ec2.internal

IPv4 local: /latest/meta-data/local-ipv4

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/local-ipv4

Output:
172.31.70.191

Hostname público: /latest/meta-data/public-hostname

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/public-hostname

Output:
ec2-3-91-172-49.compute-1.amazonaws.com

IPv4 público: /latest/meta-data/public-ipv4

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/public-ipv4

Output:
3.91.172.49

Mac Address da interface local: /latest/meta-data/mac

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/mac

Output:
02:73:6a:06:bf:e5cesar

Lista de interfaces de rede conectadas na instância: /latest/meta-data/network/interfaces/macs

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/network/interfaces/macs

Output:
02:73:6a:06:bf:e5/

VPC da interface de rede: /latest/meta-data/network/interfaces/macs/02:73:6a:06:bf:e5/vpc-id

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:73:6a:06:bf:e5/vpc-id

Output:
vpc-3820df5e

Security Groups da instância: /latest/meta-data/security-groups

$ curl -H "X-aws-ec2-metadata-token: $TOKEN"  http://169.254.169.254/latest/meta-data/security-groups

Output:
ALLOW-SSH
ALLOW-HTTP
ALLOW-HTTPS

Para finalizar…

Neste artigos mostramos como pegar os dados usando curl do Linux, mas você pode usar qualquer ferramenta que seja capaz de fazer requisições http. Há uma lista grande de dados que podemos obter através do IMDS. A lista completa está em neste link da AWS.

Confira aqui no site da Coffops outros artigos sobre Linux.

Deixe um comentário

O seu endereço de e-mail não será publicado.