+86 13541016684Mon. - Fri. 10:00-22:00

用AWS CLI定期创建EBS卷的快照

用AWS CLI定期创建EBS卷的快照

用AWS CLI定期创建EBS卷的快照

备份是AWS运维当中非常重要的一个部分,也可以说是重中之重。在这里介绍一下,如何使用AWS CLI定期备份EBS卷。

尽量在搭建EC2时设定EBS卷的自动备份,因为一旦系统上线之后想要设定EBS自动备份需要考虑的因素变多,相对而言较麻烦。

设定EBS卷自动备份流程如下(这次是以CetnOS6为例,给实例附加IAM角色的方法。)

  1. 安装AWS CLI
  2. 创建IAM策略
  3. 创建IAM角色
  4. 创建EC2时附加IAM角色
  5. 测试脚本
  6. 用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的快照了。