在 AWS EC2 实例中读取 TAG Key 的值

Read a TAG Key's value within AWS EC2 instance

我正在尝试读取 ec2 实例的 Name 标签,并使用用户数据自动将其设置为主机名。目前我正在使用

#!/bin/bash
apt update && apt-get install -y awscli
DOMAIN=domain.com
EC2_REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print }')
INSTANCE_ID=$(/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id)
NAME_TAG=$(aws ec2 describe-instances --region=$EC2_REGION --instance-id=$INSTANCE_ID --output text | grep TAGS | grep Name | awk -F"\t" '{print }')
HOSTNAME=$(echo $NAME_TAG | awk '{print tolower([=10=])}' | sed -e 's/ /-/g' -e 's/[()]//g')

代码太繁琐了。有没有更好的方法来实现同样的目标 提前致谢

您可以使用 Python 来解析您的 JSON(我不确定您认为这更简单还是更麻烦......现在我已经努力输入看来我 可读性不强?!):

HOSTNAME=$(aws ec2 describe-instances --instance-id=$INSTANCE_ID | python -c"
import sys
import json
ec2_info = json.loads(''.join(sys.stdin.readlines()))
print [t['Value'] 
          for t in ec2_info['Reservations'][0]['Instances'][0]['Tags'] 
          if t['Key'] == 'Name'][0]
")

这是一个 shell 函数,可以将所有身份文档导出到一个环境中:

get_identity_document() {
    curl -s http://169.254.169.254/latest/dynamic/instance-identity/document \
        | grep -v "[{}]" \
        | sed -e 's/\s*"\([^"]*\)"\s*:\s*"*\([^",]*\)"*,*/export =/' 
}

您只需评估输出即可得到如下内容:

export devpayProductCodes=null
export privateIp=xx.xx.xx.xx
export availabilityZone=us-west-2a
export version=2010-08-31
export instanceId=i-XXXXXXXXXXXXXXXX
export billingProducts=null
export instanceType=t2.large
export accountId=XXXXXXXXXX
export imageId=ami-63ac5803
export pendingTime=2016-04-08T17:55:53Z
export architecture=x86_64
export kernelId=null
export ramdiskId=null
export region=us-west-2

然后一旦你有了它,你就可以使用这些其他人将其他杂项 AWS 实例数据提取到你的 shell env

这是通用的实例数据,后续会提炼:

# Query instance data 
get_instance_data() { 
if [ "" ] ; then
       query="."     
fi     
aws ec2 describe-instances --region= --instance-id= --query "Reservations[].Instances[]${query}" \
       --output text  
}

获取标签数据:

# Get all tags for an instance prefixed by  or tag_
get_instance_tag_vars() {

   get_instance_data   "Tags[]" \
       | tr '\t' '=' \
       | sed -e "s/^/export ${3:-tag_}/" 
}

获取卷 ID

# Get instance volume ID from block device
# eg: get_instance_volume_id $instanceId  $region /dev/sda
get_instance_volume_id() {

   get_instance_data   "BlockDeviceMappings[?starts_with(DeviceName, '')].Ebs.VolumeId" 
}

等您可以附加其他 JMESpath 查询字符串以根据需要进行优化。

即:

eval $(get_identity_document)
eval $(get_instance_tag_vars $instanceId $region)

现在你所有的标签都在你的 shell 的环境中,前缀为 tag_