W tym artykule dowiesz się jak uzyskać instance_ID ami_ID i inne informacje o EC2 z ec2. Pokażę ci dwa sposoby, jak to zrobić. Opowiem Ci o najlepszych praktykach i udzielę dobrych rad. Jest to niezwykle pomocne przy tworzeniu skryptu lub automatyzacji. Dowiesz się, jakie są różnice pomiędzy IMDS i IMDSv2.
IMDSv1
Czasami pracując na wirtualnej maszynie ec2, chciałbyś szybko sprawdzić instance_ID lub inne parametry. Można to zrobić na kilka sposobów. Najpierw powiem ci o Instance Metadata Services, czyli o IMDS i starym sposobie.
Tak więc w AWS Instance Metadata Service (IMDS) umożliwia dostęp do danych o Twojej instancji ec2, których możesz użyć do skonfigurowania działającej instancji lub zarządzania nią.
Metadane instancji są dostępne w wielu kategoriach, na przykład nazwa hosta, sieć, ami-id itd. jeśli chcesz odczytać identyfikator instancji, możesz użyć tego polecenia
curl http://169.254.169.254/latest/meta-data/instance-id
Lub
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Adres 169.254.169.254 jest adresem specjalnym w AWS. Używając go na ec2, odnosisz się do maszyny, na której aktualnie jesteś zalogowany. To ważny adres, więc dobra rada ode mnie lepiej zapamiętaj ten adres IP lub gdzieś go zapisz. Jest to szczególnie przydatne podczas tworzenia skryptów i automatyzacji. Oczywiście, jeśli używasz ipv6, możesz użyć tego fd00:ec2::254 http://[fd00:ec2::254]/latest/meta-data/
.
Aby uniknąć ciągłego aktualizowania skryptu, najlepiej jest użyć latest(tak jak w powyższych przykładach), a nie numeru wersji.
IMDSv2
Jest lepszy i bezpieczniejszy sposób na odczytanie tych informacji. Jest nim nowy IMDS o nazwie IMDSv2. IMDSv2 używa żądań zorientowanych na sesję. Zgodnie z dokumentacją każde żądanie jest teraz chronione przez uwierzytelnianie sesji.
Możesz uruchomić sesję za pomocą prostego żądania HTTP PUT do IMDSv2. Po tym IMDSv2 zwraca ci tajny token i możesz użyć tokena jako hasła do wysyłania żądań do IMDSv2 w celu uzyskania metadanych i poświadczeń.
Ważne informacje dotyczące IMDSv2:
- Nie ma praktycznego limitu liczby tokenów.
- Nie ma ograniczeń co do liczby sesji.
- Nowa wersja nadal jest ograniczona przez normalne połączenie IMDS i limity ograniczania przepustowości.
- Sesje mogą trwać do sześciu godzin czyli 21600 sekund
- Token sesji może być użyty tylko bezpośrednio z instancji EC2, w której rozpoczęła się ta sesja.
Przejdźmy do konkretów, najpierw wygeneruj token za pomocą następującego polecenia:
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
Jak widać żądanie musi zawierać nagłówek określający czas życia (TTL) dla tokena w sekundach, jak już pisałem maksymalnie do sześciu godzin.
Następnie użyj tokenu, na przykład za pomocą następującego polecenia:
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/
Możesz uzyskać na przykład instance_id, używając tego polecenia:
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" -v http://169.254.169.254/latest/meta-data/instance-id/
Możesz uzyskać informacje o podsieci za pomocą:
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" -v http://169.254.169.254/latest/meta-data/network/interfaces/macs
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" -v http://169.254.169.254/latest/meta-data/network/interfaces/macs/02:29:96:8f:6a:2d/subnet-id
Oczywiście możesz odczytać dużo węcej informacji:
Instance Identity Document
Mogę ci powiedzieć także, że każda uruchamiana instancja ec2 ma dokument tożsamości instancji (instance identity document), który zawiera informacje o samej instancji.
Możesz użyć instance identity document(po angielsku lepiej to brzmi), aby sprawdzić poprawność atrybutów ec2. Instance identity document jest udostępniany w formacie JSON w postaci zwykłego tekstu za pośrednictwem usługi Instance Metadata Service (IMDS).
Instance identity document jest generowany, gdy ec2 jest zatrzymywane i uruchamiane lub restartowane.
wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document
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" -v http://169.254.169.254/latest/dynamic/instance-identity/document
Tak na marginesie, to możesz również znaleźć instance_id zapisany w pliku na swoim ec2 w lokalizacji /var/lib/cloud/data/instance-id
.
clou-utils
Coś ekstra. Nie wiem, czy wiesz, ale jeśli chcesz uzyskać informacje o swoim ec2, to możesz także zainstalować cloud-utils.
sudo apt-get install cloud-utils
Pozwala to łatwo odczytać informacje o ec2, takie jak instance_id, jak w poprzednim przykładzie:
ec2metadata --instance-id
Oczywiście możesz przeczytać znacznie więcej informacji, spróbuj użyć:
ec2metadata -h
user data
Bardzo interesujące jest również user data
. Jest to zestaw poleceń, które można przekazać instancji podczas uruchamiania. Po uruchomieniu ec2, instancja wykonuje polecenia zawarte w user data
z uprawnieniami roota.
Każda instancja ma dostęp do user data
używając na przykład polecenia:
curl http://169.254.169.254/latest/user-data
Niestety wiele osób podaje tam dane wrażliwe i czasami możemy znaleźć tutaj loginy i hasła. Proszę, Ty tego nie rób.
Podsumowanie
Mam nadzieję, że już wiesz, jaka jest różnica pomiędzy IMDS i IMDSv2 oraz dlaczego warto używać IMDSv2. Jeszcze jedna rada na koniec, jeśli chcesz, to możesz zablokować możliwość używania IMDSv1 i wymusić używanie IMDSv2. Jak to zrobić dowiesz się z mojego filmu How to get information about ec2 from ec2 (IMDS) Best Practices & Practical demo tutorial 2023.