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.