![AWS - 创建 EC2 快照并自动重命名的脚本](https://linux22.com/image/637475/AWS%20-%20%E5%88%9B%E5%BB%BA%20EC2%20%E5%BF%AB%E7%85%A7%E5%B9%B6%E8%87%AA%E5%8A%A8%E9%87%8D%E5%91%BD%E5%90%8D%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我目前正在尝试设置一个脚本(使用来自 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
您必须使用和标记卷Device
。Name
这只是快照描述中显示的用户友好名称。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 标签重命名它们。