如何使用亚马逊AWS CLI命令行工具定期创建EBS卷的快照镜像

   04/04/2016 6:40 pm   大 中 小 简体 繁體 字体:
    322人参与

备份是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」的方法,在这里首先安装unzip程序。

安装AWS CLI

1
2
3
4
5
6
7
8
9
10
$ 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管理页面

AWS IAM管理页面

选择左侧的「策略」->「创建策略」。

2-2. 创建您自己的策略

选择「创建您自己的策略」。

AWS IAM

2-3. 创建策略

在这里填写「简略名称」,「概述」及「策略文档」之后,点击「创建策略」。「简略名称」尽量填写容易辨认策略内容的名称,「概述」适当的填写关于策略的说明(禁止使用中文),而「策略文档」里的设定是,仅拥有创建和删除快照的权限。

AWS IAM

具体的填写内容如下。

  • 简略名称:AmazonEC2CreateSnapshots
  • 概述:Daily Backup EC2 EBS
  • 策略文档
    创建和删除快照的权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {
      ”Version”: “2012-10-17″,
      ”Statement”: [
        {
          "Effect": "Allow",
          "Action": [
            "ec2:Describe*",
            "ec2:CreateSnapshot",
            "ec2:DeleteSnapshot"
          ],
          ”Resource”: “*”
        }
      ]
    }

     

2-4. 确认策略以创建

3. 创建IAM角色

3-1. 创建角色

选择左侧栏的「角色」->「创建新角色」。

aws IAM role

3-2. 设置角色名称

这次把角色名称设置为「AmazonEC2CreateSnapshots」。

3-3. 选择角色类型

选择「Amazon EC2」。

aws iam role

3-4. 附加策略

把在第2步创建的「AmazonEC2CreateSnapshots」策略,附加到该角色。

aws iam role

4. 创建EC2时附加IAM角色

创建AWS EC2时,在「3.配置实例」页面里把「IAM角色」里选择「AmazonEC2CreateSnapshots」,需注意的是创建EC2实例之后此选项目前不支持修改。

aws ec2 实例创建

5. 测试脚本

以下是使用AWS CLI自动创建EBS快照的脚本(仅供参考)。

create_snapshot.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/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的快照了。

关键词: , , , , , , 

最多人阅读内容