Zapytanie o znaczniki EC2 z instancji
[1]}Amazon niedawno dodał wspaniałą funkcję oznaczania instancji EC2 za pomocą par klucz-wartość, aby ułatwić zarządzanie dużą liczbą maszyn wirtualnych.
Czy istnieje jakiś sposób na odpytywanie tych tagów w taki sam sposób, jak niektóre inne dane zestawu użytkowników? Na przykład:
$ wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d
Czy Jest jakiś podobny sposób na odpytywanie tagów?
10 answers
Możesz użyć kombinacji narzędzia AWS metadata (do pobrania identyfikatora instancji) i new Tag API do pobrania znaczników dla bieżącej instancji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-08 12:05:29
Po zainstalowaniu ec2-metadata
i ec2-describe-tags
(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 znacznik "Name = Foo".
Zakłada ustawienie zmiennych środowiskowych EC2_PRIVATE_KEY i EC2_CERT.
ec2-describe-tags \
--filter "resource-type=instance" \
--filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
--filter "key=Name" | cut -f5
To zwraca Foo
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:30
Następujący skrypt bash zwraca nazwę bieżącej instancji ec2 (wartość znacznika "Name"). Zmodyfikuj TAG_NAME do konkretnego przypadku.
TAG_NAME="Name"
INSTANCE_ID="`wget -qO- http://instance-data/latest/meta-data/instance-id`"
REGION="`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
TAG_VALUE="`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values=$TAG_NAME" --region $REGION --output=text | cut -f5`"
Aby zainstalować aws cli
sudo apt-get install python-pip -y
sudo pip install awscli
Jeśli używasz IAM zamiast jawnych poświadczeń, użyj tych uprawnień IAM:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [ "ec2:DescribeTags"],
"Resource": ["*"]
}
]
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-03 09:13:41
Możesz dodać ten skrypt do swoich danych użytkownika cloud-init , Aby pobrać tagi EC2 do lokalnego pliku:
#!/bin/sh
INSTANCE_ID=`wget -qO- http://instance-data/latest/meta-data/instance-id`
REGION=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//'`
aws ec2 describe-tags --region $REGION --filter "Name=resource-id,Values=$INSTANCE_ID" --output=text | sed -r 's/TAGS\t(.*)\t.*\t.*\t(.*)/\1="\2"/' > /etc/ec2-tags
Potrzebujesz narzędzi AWS CLI zainstalowanych w Twoim systemie: możesz je zainstalować za pomocą sekcji packages
w pliku cloud-config przed skryptem, użyć AMI, które już je Zawiera lub dodać polecenie apt
lub yum
na początku skryptu.
Aby uzyskać dostęp do tagów EC2, potrzebujesz takiej polityki jak ta w IAM Twojej instancji rola:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1409309287000",
"Effect": "Allow",
"Action": [
"ec2:DescribeTags"
],
"Resource": [
"*"
]
}
]
}
Znaczniki EC2 instancji będą dostępne w /etc/ec2-tags
w tym formacie:
FOO="Bar"
Name="EC2 tags with cloud-init"
Możesz dołączyć plik as-is do skryptu powłoki używając . /etc/ec2-tags
, na przykład:
#!/bin/sh
. /etc/ec2-tags
echo $Name
Znaczniki są pobierane podczas inicjalizacji instancji, więc nie będą odzwierciedlać kolejnych zmian.
Scenariusz i Polityka IAM opierają się na odpowiedzi itaifrenkela.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-08 12:05:17
Jeśli nie jesteś w domyślnej strefie dostępności, wyniki z overhink będą puste.
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id)
Jeśli chcesz dodać filtr, aby uzyskać konkretny tag (elasticbeanstalk: environment-name w moim przypadku), możesz to zrobić.
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
--filter \
key=elasticbeanstalk:environment-name | cut -f5
I aby uzyskać tylko wartość znacznika, na którym filtrowałem, przechodzimy do cięcia i otrzymujemy piąte pole.
ec2-describe-tags \
--region \
$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e "s/.$//") \
--filter \
resource-id=$(curl --silent http://169.254.169.254/latest/meta-data/instance-id) \
--filter \
key=elasticbeanstalk:environment-name | cut -f5
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-15 18:05:45
Dla Pythona:
from boto import utils, ec2
from os import environ
# import keys from os.env or use default (not secure)
aws_access_key_id = environ.get('AWS_ACCESS_KEY_ID', failobj='XXXXXXXXXXX')
aws_secret_access_key = environ.get('AWS_SECRET_ACCESS_KEY', failobj='XXXXXXXXXXXXXXXXXXXXX')
#load metadata , if = {} we are on localhost
# http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html
instance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
region = instance_metadata['placement']['availability-zone'][:-1]
instance_id = instance_metadata['instance-id']
conn = ec2.connect_to_region(region, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key)
# get tag status for our instance_id using filters
# http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ApiReference-cmd-DescribeTags.html
tags = conn.get_all_tags(filters={'resource-id': instance_id, 'key': 'status'})
if tags:
instance_status = tags[0].value
else:
instance_status = None
logging.error('no status tag for '+region+' '+instance_id)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-08 09:06:27
Używając API AWS 'user data 'i' meta data ' można napisać skrypt, który owija puppet, aby rozpocząć uruchamianie puppet z niestandardową nazwą cert.
Najpierw uruchom instancję aws z niestandardowymi danymi użytkownika: 'rola: webserver'
#!/bin/bash
# Find the name from the user data passed in on instance creation
USER=$(curl -s "http://169.254.169.254/latest/user-data")
IFS=':' read -ra UDATA <<< "$USER"
# Find the instance ID from the meta data api
ID=$(curl -s "http://169.254.169.254/latest/meta-data/instance-id")
CERTNAME=${UDATA[1]}.$ID.aws
echo "Running Puppet for certname: " $CERTNAME
puppet agent -t --certname=$CERTNAME
To wywołuje puppet z certname jak ' webserver.i-hfg453.aws "można następnie utworzyć manifest węzła o nazwie "webserver" i puppets "fuzzy node matching" będzie oznaczać, że jest on używany do dostarczania wszystkich serwerów WWW.
Ten przykład zakłada, że budujesz na obraz bazowy z zainstalowaną marionetką itp.
Korzyści:
1) nie musisz podawać swoich referencji
2) możesz być tak ziarnisty, jak chcesz z roli configs.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-05 09:29:34
Zainstaluj AWS CLI:
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
sudo apt-get install unzip
unzip awscli-bundle.zip
sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
Pobierz znaczniki dla bieżącej instancji:
aws ec2 describe-tags --filters "Name=resource-id,Values=`ec2metadata --instance-id`"
Wyjścia:
{
"Tags": [
{
"ResourceType": "instance",
"ResourceId": "i-6a7e559d",
"Value": "Webserver",
"Key": "Name"
}
]
}
Użyj odrobiny Perla, aby wyodrębnić Tagi:
aws ec2 describe-tags --filters \
"Name=resource-id,Values=`ec2metadata --instance-id`" | \
perl -ne 'print "$1\n" if /\"Value\": \"(.*?)\"/'
Zwraca:
Webserver
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 21:57:53
Pobierz i uruchom w tym celu samodzielny plik wykonywalny.
Czasami nie można zainstalować awscli, który zależy od Pythona. docker też może zniknąć.
Oto moja implementacja w golang: https://github.com/hmalphettes/go-ec2-describe-tags
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 03:32:43
Możesz alternatywnie użyć wywołania describe-instances
cli zamiast describe-tags
:
Ten przykład pokazuje, jak uzyskać wartość' my-tag-name ' dla instancji:
aws ec2 describe-instances --instance-id $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --region ap-southeast-2 --query "Reservations[*].Instances[*].Tags[?Key=='my-tag-name'].Value" --output text
Zmień region, aby odpowiadał Twoim lokalnym okolicznościom. Może to być przydatne, gdy twoja instancja ma przywilej opisywania-instancji, ale nie opisuje-tagów w profilu instancji
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 09:04:59