用AWS CLI定期创建EBS卷的快照
备份是AWS运维当中非常重要的一个部分,也可以说是重中之重。在这里介绍一下,如何使用AWS CLI定期备份EBS卷。
尽量在搭建EC2时设定EBS卷的自动备份,因为一旦系统上线之后想要设定EBS自动备份需要考虑的因素变多,相对而言较麻烦。
设定EBS卷自动备份流程如下(这次是以CetnOS6为例,给实例附加IAM角色的方法。)
- 安装AWS CLI
- 创建IAM策略
- 创建IAM角色
- 创建EC2时附加IAM角色
- 测试脚本
- 用cron定期执行脚本
1. 安装AWS CLI
安装AWS CLI的详细方法参照安装 AWS Command Line Interface。
使用「捆绑安装程序安装 AWS CLI」的方法,在这里首先安装unzip程序。
$ sudo yum install unzip
$ curl “https://s3.amazonaws.com/aws-cli/awscli-bundle.zip” -o “awscli-bundle.zip”
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
Running cmd: /usr/bin/python virtualenv.py –python /usr/bin/python /usr/local/aws
Running cmd: /usr/local/aws/bin/pip install –no-index –find-links file:///tmp/awscli-bundle/packages awscli-1.10.14.tar.gz
You can now run: /usr/local/bin/aws –version
$ aws –version
aws-cli/1.10.14 Python/2.6.6 Linux/2.6.32-573.18.1.el6.x86_64 botocore/1.4.5
2. 创建IAM策略
2-1. 访问IAM管理页面
选择左侧的「策略」->「创建策略」。
2-2. 创建您自己的策略
选择「创建您自己的策略」。
2-3. 创建策略
在这里填写「简略名称」,「概述」及「策略文档」之后,点击「创建策略」。「简略名称」尽量填写容易辨认策略内容的名称,「概述」适当的填写关于策略的说明(禁止使用中文),而「策略文档」里的设定是,仅拥有创建和删除快照的权限。
具体的填写内容如下。
- 简略名称:AmazonEC2CreateSnapshots
- 概述:Daily Backup EC2 EBS
- 策略文档
{
“Version”: “2012-10-17″,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: [
“ec2:Describe*”,
“ec2:CreateSnapshot”,
“ec2:DeleteSnapshot”
],
“Resource”: “*”
}
]
}
2-4. 确认策略以创建
3. 创建IAM角色
3-1. 创建角色
选择左侧栏的「角色」->「创建新角色」。
3-2. 设置角色名称
这次把角色名称设置为「AmazonEC2CreateSnapshots」。
3-3. 选择角色类型
选择「Amazon EC2」。
3-4. 附加策略
把在第2步创建的「AmazonEC2CreateSnapshots」策略,附加到该角色。
4. 创建EC2时附加IAM角色
创建AWS EC2时,在「3.配置实例」页面里把「IAM角色」里选择「AmazonEC2CreateSnapshots」,需注意的是创建EC2实例之后此选项目前不支持修改。
5. 测试脚本
以下是使用AWS CLI自动创建EBS快照的脚本(仅供参考)。
#!/bin/sh
CURL=/usr/bin/curl
LOGGER=/usr/bin/logger
ECHO=/bin/echo
CUT=/bin/cut
AWS=/usr/local/bin/aws
GREP=/bin/grep
AWK=/bin/awk
WC=/usr/bin/wc
SORT=/bin/sort
DATE=/bin/date
EXPR=/usr/bin/expr
SNAPSHOT_GEN=2
log(){
local product_name pid level msg
if [ $# -eq 2 ]; then
product_name=${0##*/}
pid=$$
level=$1
msg=$2
if [ “${level}” = “ERR” ] ; then
${LOGGER} -t “${level}” “=== ERROR === : ${product_name}[${pid}] ${msg}”
else
${LOGGER} -t “${level}” “${product_name}[${pid}] ${msg}”
fi
fi
}
create_snapshot() {
log “INFO” “Start create snapshot for AWS_EBS:Volume ${VOL_ID}”
${AWS} –region ${REGION} ec2 create-snapshot –volume-id ${VOL_ID} –description “Created by Daily backup(${INSTANCE_ID}) from ${VOL_ID}” > /dev/null 2>&1
if [ $? -ne 0 ] ; then
log “ERR” “ec2-create-snapshot failed AWS_EBS:Volume ${VOL_ID} [202]”
exit 202
fi
log “INFO” “End create snapshot for AWS_EBS:Volume ${VOL_ID}”
}
delete_snapshot() {
local cnt=0
log “INFO” “Start delete snapshot AWS_EBS:Volume ${VOL_ID}”
SNAPSHOTS=`${AWS} –region ${REGION} ec2 describe-snapshots –filters Name=volume-id,Values=${VOL_ID} –output text | ${GREP} ‘Created by Daily backup’ | ${SORT} -k12 -r | ${AWK} ‘{print $11}’`
for SNAPSHOT in ${SNAPSHOTS}; do
if [ ${cnt} -ge ${SNAPSHOT_GEN} ]; then
${AWS} –region ${REGION} ec2 delete-snapshot –snapshot-id ${SNAPSHOT} && log “INFO” “ec2-delete-snapshot : ${SNAPSHOT}”
fi
cnt=`${EXPR} ${cnt} + 1`
done
log “INFO” “End delete snapshot AWS_EBS:Volume ${VOL_ID}”
}
log “INFO” “Script is START.”
AZ=`${CURL} -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
LN=`${ECHO} $((${#AZ} – 1))`
REGION=`${ECHO} ${AZ} | ${CUT} -c 1-${LN}`
INSTANCE_ID=`${CURL} -s http://169.254.169.254/latest/meta-data/instance-id`
VOL_IDS=`${AWS} –region ${REGION} ec2 describe-instances –instance-ids ${INSTANCE_ID} –output text | ${GREP} ‘^EBS’ | ${AWK} ‘{print $5}’`
for VOL_ID in ${VOL_IDS}; do
create_snapshot
done
for VOL_ID in ${VOL_IDS}; do
delete_snapshot
done
log “INFO” “Script is END.”
exit 0
在这个脚本里需要修改的是保存快照数(第15行 SNAPSHOT_GEN=2),这里的2是意味着EBS快照保存最新的2个。
6. 用cron定期执行脚本
使用cron定期执行该脚本,就可以自动获取AWS EBS的快照了。