如何通过AWS CLI的aws ec2 create-tags为多资源同标签设不同值
问题
如果有一批EC2实例ID,要统一修改Name标签可以用这个命令:
aws ec2 create-tags --resources i-0ba60d097b9a4aebc i-051a64ccc686602e3 i-09c6265c16961a7a0 --tags Key=Name,Value=newname
这个命令会把三个实例的Name标签都改成newname。但如果想给每个实例分别设置newname1、newname2、newname3不同的值,直接多次使用--resources和--tags的语法是错误的:
aws ec2 create-tags --resources i-0ba60d097b9a4aebc --tags Key=Name,Value=newname1 --resources i-051a64ccc686602e3 --tags Key=Name,Value=newname2 --resources i-09c6265c16961a7a0 --tags Key=Name,Value=newname3
现在需要实现给每个实例单独设置不同Name标签,但不想为每个实例单独调用aws ec2 create-tags命令,该怎么做?
解决方案
方法1:使用--cli-input-json传入JSON配置
AWS CLI支持通过JSON格式一次性指定多个资源和对应的标签,可在单次命令中完成所有设置。
方式A:通过JSON文件传入
创建一个名为tags-config.json的文件,内容如下:
{ "Resources": [ "i-0ba60d097b9a4aebc", "i-051a64ccc686602e3", "i-09c6265c16961a7a0" ], "Tags": [ { "Key": "Name", "Value": "newname1", "ResourceId": "i-0ba60d097b9a4aebc" }, { "Key": "Name", "Value": "newname2", "ResourceId": "i-051a64ccc686602e3" }, { "Key": "Name", "Value": "newname3", "ResourceId": "i-09c6265c16961a7a0" } ] }
执行命令:
aws ec2 create-tags --cli-input-json file://tags-config.json
方式B:直接在命令行传入JSON字符串
适合实例数量较少的场景,直接把JSON内容写在命令里:
aws ec2 create-tags --cli-input-json '{ "Resources": ["i-0ba60d097b9a4aebc", "i-051a64ccc686602e3", "i-09c6265c16961a7a0"], "Tags": [ {"Key": "Name", "Value": "newname1", "ResourceId": "i-0ba60d097b9a4aebc"}, {"Key": "Name", "Value": "newname2", "ResourceId": "i-051a64ccc686602e3"}, {"Key": "Name", "Value": "newname3", "ResourceId": "i-09c6265c16961a7a0"} ] }'
方法2:Shell循环拼接参数(单次命令执行)
在Bash环境下,可以通过循环拼接命令参数,再单次调用aws ec2 create-tags:
# 定义实例ID和对应名称的数组 INSTANCES=("i-0ba60d097b9a4aebc" "i-051a64ccc686602e3" "i-09c6265c16961a7a0") NAMES=("newname1" "newname2" "newname3") # 循环拼接参数 PARAMS="" for index in "${!INSTANCES[@]}"; do PARAMS="$PARAMS --resources ${INSTANCES[$index]} --tags Key=Name,Value=${NAMES[$index]}" done # 执行命令 aws ec2 create-tags $PARAMS
注意:这种方法存在命令行参数长度限制,若实例数量较多,建议优先使用方法1的JSON配置方式。
内容的提问来源于stack exchange,提问作者sriganesh
相关产品推荐
相关产品推荐

