AWS – 创buildEC2快照并自动重命名的脚本

我正在尝试设置脚本(使用来自Ubuntu服务器的AWS CLI),它将执行以下操作:

  • 创build每个现有卷的快照。 这些卷已经有一个名称标签(像SERVER1,SERVER1DATA,SERVER2,SERVER2DATA等)。

  • 重命名那些使用相同标记NAMES拍摄的快照(因此,在AWS控制台上我可以按date筛选它们,并且能够轻松识别它们)。

自动重命名是我的主要问题在这里。

我一直在玩弄ec2-describe-volumes,ec2-create-snapshot和ec2addtag命令,但是我的脚本并不好。 到目前为止,我已经能够通过创build一个名单与体积名称和名称标签(这些参数然后由ec2addtag采取),但我将不得不手动更新该列表,每次我添加或删除环境卷。

任何帮助将不胜感激。

我不是很积极我完全理解你的问题,但是如果你想要的是能够产生你的卷列表,以及名称标签,这样的事情可能会工作:

aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --output json 

基本上是这样说的:“给我的资源id和标签的值”name“为每个types为”Volume“的资源,在这种情况下,我指定了json作为输出,也可以指定”text“或”table “取决于你的需求。

另一种方法:

 aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text 

这将返回您的卷的列表。 如果您将其传送到文本文件,则该文件只包含一个卷标识符列表 – 每行一个。

然后你可以得到这个列表中每个卷的Name标签:

 aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=vol-2e293949" --output json 

这基本上是说“给我的资源ID和标签名称的值为指定的id vol-2e293949。

正如你所看到的,CLI命令可能很难阅读,过滤和查询有点困难。 (这些示例使用最新版本的AWS CLI )

至于从你的create-snapshot命令中提取快照ID,你可以不需要awk / sed / grep / etc。 通过使用几个CLIfunction(查询和输出)。

例如:

 $ SNAP_ID=`aws ec2 create-snapshot --cli-input-json file://$temp_file --query 'SnapshotId' --output text` $ $ echo "snap id: "$SNAP_ID snap id: snap-aaaabbbb $ $ aws ec2 create-tags --resources $SNAP_ID --tags Key=Name,Value=$SOME_NAME $ 

请注意,使用json的输出而不是“text”,它会将返回的快照ID用每个JSON标准的双引号包装起来。

后来我写了这个bash脚本来为我做这件事。 基本上,您将其安装在要备份的每个EC2实例上,并提供给它一个私钥,一个证书文件和EC2 API工具,这将自动发现实例ID,连接的卷以及为每个卷创build一个快照。

您必须使用NameDevice来标记卷。 Name只是一个用户友好的名字,出现在快照的描述中。 Device是服务器上的实际设备名称。 /dev/sdf 。 最后,一旦达到预定义的限制,它将旋转你的快照。 默认值为50.创build第51个快照时,最旧的快照将被删除。

 #!/bin/bash aws ec2 describe-volumes --query "Volumes[*].{ID:VolumeId}" --output text > /tmp/volumes for i in $(cat /tmp/volumes); do aws ec2 create-snapshot --volume-id $i | awk {'print $2'} | grep snap* | sed 's/\"//g'|sed 's/\,//g' > /tmp/snapname SNAPENAME=$(cat /tmp/snapname) TAGNAME=$(aws ec2 describe-tags --query "Tags[*].{Name:Value,ResourceId:ResourceId}" --filters "Name=key,Values=Name" --filters "Name=resource-type,Values=volume" --filters "Name=resource-id,Values=$i" --output text | awk '{ print $1 }') sleep 5 aws ec2 create-tags --resources $SNAPENAME --tags Key=Name,Value=$TAGNAME >/dev/null done 

这有点麻烦,也许不必要很长时间,但它需要做以下事情:为所有可用卷创build一个快照(如果那些有NAME标记),然后用这些NAME标记重命名它们。