Query EC2 tags from within instance

前端 未结 14 1736
暗喜
暗喜 2020-12-02 05:57

Amazon recently added the wonderful feature of tagging EC2 instances with key-value pairs to make management of large numbers of VMs a bit easier.

Is there some way

相关标签:
14条回答
  • 2020-12-02 06:39

    For Python:

    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)
    
    0 讨论(0)
  • 2020-12-02 06:41

    I have pieced together the following that is hopefully simpler and cleaner than some of the existing answers and uses only the AWS CLI and no additional tools.

    This code example shows how to get the value of tag 'myTag' for the current EC2 instance:

    Using describe-tags:

    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
    

    Or, alternatively, using describe-instances:

    aws ec2 describe-instances --instance-id $instance_id \
      --query 'Reservations[].Instances[].Tags[?Key==`myTag`].Value' --output text
    
    0 讨论(0)
  • 2020-12-02 06:42

    Once you've got ec2-metadata and ec2-describe-tags installed (as mentioned in Ranieri's answer above), here's an example shell command to get the "name" of the current instance, assuming you have a "Name=Foo" tag on it.

    Assumes EC2_PRIVATE_KEY and EC2_CERT environment variables are set.

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

    This returns Foo.

    0 讨论(0)
  • 2020-12-02 06:42

    You can alternatively use the describe-instances cli call rather than describe-tags:

    This example shows how to get the value of tag 'my-tag-name' for the instance:

    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
    

    Change the region to suit your local circumstances. This may be useful where your instance has the describe-instances privilege but not describe-tags in the instance profile policy

    0 讨论(0)
  • 2020-12-02 06:45

    A variation on some of the answers above but this is how I got the value of a specific tag from the user-data script on an instance

    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')
    
    0 讨论(0)
  • 2020-12-02 06:48

    For those crazy enough to use Fish shell on EC2, here's a handy snippet for your /home/ec2-user/.config/fish/config.fish. The hostdata command now will list all your tags as well as the public IP and hostname.

    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
    
    0 讨论(0)
提交回复
热议问题