AWS - 创建 EC2 快照并自动重命名的脚本

AWS - 创建 EC2 快照并自动重命名的脚本

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

  • 为每个现有卷创建快照。这些卷已经有一个 NAME 标签(如 SERVER1、SERVER1DATA、SERVER2、SERVER2DATA 等)。

  • 重命名使用相同标签名称拍摄的快照(这样,在 AWS 控制台上,我可以按日期过滤它们并能够轻松识别它们)。

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

我一直在尝试使用 ec2-describe-volumes 、 ec2-create-snapshot 和 ec2addtag 命令,但我的脚本编写得不是很好。到目前为止,我能够通过创建一个包含 VOLUME NAME 和 NAME TAG 的列表来设置它(这些参数随后由 ec2addtag 获取),但每次我在环境中添加或删除卷时,我都必须手动更新该列表。

任何帮助都将不胜感激。

答案1

我不确定我是否完全理解了你的问题,但如果你想要的是能够生成你的卷列表以及名称标签,那么这样的操作可能会有效:

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

基本上,这句话的意思是“给我资源 ID 和每个“Volume”类型资源的标签“name”的值”。在本例中,我指定 json 作为输出。您也可以根据需要指定“text”或“table”。

另一种方法:

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

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

然后,您可以使用以下命令获取列表中每个卷的名称标签:

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 vol-2e293949 的资源 id 和标签名称的值。

如您所见,CLI 命令可能难以阅读,过滤和查询有点困难。(这些示例使用了最新版本的 AWS命令行界面

答案2

至于从 create-snapshot 命令中提取快照 ID,您可以使用一些 CLI 功能(查询和输出)来完成此操作,而无需 awk/sed/grep/等。

例如:

$ 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 而不是“文本”,则会根据 JSON 标准用双引号包裹返回的快照 id。

答案3

不久前我写道这个 bash 脚本对我来说就是这么做的。基本上,你把它安装在你想要备份的每个 EC2 实例上,只要你给它一个私钥、一个证书文件和 EC2 API 工具,它就会自动发现实例 ID、附加到它的卷,并为每个卷创建一个快照。

Name您必须使用和标记卷DeviceName这只是快照描述中显示的用户友好名称。Device是服务器上的实际设备名称。/dev/sdf例如。最后,一旦达到预定义的限制,它将轮换您的快照。默认值为 50。创建第 51 个快照时,将删除最旧的快照。

答案4

#!/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

它有点混乱,也许没有必要那么长,但它可以完成所需的工作:创建所有可用卷的快照(如果这些卷有 NAME 标签),然后使用这些 NAME 标签重命名它们。

相关内容