9

我正在尝试在 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-******** )

你能帮我解决问题吗?

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

谢谢。

4

6 回答 6

9

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

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

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

于 2012-12-14T01:03:04.150 回答
7

对于初学者,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 功能都是自动化的。

于 2012-12-22T21:13:41.180 回答
1

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 创建一个只能执行您想要的操作的用户,并将其凭证用于命令。

于 2012-12-21T15:36:09.507 回答
0

在我的情况下,我必须导出更多变量,与 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
于 2015-01-19T09:45:38.030 回答
0

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

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

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

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

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

像这样,你:

  • 只在一个地方维护你的环境变量(你的选择)
  • 可以在任何需要的地方使用它们
  • 始终使用相同的环境变量
于 2017-07-25T08:37:57.023 回答
-1

尝试捕获 stdout/stderr :

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-* *******快照”卷-**********
于 2012-12-18T23:01:05.547 回答