Amazon EC2 EBS 自动备份单行手动工作,但不是来自 cron

Posted

技术标签:

【中文标题】Amazon EC2 EBS 自动备份单行手动工作,但不是来自 cron【英文标题】:Amazon EC2 EBS automatic backup one-liner works manually but not from cron 【发布时间】:2012-12-01 08:57:29 【问题描述】:

我正在尝试在 Amazon AWS 上为我的 EBS 实施自动备份系统。

当我以ec2-user 运行此命令时:

/opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-******** snapshot" vol-********

一切正常。

但如果我将此行添加到/etc/crontab 并重新启动crond 服务:

15 12 * * * ec2-user /opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-******** snapshot" vol-********

这行不通。

我检查了var/log/cron 并且有这一行,因此命令被执行:

Dec 13 12:15:01 ip-10-204-111-94 CROND[4201]: (ec2-user) CMD (/opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-******** snapshot" vol-******** )

您能帮我解决问题吗?

我猜是一些环境问题——也许是缺少一些变量。如果是这样,我不知道该怎么办。

谢谢。

【问题讨论】:

cron 可能在不同的用户/组下运行,无法访问您的凭据配置 嗨,伙计。我不认为这是问题所在。在命令行和 crontab 上,我都使用 ec2-user。 【参考方案1】:

您应该考虑利用 AWS 的新 IAM Roles 功能。本质上,您所做的是在 IAM 控制面板中创建一个新角色,然后为其分配创建快照的权限。您需要附加到角色的策略如下所示:


  "Statement": [
    
      "Sid": "Stmt1355446824880",
      "Action": [
        "ec2:CreateSnapshot",
        "ec2:DescribeSnapshots",
        "ec2:DescribeVolumes"
      ],
      "Effect": "Allow",
      "Resource": "*"
    
  ]

然后,当您创建实例时,您可以在启动配置中定义 IAM 角色(它位于“高级设置”下)。效果是您的实例现在自动拥有创建快照的权限,您不必担心将访问密钥或其他凭证存储在实例的任何位置。它可以通过 cron 正常工作。

【讨论】:

有趣 - 我正在考虑使用 IAM。看来我需要根据您所说的重新创建实例。对吗? 是的,你会的。理想情况下,实例应该是无状态的(不包含持久数据),所以这不是问题。但是,如果您处于不同的情况,您始终可以将现有配置打包为新的 AMI 并重新启动它,但附加一个 IAM 角色。 有什么方法可以让所有东西保持原样吗?为什么我的解决方案不起作用? 使用 x509 证书进行身份验证已被弃用,并且可能会消失。你最好使用 AWS_ACCESS_KEY 和 AWS_SECRET_KEY 环境变量。但是,您必须将密钥嵌入 AMI 中,这是强烈不鼓励的。这就是为什么使用 AMI 角色是您的最佳选择。【参考方案2】:

对于初学者来说,crontab 没有 $PATH,您还必须导出 EC2_HOME 和 JAVA_HOME。 我建议您制作一个顶部有两个导出的脚本,然后调用创建快照。 这么简单

export EC2_HOME=your_ec2_home
export JAVA_HOME=your_java_home
/opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-******** snapshot" vol-********

根据经验,在脚本中包含备份过程通常是一种很好的做法。 您可以在以下链接中找到示例脚本: https://forums.aws.amazon.com/message.jspa?messageID=350163。 有许多可用的脚本是可定制的,并且大部分 ec2 功能都是自动化的。

【讨论】:

【参考方案3】:

cron 日志显示 cron 正在执行命令,但没有明显效果。您知道 ec2-user 可以从 shell 运行命令。所以首先要确保root可以从shell成功运行这个命令:

sudo bash
/opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-******** snapshot" vol-********

如果这不起作用,则问题不在于 cron,而在于 ec2-user 和 root 帐户之间的差异。我想这可能是基于权限的,但 root 非常强大。这可能是由于他们的环境不同。

当您以 ec2-user 身份运行命令时,您可能会将 AWS_ACCESS_KEY 和 AWS_SECRET_KEY 环境变量设置为有效值。在这种情况下,ec2 命令行工具可能会使用它们并忽略 -K 和 -C 选项。使用 -K 和 -C 指定的凭据可能无效,但您不会知道,因为它们被忽略了。 root 帐户具有不同的环境,可能没有这些变量的有效值。

这可能会发生,因为 Amazon 已弃用使用证书(-K 和 -C 选项)而不是访问密钥。见http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/SettingUp_CommandLine.html#set-aws-credentials。

您可以尝试通过查看从控制台运行命令时是否设置了这些变量来测试这个理论:

echo $AWS_ACCESS_KEY
echo $AWS_SECRET_KEY

如果它们显示值,这可能是造成差异的原因。

要尝试的另一件事是将命令替换为具有有效访问密钥而不是证书的命令(-O 和 -W 参数而不是 -K 和 -C)。您可以通过 IAM 创建一个只能执行您想要的操作的用户,并将其凭证用于命令。

【讨论】:

嗨。感谢您的输入。但是,我没有通过命令行或 cron 运行命令 root。【参考方案4】:

就我而言,我必须导出更多变量,以与 ec2-user 环境中的相同。

我定义了一个新的脚本 ec2-backup.sh 如下:

#!/bin/sh
export EC2_HOME=/opt/aws/apitools/ec2
export JAVA_HOME=/usr/lib/jvm/jre
export AWS_ACCESS_KEY=...
export AWS_SECRET_KEY=...
export PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin
/home/ec2-user/aws-missing-tools-master/ec2-automate-backup/ec2-automate-backup.sh -v 'all volumes ' -n -r eu-west-1 -p -k 2

然后从我的 cronjob 中执行这个脚本。将作业输出发送到日志文件对调试非常有帮助:

0 0 * * * /home/ec2-user/ec2-backup.sh >> /home/ec2-user/cronoutput.txt 2>&1

【讨论】:

【参考方案5】:

CRON Env 使用简化的环境设置。所以并不是所有的环境变量都在这里设置。我们在 cronjob 中遇到了同样的问题,就是缺少一些环境变量。

我们不想要的是创建一个脚本来导出元素,而是获取现有的环境变量,因为如果配置发生更改,这似乎不太容易出错。

我在这里找到了我的解决方案(很好地隐藏在最后一个答案中): AWS Help

AWS EBS 的环境变量存储在以下文件中:/opt/elasticbeanstalk/support/envvars。所以采购或阅读这个文件对我有用。在根 crontab 中,这可能如下所示:

30 2 * * * root . /opt/elasticbeanstalk/support/envvars && php /var/www/bin/some_command.php

这样,你:

只在一个地方维护您的环境变量(您的选择) 可以在任何需要的地方使用它们 始终使用相同的环境变量

【讨论】:

【参考方案6】:

尝试捕获标准输出/标准错误:

1) 将命令移动到 shell 脚本并从 cron 调用 shell 命令,例如

15 12 * * * /home/someuser/some_script.sh >/home/someuser/some_script.cron 输出 2>&1

2) some_script.sh 的内容;确保设置了执行位

#!/bin/sh /opt/aws/bin/ec2-create-snapshot --region us-east-1 -K /home/ec2-user/pk.pem -C /home/ec2-user/cert.pem -d "vol-* *******快照”卷-**********

【讨论】:

以上是关于Amazon EC2 EBS 自动备份单行手动工作,但不是来自 cron的主要内容,如果未能解决你的问题,请参考以下文章

如何自动对 Amazon EC2 实例的卷进行快照?

AMI EC2 EBS 备份 - 成本预测

Amazon EBS,快照作为增量备份

Amazon AMI 和 EBS 快照有啥区别?

如何将映像传输到 Amazon EBS 卷以供 EC2 使用?

Amazon EC2 - 使用实例存储根设备转换 EBS 根设备