उदाहरण के भीतर से क्वेरी EC2 टैग


96

अमेज़ॅन ने हाल ही में बड़ी संख्या में वीएम के प्रबंधन को आसान बनाने के लिए कुंजी-मूल्य जोड़े के साथ EC2 उदाहरणों को टैग करने की अद्भुत सुविधा को जोड़ा।

क्या इन टैगों को क्वेरी करने का कोई तरीका है जैसे कुछ अन्य उपयोगकर्ता-सेट डेटा? उदाहरण के लिए:

$ curl http://169.254.169.254/latest/meta-data/placement/availability-zone
us-east-1d

क्या टैग को क्वेरी करने का कुछ समान तरीका है?

जवाबों:


35

आप वर्तमान उदाहरण के लिए टैग को पुनः प्राप्त करने के लिए AWS मेटाडेटा टूल (अपनी आवृत्ति ID को पुनः प्राप्त करने के लिए) और नए टैग API के संयोजन का उपयोग कर सकते हैं ।


ठीक है, मैंने उस लिंक का अनुसरण किया, और ऐसा लग रहा है कि यह एपीआई दस्तावेज है। क्या कोई उपकरण नहीं है जिसका मैं उपयोग कर सकता हूं, या क्या मुझे एपीआई प्रलेखन को पढ़ने और अपने स्वयं के उपकरण को लिखने की आवश्यकता है?
एडवर्ड फॉक

3
क्या Ec2-description-tags कमांड आसानी से उपलब्ध है? माना जाता है कि यह ec2-api-tools पैकेज में है, लेकिन मुझे 404 का कुछ नहीं मिला, जब मैंने इसे स्थापित करने का प्रयास किया।
एडवर्ड फॉक

2
एक उदाहरण दें, टैग भूमिका मान प्राप्त करें: aws ec2 वर्णन-टैग-filters नाम = संसाधन-आईडी, मान = ec2metadata --instance-id--out = json | jq ’.Tags [] चयन करें (.Key == "भूमिका"))
.लव्यू

11
यह एक उत्तर के लिए एक संकेतक है, लेकिन स्वयं के जवाब में नहीं है
रॉय ट्रुवेलोव

3
ec2metadataउपकरण मान्य नहीं है। अब आप 169.254.169.254/latest/meta-data पर 'मैजिक' URL को क्वेरी करते हैं - इसे cURL के साथ हिट करते हैं और यह आपको मैजिक एंडपॉइंट देता है जिसका उपयोग आप विभिन्न बिट्स डेटा प्राप्त करने के लिए कर सकते हैं। इस मामले में curl http://169.254.169.254/latest/meta-data/instance-idआपके उदाहरण के लिए ID
Asfand Qazi

52

निम्न बैश स्क्रिप्ट आपके वर्तमान ec2 उदाहरण ("नाम" टैग का मान) का नाम देता है। TAG_NAME को अपने विशिष्ट मामले में संशोधित करें।

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`"

Aws cli स्थापित करने के लिए

sudo apt-get install python-pip -y
sudo pip install awscli

यदि आप स्पष्ट क्रेडेंशियल के बजाय IAM का उपयोग करते हैं, तो इन IAM अनुमतियों का उपयोग करें:

{
  "Version": "2012-10-17",
  "Statement": [
    {    
      "Effect": "Allow",
      "Action": [ "ec2:DescribeTags"],
      "Resource": ["*"]
    }
  ]
}

मुझे "आप इस ऑपरेशन को करने के लिए अधिकृत नहीं हैं" मिल रहा था aws ec2 describe-tags। मुझे अपनी IAM भूमिका की इनलाइन नीतियों में इस IAM को जोड़ने की आवश्यकता थी। धन्यवाद!
विक्टर डी।

के | cut -f5साथ प्रतिस्थापित करने के लिए एक बहुत मामूली अनुकूलन COULD होना चाहिए --query="Tags[0].Value"
रिचर्ड ए क्वाडलिंग

47

एक बार जब आप मिल जाते हैं ec2-metadataऔर ec2-describe-tagsस्थापित हो जाते हैं (जैसा कि रानियरी के उत्तर में उल्लेख किया गया है ), तो वर्तमान उदाहरण का "नाम" प्राप्त करने के लिए एक उदाहरण शेल कमांड है, मान लें कि आपके पास इस पर "नाम = फू" टैग है।

EC2_PRIVATE_KEY और EC2_CERT परिवेश चर मान लिए गए हैं।

ec2-describe-tags \
  --filter "resource-type=instance" \
  --filter "resource-id=$(ec2-metadata -i | cut -d ' ' -f2)" \
  --filter "key=Name" | cut -f5

यह लौटाता है Foo


17
यह अच्छा होता अगर मेरी प्रक्रियाओं को मौजूदा उदाहरण के लिए टैग मिल सकते थे बिना उदाहरण के EC2_PRIVATE_KEY हो। :-(
विलियम पायने

1
@ william-payne हाँ, यह वास्तव में लंगड़ा है। शायद अमेज़ॅन के IAM का उपयोग करके आप कम से कम किसी भी चीज़ तक सीमित पहुंच वाले उपयोगकर्ता का उपयोग कर सकते हैं। FWIW, मैं इस दृष्टिकोण का उपयोग किसी भी अधिक नहीं करता हूं और बस बॉक्स को सेटअप करने के लिए बाहरी स्क्रिप्ट का उपयोग करता हूं।
overthink

12
@WilliamPayne आप "Amazon EC2 रीड ओनली एक्सेस" पॉलिसी के साथ IAM रोल सेट कर सकते हैं और उस भूमिका वाले उदाहरण को बना सकते हैं। यदि आप अधिक बारीक होना चाहते हैं, तो केवल "DescribeTags" विशेषाधिकार वाली एक कस्टम पॉलिसी बनाना भी संभव है।
रोवरवुल्फ़

@WilliamPayne को रोवरवॉल्फ का सुझाव पसंद आया। इसने बहुत अच्छा काम किया। यदि आप इसे देखना चाहते हैं, तो मैंने वास्तव में विवरण के साथ एक और प्रश्न का उत्तर दिया: stackoverflow.com/questions/9950586/…
टोनी

2
ध्यान दें कि ec2-describe-tagsचूक us-east-2। कृपया --regionएक अलग क्षेत्र का उपयोग करने के लिए ध्वज को पास करें ।
advait

15

आप स्थानीय स्क्रिप्ट में EC2 टैग डाउनलोड करने के लिए इस स्क्रिप्ट को अपने क्लाउड-इनिट उपयोगकर्ता डेटा में जोड़ सकते हैं :

#!/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

आप एडब्ल्यूएस CLI उपकरण आपके सिस्टम पर स्थापित की जरूरत है: या तो आप उन्हें एक साथ स्थापित कर सकते हैं packagesअनुभाग एक क्लाउड-कॉन्फ़िग फ़ाइल में स्क्रिप्ट से पहले, एक एएमआई का उपयोग करें कि उन्हें पहले से ही शामिल है, या एक जोड़ने aptया yumस्क्रिप्ट की शुरुआत में आदेश।

EC2 टैग का उपयोग करने के लिए आपको अपनी उदाहरण IAM भूमिका में इस तरह की नीति की आवश्यकता होती है:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1409309287000",
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeTags"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

उदाहरण का EC2 टैग /etc/ec2-tagsइस प्रारूप में उपलब्ध होगा :

FOO="Bar"
Name="EC2 tags with cloud-init"

. /etc/ec2-tagsउदाहरण के लिए, आप शेल स्क्रिप्ट में फ़ाइल को शामिल कर सकते हैं :

#!/bin/sh
. /etc/ec2-tags
echo $Name

उदाहरण के प्रारंभ के दौरान टैग डाउनलोड किए जाते हैं, इसलिए वे बाद के परिवर्तनों को प्रतिबिंबित नहीं करेंगे।


पटकथा और IAM नीति itaifrenkel के उत्तर पर आधारित है।


a + इस विधि को पसंद करते हैं
Cmag

aws:autoscaling:groupName
ऑटोकॉस्टिंग

2
फिर यह प्रयास करें: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
रयान गुलर

10

यदि आप डिफ़ॉल्ट उपलब्धता क्षेत्र में नहीं हैं, तो ओवरथिंक से परिणाम खाली लौट आएंगे।

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)

यदि आप एक विशिष्ट टैग पाने के लिए एक फिल्टर जोड़ना चाहते हैं (मेरे मामले में लोचनीय: पर्यावरण-नाम) तो आप ऐसा कर सकते हैं।

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

और उस टैग के लिए केवल मूल्य प्राप्त करने के लिए जिसे मैंने फ़िल्टर किया था, हम पांचवें क्षेत्र को काटने और प्राप्त करने के लिए पाइप करते हैं।

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

महान काम है, धन्यवाद, अगर आप नाम टैग को बदलने की जरूरत है एक अलग DNS उदाहरण-डेटा मेरे लिए काम नहीं कर रहा है, पिछले एक के लिए होने elasticbeanstalk:environment-nameके साथName
detzu

5

अजगर के लिए:

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)

कानूनी। पाठकों को बुनियादी स्थानीय जानकारी के लिए ध्यान दें, आपको क्रेडेंशियल्स की भी आवश्यकता नहीं है, बसinstance_metadata = utils.get_instance_metadata(timeout=0.5, num_retries=1)
बार्टवड्स

इसके अलावा, यह आईएएम भूमिकाओं के साथ अच्छी तरह से निभाता है - यदि आप एक उदाहरण भूमिका निर्धारित करते हैं, तो बोटो स्वचालित रूप से आईडी और कुंजी का पता लगाएगा।
dbn

5

आप वैकल्पिक describe-instancesरूप से इसके बजाय cli कॉल का उपयोग कर सकते हैं describe-tags:

यह उदाहरण दिखाता है कि उदाहरण के लिए 'my-tag-name' टैग का मूल्य कैसे प्राप्त करें:

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

अपनी स्थानीय परिस्थितियों के अनुरूप क्षेत्र बदलें। यह उपयोगी हो सकता है जहां आपके उदाहरण में वर्णन-उदाहरण विशेषाधिकार हैं, लेकिन उदाहरण प्रोफ़ाइल नीति में वर्णन-टैग नहीं हैं


3

एडब्ल्यूएस 'उपयोगकर्ता डेटा' और 'मेटा डेटा' एपीआई का उपयोग करके एक स्क्रिप्ट लिखना संभव हो जाता है, जो एक कस्टम प्रमाणित नाम के साथ कठपुतली चलाने के लिए कठपुतली को लपेटता है।

पहले कस्टम उपयोगकर्ता डेटा के साथ anws उदाहरण शुरू करें: 'भूमिका: वेबसर्वर'

#!/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 

यह कठपुतली को 'webserver.i-hfg453.aws' जैसे सर्टिफिकेट से पुकारता है, फिर आप 'वेबसर्वर' नाम का एक नोड प्रकट कर सकते हैं और कठपुतलियों की 'फजी नोड मिलान' का अर्थ यह होगा कि यह सभी वेबसर्वरों को व्यवस्थित करने के लिए उपयोग किया जाता है।

यह उदाहरण मानता है कि आप कठपुतली स्थापित आदि के साथ एक आधार छवि का निर्माण करते हैं।

लाभ:

1) आपको अपने क्रेडेंशियल्स को राउंड पास नहीं करना है

2) आप के रूप में के रूप में आप भूमिका विन्यास के साथ की तरह दानेदार हो सकता है।


3

मैंने निम्नलिखित में से एक साथ pieced किया है जो मौजूदा कुछ उत्तरों की तुलना में उम्मीद से सरल और क्लीनर है और केवल AWS CLI और कोई अतिरिक्त टूल का उपयोग नहीं करता है।

यह कोड उदाहरण दिखाता है कि मौजूदा EC2 उदाहरण के लिए टैग 'myTag' का मान कैसे प्राप्त करें:

वर्णन-टैग का उपयोग करना :

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

या, वैकल्पिक रूप से, वर्णन-उदाहरणों का उपयोग करके :

aws ec2 describe-instances --instance-id $instance_id \
  --query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text

2

ऊपर दिए गए कुछ जवाबों पर भिन्नता है लेकिन यह है कि कैसे मैंने एक उदाहरण पर उपयोगकर्ता-डेटा स्क्रिप्ट से एक विशिष्ट टैग का मूल्य प्राप्त किया

REGION=$(curl http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')

INSTANCE_ID=$(curl -s http://instance-data/latest/meta-data/instance-id)

TAG_VALUE=$(aws ec2 describe-tags --region $REGION --filters "Name=resource-id,Values=$INSTANCE_ID" "Name=key,Values='<TAG_NAME_HERE>'" | jq -r '.Tags[].Value')

1

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

वर्तमान उदाहरण के लिए टैग प्राप्त करें:

aws ec2 describe-tags --filters "Name=resource-id,Values=`ec2metadata --instance-id`"

आउटपुट:

{
    "Tags": [
        {
            "ResourceType": "instance", 
            "ResourceId": "i-6a7e559d", 
            "Value": "Webserver", 
            "Key": "Name"
        }
    ]
}

टैग निकालने के लिए पर्ल का थोड़ा प्रयोग करें:

aws ec2 describe-tags --filters \
"Name=resource-id,Values=`ec2metadata --instance-id`" | \
perl -ne 'print "$1\n" if /\"Value\": \"(.*?)\"/'

यह दिखाता है:

Webserver

ec2metadataanws-cli में नहीं है, लेकिन इसके साथ प्रतिस्थापित किया जा सकता है curl --silent http://169.254.169.254/latest/meta-data/instance-id। इसके अलावा, jqजसन को आसान बना सकते हैं, या एक अलग आउटपुट स्वरूप और भी आसान है।
tedder42

यह काम करता है, हालांकि मुझे निम्नलिखित जोड़ने की जरूरत है: sudo apt-get -y install pythonऔरexport AWS_DEFAULT_REGION=us-west-1
यूजीन

यह काम नहीं करेगा ... 1. ec2metadata गलत कमांड है। 2. ec2-metadata - आइंस्टीन-आईडी वापस आएगाinstance-id: i-07f59f3564618f148
डैनियल

1

ऐसा करने के लिए एक स्टैंडअलोन निष्पादन योग्य डाउनलोड और चलाएं।

कभी-कभी कोई अक्स्ली को स्थापित नहीं कर सकता है जो अजगर पर निर्भर करता है। डॉकटर तस्वीर से बाहर भी हो सकता है।

यहाँ golang में मेरा कार्यान्वयन है: https://github.com/hmalphettes/go-ec2-describe-tags


1

Jq + ec2metadata इसे थोड़ा अच्छा बनाता है। मैं cf का उपयोग कर रहा हूं और इस क्षेत्र में पहुंच रखता हूं। वरना आप इसे बैश में पकड़ सकते हैं।

aws ec2 describe-tags --region $REGION \
--filters "Name=resource-id,Values=`ec2metadata --instance-id`" | jq --raw-output \
'.Tags[] | select(.Key=="TAG_NAME") | .Value'

0

EC2 पर मछली के खोल का उपयोग करने के लिए पर्याप्त पागल लोगों के लिए, यहां आपके /home/ec2-user/.config/fish/config.fish के लिए एक आसान स्निपेट है। होस्टडेटा कमांड अब आपके सभी टैग के साथ-साथ सार्वजनिक आईपी और होस्टनाम को सूचीबद्ध करेगा।

set -x INSTANCE_ID (wget -qO- http://instance-data/latest/meta-data/instance-id)
set -x REGION (wget -qO- http://instance-data/latest/meta-data/placement/availability-zone | sed 's/.$//')

function hostdata
    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"/'
    ec2-metadata | grep public-hostname
    ec2-metadata | grep public-ipv4
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.