从实例中查询EC2标签

亚马逊最近添加了用键值对标记EC2实例的奇妙function,使大量虚拟机的pipe理更容易一些。

有一些方法可以像其他一些用户设置的数据一样查询这些标签吗? 例如:

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

有没有类似的方式来查询标签?

您可以使用AWS元数据工具 (检索您的实例ID)和新的Tag API的组合来检索当前实例的标签。

一旦你安装了ec2-metadataec2-describe-tags (正如Ranieri在上面的回答中所提到的 ),假设你有一个“Name = Foo”标签,这里有一个shell命令来获取当前实例的“名称”在上面。

假设设置了EC2_PRIVATE_KEY和EC2_CERT环境variables。

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

这将返回Foo

以下bash脚本返回当前ec2实例的名称(“Name”标记的值)。 将“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]*\)[az]*\$:\\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": ["*"] } ] } 

您可以将此脚本添加到您的cloud-init用户数据中,以将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工具:您可以在脚本前使用packagesconfiguration文件将其安装在一个cloud-config文件中,使用已经包含它们的AMI,或者在该文件开始处添加aptyum命令脚本。

为了访问EC2标签,你需要一个类似于你实例的IAMangular色的策略:

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

您可以将该文件原样包含在shell脚本中. /etc/ec2-tags . /etc/ec2-tags ,例如:

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

标签在实例初始化期间被下载,所以它们不会反映随后的变化。


脚本和IAM政策基于itaifrenkel的答案。

对于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) 

如果您不在默认的可用区域,则来自过度连接的结果将返回空白。

 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来获得一个特定的标签(elasticbeanstalk:环境名称在我的情况),那么你可以做到这一点。

 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 

为了得到我过滤的标签的价值,我们pipe道剪切和获得第五个领域。

 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 

通过使用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”,然后你可以创build一个名为“webserver”的节点清单,而puppet的模糊节点匹配将意味着它被用来configuration所有的web服务器。

这个例子假设你build立一个基本的图像与木偶等安装

优点:

1)你不必传递你的凭证

2)你可以像angular色configuration一样细致。

下载并运行一个独立的可执行文件来做到这一点。

有时候不能安装依赖于python的awscli。 docker工人也可能不在场。

这是我在golang中的实现: https : //github.com/hmalphettes/go-ec2-describe-tags

安装AWS CLI:

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