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?

Author: Arafat Nalkhande, 2010-10-07

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.

 33
Author: drxzcl,
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.

 42
Author: overthink,
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": ["*"]
    }
  ]
}
 39
Author: itaifrenkel,
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.

 11
Author: Andrea,
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
 6
Author: Michael Connor,
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)
 5
Author: Sergei,
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.

 3
Author: Ben Waine,
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
 1
Author: Patrick Collins,
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

 1
Author: hmalphettes,
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

 0
Author: shonky linux user,
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