【问题标题】:How to run a AWS CLI command using crontab for every minute如何每分钟使用 crontab 运行 AWS CLI 命令
【发布时间】:2018-01-25 18:57:40
【问题描述】:

我有 AWS CLI 命令来创建数据库快照,我想创建具有当前时间戳的数据库快照。
我无法使用 cron 选项卡运行命令。

要创建 Amazon RDS 数据库实例,请使用以下命令

aws rds create-db-instance --db-instance-identifier testrds --allocated-storage 5 --db-instance-class db.m1.small --engine mysql --availability-zone us-east-1d --master-username rajuuser --master-user-password mrajuuser --port 7007 --no-multi-az --no-auto-minor-version-upgrade  

创建数据库快照使用下面的命令

aws rds create-db-snapshot --db-instance-identifier testrds --db-snapshot-identifier testrds

shell 脚本我在关注什么

#!/bin/sh
#echo "Hello world"

now=$(date +"%Y-%m-%d-%H-%M-%S")
cd /home/ubuntu
cmd="$(aws rds create-db-snapshot --db-instance-identifier testrds --db-snapshot-identifier testrds:"$(now)")"

echo $cmd

【问题讨论】:

  • 这听起来是个坏主意。您每分钟创建一个快照的用例是什么?这可能很快就会变得成本高昂,更不用说创建快照可能需要超过 60 秒的时间。如果您希望将其用于“备份”目的,请考虑仅使用内置 RDS 备份和“时间点”恢复 (docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PIT.html)
  • 彼得森,我的目的是从人们那里获得解决方案,并运行这个脚本。我只是以分钟为单位提到时间,实际上我每天都需要它。我们知道 AWS RDS 只会提供 35 天的备份,所以我想每天手动拍摄一次数据库快照。你对此有什么了解吗?
  • 有什么问题? could not able to run the command 没有任何意义。尝试给出aws 的完整路径。 cd /home/ubuntu 实现了什么?

标签: shell amazon-web-services cron amazon-rds


【解决方案1】:

我遇到了同样的错误,我发现提供 aws cli 的完整路径解决了这个问题(对我来说,与 hjpotter 中的答案不同)。

#!/bin/sh
HOME="/home/ubuntu"
AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
d=$(date +"%Y-%m-%d-%H-%M")
/home/ubuntu/.local/bin/aws rds create-db-snapshot --db-instance-identifier myid --db-snapshot-identifier prod-scheduled-$d

由于 AWS 每天只创建一次 RDS 快照,我的要求是每天创建几个快照,按照固定的时间表,从 cronjob 中触发(例如,在早上 6 点、上午 10 点、下午 2 点、下午 6 点、晚上 10 点)。

所以,为了保持“合理”的成本,我还添加了一个步骤来删除昨天拍摄的所有“cron”快照:

y=$(date -d "1 day ago" +"%Y-%m-%d-%H-%M")
aws rds delete-db-snapshot --db-snapshot-identifier prod-scheduled-$y

这样我可以每天保留一张快照用于历史目的,并保留最近 24 小时的几张快照,以防我需要缩短间隔。

虽然这不是问题的一部分,但 Luke Petersen 评论说成本太高,也许其他人也有同样的要求(和我一样)。

最后一件事:使用Restore to a point in time 功能可以实现类似(和 AFAIK,更清洁)的解决方案,它使用每日快照和事务日志将 db-instance 恢复到自定义的特定日期和时间(在备份保留期内)。

【讨论】:

    【解决方案2】:

    我有一个类似的 cron 任务设置来备份 EC2 中的某些实例。我是这样设置的:

    $ crontab -l
    0 14 * * * /usr/bin/zsh /home/hjpotter92/snapshot.zsh
    

    以及snapshot.zsh的内容:

    #!/usr/bin/zsh
    
    HOME="/home/hjpotter92"
    AWS_HOME="$HOME/.aws"
    PATH="/usr/local/bin:/usr/bin:/bin:$PATH"
    DATE=`date +%c`
    
    aws ec2 create-snapshot --volume-id XXXXXXXX \
        --description "${DATE}" \
        --profile hjpotter92 \
        --region "us-west-2" >> /home/hjpotter92/cron.out 2>&1
    

    请注意,虽然我上面的脚本是可执行的(x 权限位设置),但我仍然为其提供 shell 名称。

    问题是,您的命令存在字符串/变量插值问题。

    另外,/bin/sh 没有其他 shell 提供的很多功能。将脚本的 head 部分更改为使用 bash(?)。

    #!/bin/bash
    now=$(date +"%Y-%m-%d-%H-%M-%S")
    cd /home/ubuntu
    aws rds create-db-snapshot --db-instance-identifier testrds --db-snapshot-identifier "testrds:${now}" >> some-log.txt
    

    【讨论】:

    • Potter,我将为 RDS 实施此解决方案,并让您知道,谢谢。
    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 2021-12-17
    • 2012-01-18
    • 2019-11-04
    • 2018-11-10
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多