代码之家  ›  专栏  ›  技术社区  ›  Dani Banai

AWS EC2-自动AMI

  •  0
  • Dani Banai  · 技术社区  · 7 年前

    我有一个AWS EC2实例,需要手动访问AWS控制台并创建机器的每日映像(AMI)

    如何对机器进行每日AMI备份并删除旧版本(旧版本则为7天)?

    非常感谢。

    4 回复  |  直到 7 年前
        1
  •  2
  •   Brian    7 年前

    可以通过web控制台执行的任何操作也可以通过CLI执行。

    在这种情况下,我怀疑 aws ec2 create-image , aws ec2 describe-images aws ec2 deregister-image 会让你做你想做的事。

        2
  •  2
  •   Shantanu    7 年前

    AWS lambda将是自动备份ami和清理的正确解决方案。您可以安排lambda函数(基本上是python代码)定期运行。这样,您就不需要一直运行ec2。这里有一个例子 http://powerupcloud.azurewebsites.net/2016/10/15/serverless-automate-ami-creation-and-deletion-using-aws-lambda/

        3
  •  0
  •   Peter Drinnan    4 年前

    下面是我每天通过cron运行的shell脚本。可以设置变量prevday1的值,以设置要保留图像的时间。在你的情况下,你需要7天

    prevday1=$(date --date="7 days ago" +%Y-%m-%d)

    以下是完整的脚本:

    #!/bin/bash
    
    # prior to using this script you will need to install the aws cli on the local machine
    
    # https://docs.aws.amazon.com/AmazonS3/latest/dev/setup-aws-cli.html
    
    # AWS CLI - will need to configure this
    # sudo apt-get -y install awscli 
    # example of current config - july 10, 2020
    #aws configure
    #aws configure set key ARIAW5YUMJT7PO2N7L *fake - user your own*
    #aws configure secret X2If+xa/rFITQVMrgdQVpFLx1c7fwP604QkH/x *fake - user your own*
    #aws configure set region us-east-2
    #aws configure set format json
    
    
    
    # backup EC2 instances nightly 4:30 am GMT
    # 30 4 * * * . $HOME/.profile;  /var/www/devopstools/shell-scripts/file_backup_scripts/ec2_backup.sh
    
    script_dir="$(dirname "$0")"
    
    # If you want live notifications about backups
    #SLACK_API_URL="https://hooks.slack.com/services/T6VQ93KM/BT8REK5/hFYEDUCoO1Bw72wxxFSj7oY"
    
    source "$script_dir/includes/helpers.sh"
    
    prevday1=$(date --date="2 days ago" +%Y-%m-%d)
    prevday2=$(date --date="3 days ago" +%Y-%m-%d)
    today=$(date +"%Y-%m-%d")
    
    instances=()
    # add as many instances to backup as needed
    instances+=("autobackup_impressto|i-0ed78a1f3583e1859")
    
    
    for ((i = 0; i < ${#instances[@]}; i++)); do
    
        instance=${instances[$i]}
    
        instanceName="$(cut -d'|' -f1 <<<"$instance")"
        instanceId="$(cut -d'|' -f2 <<<"$instance")"
    
        prevImageName1="${instanceName}_${prevday1}_$instanceId"
        prevImageName2="${instanceName}_${prevday2}_$instanceId"
        newImageName="${instanceName}_${today}_$instanceId"
    
        consoleout --green "Begin backing $instanceName [$instanceId]"
    
        aws ec2 create-image \
            --instance-id $instanceId \
            --name "$newImageName" \
            --description "$instanceName" \
            --no-reboot
    
        if [ $? -eq 0 ]; then
            echo "$newImageName created."
            echo ""
            if [ ! -z "${SLACK_API_URL}" ]; then
                curl -X POST -H 'Content-type: application/json' --data '{"text":":rotating_light: Backing up *'$newImageName'* to AMI. :rotating_light:"}' ${SLACK_API_URL}        fi 
            echo -e "\e[92mBacking up ${newImageName} to AMI."
        else
            echo "$newImageName not created."
            echo ""
        fi
    
        imageId=$(aws ec2 describe-images --filters "Name=name,Values=${prevImageName1}" --query 'Images[*].[ImageId]' --output text)
    
        if [ ! -z "${imageId}" ]; then
    
            echo "Deregistering ${prevImageName1} [${imageId}]"
            echo ""
            echo "aws ec2 deregister-image --image-id ${imageId}"
            aws ec2 deregister-image --image-id ${imageId}
        fi
    
        imageId=$(aws ec2 describe-images --filters "Name=name,Values=${prevImageName2}" --query 'Images[*].[ImageId]' --output text)
    
        if [ ! -z "${imageId}" ]; then
    
            echo "Deregistering ${prevImageName2} [${imageId}]"
            echo ""
            echo "aws ec2 deregister-image --image-id ${imageId}"
            aws ec2 deregister-image --image-id ${imagesId}
        fi
    
        consoleout --green "Completed backing $instanceName"
    
    done
    

    此处也提供- https://impressto.net/automatic-aws-ec2-backups/

        4
  •  -1
  •   talonx    7 年前

    您可以使用 https://github.com/alestic/ec2-consistent-snapshot 并在cron作业中运行它。它支持各种文件系统,并支持确保数据库快照的一致性。如果实例中没有数据库,它仍然会通过冻结文件系统来确保快照的一致性。