web-dev-qa-db-ja.com

CRON(認証情報)からAWS CLIを実行できません

単純なAWS CLIバックアップスクリプトを実行しようとしています。インクルードファイルの行をループし、それらのパスをS3までバックアップし、出力をログファイルにダンプします。このコマンドを直接実行すると、エラーなしで実行されます。 CRONで実行すると、出力ログに「資格情報が見つかりません」というエラーが表示されます。

シェルスクリプト:

AWS_CONFIG_FILE="~/.aws/config"

while read p; do
 /usr/local/bin/aws s3 cp $p s3://PATH/TO/BUCKET --recursive >> /PATH/TO/LOG 2>&1
done </PATH/TO/INCLUDE/include.txt

エラーが表示され始めた後、この行を設定ファイルに追加しましたが、これで問題が修正される可能性があると考えました(AWSがデフォルトでこの場所を確認しているのは確かですが)。

シェルスクリプトはrootとして実行されています。指定した場所にAWS構成ファイルが表示されます。そして、それはすべて私によく見えます(私が言ったように、それはCRONの外でうまく実行されます)。

29
binaryorganic

それを直接実行したときに機能するがcronからは機能しない場合は、環境におそらく何か異なるものがあります。次のようにしてインタラクティブに環境を保存できます

set | sort > env.interactive

スクリプトでも同じことをします

set | sort > /tmp/env.cron

その後 diff /tmp/env.cron env.interactiveと重要なことを確認してください。 PATHのようなものが最も可能性の高い犯人です。

21
chicks

Crontabからジョブを実行する場合、$HOME環境変数は/です

Amazonクライアントはどちらかを探します

~/.aws/config

または

~/.aws/credentials

$HOME = /の場合、クライアントはこれらのファイルを見つけられません

これを機能させるには、$HOMEの実際のホームディレクトリをエクスポートするようにスクリプトを更新します

export HOME=/root

次に、構成ファイルまたは資格情報ファイルを

/root/.aws/
36
Garreth McDaid

私は を通じてこの問題を解決することができました:

export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
6

実行するコマンドラインの前にこのコードをcrontab -eに入れます

Shell=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Aws cliツールのバイナリは/usr/local/bin/awsにインストールされます。

私が持っていたエラーは、cronユーザーが実行中に/usr/local/bin/awsにアクセスできなかったことです。 /usr/bin/にのみアクセスできます

以下のコマンドを使用して、awsの/usr/binにリンクを作成しました。

root@gateway:~# ln -s /usr/local/bin/aws /usr/bin/aws

また、スクリプトにいくつかの変更を加えました。これはサンプル関数です:

starter () {
    echo "
    ==================================================

    Starting Instance

    ==================================================
    "

    /usr/bin/aws ec2 start-instances --instance-ids $instance --region us-east-1

    sleep 30

    echo "Assigning IP Address "

    /usr/bin/aws ec2 associate-address --instance-id $instance  --region us-east-1 --public-ip XX.XX.XX.XX

}

そしてcronエントリ:

30 5 * * * sh /usr/local/cron/magentocron.sh

この方法でうまくいきました。

1
Mansur Ali

ユーザーのデフォルトの.bashrcファイルの次の行により、非対話型シェルが完全なユーザー環境(PATH変数を含む)を取得できなくなります。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

行をコメント化して、$HOME/.bashrcを非インタラクティブコンテキストから実行できるようにします。

また、環境を正しく設定するには、明示的にsourceコマンドをシェルスクリプトに追加する必要がありました。

#!/bin/bash
source $HOME/.bashrc

詳細については この回答 を参照してください。

1
Peter Gluck

環境パス変数$ PATHにバイナリの場所があることは誰でも知っています。 Crontabの$ PATHに場所awscliがない可能性があります。

あなたができることは、awscliバイナリのパスを見つけることです。

# which aws
/usr/local/bin/aws

スクリプトの冒頭に行を追加することで、crontabの$ PATHにパスを追加します(Shebangの後)。

PATH=$PATH:/usr/local/bin/

これは私のために働きました!!!

1
Nijil

付加価値を追加するためだけに、PIP経由でインストールされたawscliツールを使用しているときに新しいbashバージョンで問題が発生しました。新しいbashバージョンでは、このツールでは何も機能しないことがわかりました。

aws-apitools-ec2をインストールすることで解決できました。これは

yum install -y aws-apitools-ec2 

参考までにそのガイドを添付しています。

http://docs.aws.Amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf

0
Mansur Ali

最高ではありませんが、AWSクライアントコマンドの前にシェル/ bashスクリプトで直接設定を提供する必要がありました。お気に入り:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
0
user1859675

私にとってこれはトリックをしました:

#!/bin/bash

HOME=/home/ubuntu
AWS_CONFIG_FILE="/home/ubuntu/.aws/config"

aws ec2 describe-instances #or whatever command you need to use.

今日のEC2インスタンスのデフォルトユーザーはubuntuで、ルートフォルダーはそのユーザーのホームフォルダーです。これは、aws cliも存在する場所です。

0
GotBatteries

同じ問題がありましたが、cronエントリ(2>@1)からstderrリダイレクトを削除した後、ログにaws: command not foundが表示されました。

これは、AWS cliがユーザーのホームフォルダーにインストールされ、AWS cliパスを.bash_profileに追加する行をユーザーの$PATHに追加したためです。奇妙なことに、これは実際に AWS cli install documentation がインストールを指示する方法です。しかし、ユーザーの.bash_profileは、ユーザーのcrontabが実行されたときは使用されません(少なくとも私の環境では)。

したがって、これを修正するために行ったのは、私のcrontabスクリプトにもaws cliがパスに含まれていることを確認することだけでした。スクリプトのシバンの下にPATH=~/.local/bin:$PATHがあります。

0
alexkb

私はそれが完璧な解決策ではないことを知っていますが、それは私にとってはうまくいきました:

export HOME=/home/user
export AWS_CONFIG_FILE="/home/user/.aws/config"
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=XXX
0
Gustavo