代码之家  ›  专栏  ›  技术社区  ›  Josh Lindsey

从实例内查询EC2标记

  •  88
  • Josh Lindsey  · 技术社区  · 14 年前

    Amazon最近增加了用键值对标记EC2实例的出色功能,使对大量虚拟机的管理更加容易。

    是否有某种方法可以以与其他一些用户集数据相同的方式查询这些标记?例如:

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

    是否有类似的方法来查询标签?

    11 回复  |  直到 5 年前
        1
  •  35
  •   drxzcl    14 年前

    您可以使用 AWS metadata tool (检索实例ID)和 new Tag API 检索当前实例的标记。

        2
  •  45
  •   Community Jaime Torres    7 年前

    一旦你得到 ec2-metadata ec2-describe-tags 已安装(如中所述 Ranieri's answer above ,这里是一个示例shell命令,用于获取当前实例的“name”,假设您在它上面有一个“name=foo”标记。

    假设设置了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 .

        3
  •  39
  •   itaifrenkel    10 年前

    下面的bash脚本返回当前EC2实例的名称(“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": ["*"]
        }
      ]
    }
    
        4
  •  12
  •   Andrea    10 年前

    您可以将此脚本添加到 云初始化 要将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
    

    您需要在系统上安装AWS CLI工具:您可以使用 packages 在脚本之前的云配置文件中,使用已经包含它们的AMI,或者添加 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的答案。

        5
  •  8
  •   slm    8 年前

    如果您不在默认的可用性区域中,过度思考的结果将返回空的。

    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)
    

    如果您想添加一个过滤器来获取一个特定的标签(在我的例子中是elasticbeanstalk:environment name),那么您可以这样做。

    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
    
        6
  •  5
  •   Sergei    10 年前

    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)
    
        7
  •  3
  •   Ben Waine    11 年前

    使用AWS的“用户数据”和“元数据”API,可以编写一个脚本来包装Puppet以使用自定义证书名称启动Puppet运行。

    首先使用自定义用户数据启动AWS实例:“role: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 
    

    这会调用证书名为'webserver.i-hfg453.aws'的puppet,然后您可以创建一个名为'webserver'的节点清单,puppets'fuzzy node matching'将意味着它用于提供所有webserver。

    本例假设您在安装了Puppet等的基础映像上构建。

    效益:

    1)你不必交出你的证件

    2)您可以根据自己的喜好对角色配置进行细化。

        8
  •  3
  •   Alex Harvey    5 年前

    您也可以使用 describe-instances cli调用而不是 describe-tags :

    此示例显示如何获取实例的标记“我的标记名”的值:

    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
    

    根据当地情况更改区域。如果您的实例具有“描述实例”特权,但在实例配置文件策略中没有“描述标记”,则这可能很有用。

        9
  •  1
  •   Patrick Collins    9 年前

    安装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"
            }
        ]
    }
    

    使用一点Perl来提取标签:

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

    返回:

    Webserver
    
        10
  •  1
  •   hmalphettes    9 年前

    下载并运行一个独立的可执行文件。

    有时不能安装依赖于python的awscli。Docker也可能不在照片中。

    以下是我在戈兰的实施: https://github.com/hmalphettes/go-ec2-describe-tags

        11
  •  0
  •   Alex Harvey    5 年前

    我拼凑了以下内容,希望它们比现有的一些答案更简单、更清晰,并且只使用AWS CLI,不使用其他工具。

    此代码示例显示如何获取当前EC2实例的标记“mytag”的值:

    使用 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
    

    或者,也可以使用 describe-instances :

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