Amazon dodał ostatnio wspaniałą funkcję oznaczania instancji EC2 parami klucz-wartość, aby nieco ułatwić zarządzanie dużą liczbą maszyn wirtualnych.
Czy istnieje sposób na zapytanie o te tagi w taki sam sposób, jak w przypadku niektórych innych danych ustawionych przez użytkownika? Na przykład:
$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d
Czy istnieje podobny sposób odpytywania tagów?
amazon-web-services
amazon-ec2
Josh Lindsey
źródło
źródło
ec2metadata --instance-id
--out = json | jq '.Tags [] | select (.Key == "role") | .Value 'ec2metadata
Narzędzie jest przestarzałe. Teraz odpytujesz „magiczny” adres URL pod adresem 169.254.169.254/latest/meta-data - kliknij go za pomocą cURL, a otrzymasz magiczne punkty końcowe, których możesz użyć do uzyskania różnych bitów danych. W tym przypadkucurl http://169.254.169.254/latest/meta-data/instance-id
Twój identyfikator instancji zostaniePoniższy skrypt bash zwraca nazwę bieżącej instancji ec2 (wartość tagu „Name”). Dostosuj TAG_NAME do swojego przypadku.
Aby zainstalować plik aws cli
Jeśli używasz uprawnień zamiast jawnych danych logowania, użyj tych uprawnień:
źródło
aws ec2 describe-tags
. Musiałem dodać to uprawnienia do wewnętrznych zasad mojej roli uprawnień. Dzięki!| cut -f5
z--query="Tags[0].Value"
.Po zainstalowaniu
ec2-metadata
iec2-describe-tags
zainstalowaniu (jak wspomniano w odpowiedzi Ranieri powyżej ), oto przykładowe polecenie powłoki, aby uzyskać „nazwę” bieżącej instancji, zakładając, że masz na niej tag „Name = Foo”.Zakłada się, że ustawione są zmienne środowiskowe EC2_PRIVATE_KEY i EC2_CERT.
To wraca
Foo
.źródło
ec2-describe-tags
domyślnieus-east-2
. Przekaż--region
flagę, aby użyć innego regionu.Możesz dodać ten skrypt do danych użytkownika Cloud-init, aby pobrać tagi EC2 do pliku lokalnego:
Potrzebujesz narzędzi AWS CLI zainstalowanych w systemie: możesz zainstalować je z
packages
sekcją w pliku cloud-config przed skryptem, użyć AMI, który już je zawiera, lub dodać polecenieapt
lubyum
na początku skryptu.Aby uzyskać dostęp do tagów EC2, potrzebujesz zasady takiej jak ta w roli IAM Twojej instancji:
Tagi EC2 instancji będą dostępne
/etc/ec2-tags
w następującym formacie:Możesz dołączyć plik w takiej postaci, w jakiej jest, do skryptu powłoki, używając
. /etc/ec2-tags
na przykład:Tagi są pobierane podczas inicjowania instancji, więc nie będą odzwierciedlać późniejszych zmian.
Skrypt i zasady IAM są oparte na odpowiedzi itaifrenkel.
źródło
aws:autoscaling:groupName
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/EC2_TAG_\1="\2"/' |sed -r 's/aws:autoscaling:/aws_autoscaling_/' > /etc/ec2-tags
Jeśli nie jesteś w domyślnej strefie dostępności, wyniki overerthink zwróciłyby się jako puste.
Jeśli chcesz dodać filtr, aby uzyskać określony tag (elastyczna łodyga: nazwa-środowiska w moim przypadku), możesz to zrobić.
Aby uzyskać tylko wartość tagu, według którego przefiltrowałem, potokujemy, aby wyciąć i uzyskać piąte pole.
źródło
elasticbeanstalk:environment-name
zName
W przypadku Pythona:
źródło
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
Alternatywnie możesz użyć
describe-instances
wywołania CLI zamiastdescribe-tags
:Ten przykład pokazuje, jak uzyskać wartość tagu „my-tag-name” dla instancji:
aws ec2 describe-instances \ --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) \ --query "Reservations[*].Instances[*].Tags[?Key=='my-tag-name'].Value" \ --region ap-southeast-2 --output text
Zmień region, aby dopasować go do lokalnych warunków. Może to być przydatne, gdy instancja ma uprawnienie opisywać-instancje, ale nie ma tagów opisywać w zasadach profilu instancji
źródło
Złożyłem razem następujące, miejmy nadzieję, prostsze i czystsze niż niektóre z istniejących odpowiedzi i używa tylko interfejsu wiersza polecenia AWS bez dodatkowych narzędzi.
Ten przykład kodu pokazuje, jak uzyskać wartość tagu „myTag” dla bieżącej instancji EC2:
Korzystanie z tagów opisujących :
export AWS_DEFAULT_REGION=us-east-1 instance_id=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) aws ec2 describe-tags \ --filters "Name=resource-id,Values=$instance_id" 'Name=key,Values=myTag' \ --query 'Tags[].Value' --output text
Lub, alternatywnie, używając opisu-instancji :
aws ec2 describe-instances --instance-id $instance_id \ --query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text
źródło
Korzystając z API AWS „dane użytkownika” i „metadane”, można napisać skrypt, który opakuje marionetkę, aby uruchomić marionetkę z niestandardową nazwą certyfikatu.
Najpierw uruchom instancję aws z niestandardowymi danymi użytkownika: „role: serwer sieciowy”
To wywołuje marionetkę z nazwą certyfikatu, taką jak „webserver.i-hfg453.aws”. Następnie możesz utworzyć manifest węzła o nazwie „serwer sieciowy”, a „rozmyte dopasowanie węzła” marionetek będzie oznaczać, że jest używany do obsługi wszystkich serwerów WWW.
W tym przykładzie założono, że tworzysz obraz podstawowy z zainstalowaną marionetką itp.
Korzyści:
1) Nie musisz przekazywać swoich danych uwierzytelniających
2) Konfiguracje ról mogą być tak szczegółowe, jak chcesz.
źródło
Jq + ec2metadata sprawia, że jest trochę ładniej. Używam cf i mam dostęp do regionu. W przeciwnym razie możesz go złapać w bash.
aws ec2 describe-tags --region $REGION \ --filters "Name=resource-id,Values=`ec2metadata --instance-id`" | jq --raw-output \ '.Tags[] | select(.Key=="TAG_NAME") | .Value'
źródło
Odmiana niektórych z powyższych odpowiedzi, ale w ten sposób uzyskałem wartość określonego tagu ze skryptu danych użytkownika w instancji
źródło
Zainstaluj AWS CLI:
Pobierz tagi dla bieżącej instancji:
Wyjścia:
Użyj trochę perla, aby wyodrębnić tagi:
Zwroty:
źródło
ec2metadata
nie znajduje się w aws-cli, ale można go zastąpićcurl --silent http://169.254.169.254/latest/meta-data/instance-id
. Ponadto,jq
można analizować JSON łatwiej, lub inny format wyjściowy jest jeszcze łatwiejsze.sudo apt-get -y install python
iexport AWS_DEFAULT_REGION=us-west-1
instance-id: i-07f59f3564618f148
Aby to zrobić, pobierz i uruchom samodzielny plik wykonywalny.
Czasami nie można zainstalować awscli, które zależy od Pythona. Docker również może być poza obrazem.
Oto moja implementacja w golang: https://github.com/hmalphettes/go-ec2-describe-tags
źródło
Dla tych, którzy są wystarczająco szaleni, aby używać Fish shell na EC2, oto przydatny fragment dla twojego /home/ec2-user/.config/fish/config.fish. Polecenie hostdata wyświetli teraz wszystkie tagi, a także publiczny adres IP i nazwę hosta.
źródło