各位,我正在编写一个脚本,用于将正在运行的实例的标签导出为环境变量。自动缩放组的问题是这些标签不适用于实例。
如何通过 api/aws cli 命令知道实例属于哪个自动扩展组?我需要在脚本中使用实例标签,但它们不可用。有什么建议吗?
谢谢!
答案1
如何通过 api/aws cli 命令知道实例属于哪个自动缩放组?
您可以将该autoscaling describe-auto-scaling-instances
命令与选项一起 使用--instance-ids
,如下所示:
aws autoscaling describe-auto-scaling-instances --instance-ids="i-zzxxccvv"
自动缩放组的问题在于这些标签不适用于实例。[...] 我需要在脚本中使用实例标签,但它们不可用。有什么建议吗?
我理解为您想要获取实例所属的自动缩放组的标签?使用AutoScalingGroupName
上面显示的命令返回的结果,您可以使用以下命令:
aws autoscaling describe-tags --filters Name=auto-scaling-group,Values=name-of-the-auto-scaling-group-here
答案2
查找实例的自动扩展组的最简单方法是检查标签。自动扩展组中的任何实例都将具有一个aws:autoscaling:groupName
包含组名的标签。您可以使用以下命令检索该标签:
aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE}" "Name=key,Values=aws:autoscaling:groupName"
然后您可以按照 Bazze 的描述获取标签。
解决此问题的另一种解决方案是将标签从自动缩放组传播到实例。
如果您使用 cloudformation 创建 ASG,则为"PropagateAtLaunch": "true"
要传播的每个标签进行设置(请参阅AWS 云形成文档)。
如果您手动创建组,请确保选中每个标签的“标记新实例”框。
完成此操作后,标签将被复制到实例,您可以使用 describe tags 命令简单地检查实例的标签:
aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE}"
我发现jq
处理 aws cli 工具的输出很有帮助。例如,以下命令key=value
从 JSON 生成一个列表:
aws ec2 describe-tags --filters "Name=resource-id,Values=${INSTANCE}" | jq -r '.Tags[] | @text "\(.Key)=\(.Value)"'
答案3
综上所述:
INSTANCE_ID=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
ASG_NAME=`aws ec2 describe-tags --filters "Name=resource-id,Values=$INSTANCE_ID" --region us-east-2 | jq '.Tags[] | select(.["Key"] | contains("aws:autoscaling:groupName")) | .Value'`
ASG_NAME=`echo $ASG_NAME | tr -d '"'`
做一个echo $ASG_NAME
你就会看到它。
答案4
最简单的获取自动缩放组名称的方法如下:
aws autoscaling describe-auto-scaling-instances --query=AutoScalingInstances[].AutoScalingGroupName --instance-ids=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) --output text