9

AmazonAWSで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もエクスポートする必要があります。上部に2つのエクスポートがあるスクリプトを作成してから、スナップショットの作成を呼び出すことをお勧めします。とてもシンプルです

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がシェルからコマンドを実行できることを知っています。したがって、最初に、rootがシェルからこのコマンドを正常に実行できることを確認してください。

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を使用して指定されたクレデンシャルは有効でない可能性がありますが、無視されているため、それはわかりません。ルートアカウントの環境は異なり、おそらくこれらの変数の有効な値がありません。

これは、アクセスキーの代わりに証明書(-Kおよび-Cオプション)を使用することがAmazonによって非推奨になっているために発生する可能性があります。http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/SettingUp_CommandLine.html#set-aws-credentialsを参照してください。

コンソールからコマンドを実行したときにこれらの変数が設定されているかどうかを確認することで、この理論をテストできます。

echo $AWS_ACCESS_KEY
echo $AWS_SECRET_KEY

それらが値を示している場合、これがおそらく違いの理由です。

もう1つの試みは、コマンドを証明書の代わりに有効なアクセスキーを持つコマンドに置き換えることです(-Kおよび-Cの代わりに-Oおよび-Wパラメーター)。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でも同じ問題が発生しましたが、いくつかのenvvarが不足していました。

必要ではなかったのは、要素をエクスポートするスクリプトを作成することでしたが、構成が変更された場合にエラーが発生しにくいように見えたため、代わりに既存の環境変数を取得しました。

私はここで私の解決策を見つけました(最後の答えによく隠されています): AWSヘルプ

AWSEBSのenvvarsは、次のファイルに保存されます/opt/elasticbeanstalk/support/envvars。したがって、このファイルを調達または読み取ることで、私はうまくいきました。ルートcrontabでは、これは次のようになります。

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

このように、あなた:

  • env変数を1か所でのみ維持する(選択)
  • 必要な場所で使用できます
  • 常に同じenv変数を使用する
于 2017-07-25T08:37:57.023 に答える
-1

stdout / stderrをキャプチャしてみてください:

1)コマンドをシェルスクリプトに移動し、cronからシェルコマンドを呼び出します。例:

15 12 * * * /home/someuser/some_script.sh> /home/someuser/some_script.cronoutput 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- * *******スナップショット"vol-********
于 2012-12-18T23:01:05.547 に答える