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


27

単純な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がデフォルトでどこに見えるかは確かですが)。

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


2
への絶対パスを試してください~/.aws/config
ceejayoz 14

間違いなく最初にそれを試しました(/root/.aws/configを使用していました)が、他のスレッドでそれを確認した後、〜/に戻りました。どちらの場合も同じエラー。
バイナリ有機14

2
直接的な答えではなく、APIキーの使用に関するコメント:インスタンスにロールを割り当て、それらのロールに関連するポリシーを作成することをお勧めします(はるかに簡単です)。その後、キーをまったく指定する必要はありません。それらをインスタンス上に平文で横たわらせる。残念ながら、これはインスタンス作成時にのみ指定できます。余談ですが、ログファイル(およびバックアップなど)をコピーするには、rsyncと同様の機能を提供するs3cmdツールを参照してください。
ニコ

回答:


20

cronからではなく直接実行したときに機能する場合は、おそらく環境に何か違いがあります。以下を行うことで、対話的に環境を保存できます

set | sort > env.interactive

スクリプトで同じことを行います

set | sort > /tmp/env.cron

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


4
ありがとう!私自身で問題をトラブルシューティングできるようになるステップは、基本的に非常に貴重です。PATH変数には間違いなくいくつかの違いがありました。この場合、HOMEの違いが原因で物事が発生していると思います。私の特定の問題に関しては、/ etc / crontabの代わりにこれをユーザーのcronファイルから実行するだけでした。再度、感謝します!
バイナリ有機14

右。通常、スクリプトに正しいPATH変数を追加すると(echo $PATHそれが何であるかがわかります)、解決します。
Fr0zenFyr

33

crontabからジョブを実行すると、$HOME環境変数は/

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

~/.aws/config

または

~/.aws/credentials

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

動作させるには、スクリプトを更新して、実際のホームディレクトリをエクスポートします $HOME

export HOME=/root

そして、設定ファイルまたは資格情報ファイルを

/root/.aws/

これは、awsコマンドの絶対パスの追加を伴うstackoverflow.com/a/26480929/354709からの次の修正とともに役立ちました-ルートユーザーで$ PATHが正しく設定されていなかったため。
ダンス

2
これは受け入れられた答えでなければなりません。
Madbreaks

6

次の方法でこの問題を解決できました。

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

1
ただし、実行する全体のaws configure目的は、スクリプトなどに資格情報を入力する必要がないようにすることです。これを適切に解決するには、@ chicksが投稿した回答を参照してください。
Madbreaks

1
保管しないでくださいAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY、スクリプト内の値。最初の行は、すでにこれらの値を提供しているはずです。
AWippler


1

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

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

私がやったことは/usr/bin、以下のコマンドでawsのリンクを作成することでした。

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

この方法は私にとってはうまくいきました。


マンスール、答えのフォーマットは完全に壊れています。
-Aldekein

フルパスを使用/usr/bin/awsすることがソリューションの鍵です。
ラムラタングプタ

1

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

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

行をコメントアウト$HOME/.bashrcして、非対話型コンテキストから実行できるようにします。

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

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

追加情報については、この回答を参照しください。


1

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

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

# which aws
/usr/local/bin/aws

そして、スクリプトの先頭に次の行を追加して(cronの後に)crontabの$ PATHにパスを追加します。

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

これは私のために働いた!!!


あなたの答えは私のために働いた。1時間頭をひっかいた。ありがとう、相棒
フセイン7

0

私はそれが完璧な解決策ではないことを知っていますが、それは私のために働いた:

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

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

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

yum install -y aws-apitools-ec2 

詳細については、ガイドを添付しています。

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


ubuntu 16.04では、パッケージが見つかりませんでした。
borracciaBlu

0

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

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

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


0

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

#!/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

最善ではありませんが、AWSクライアントコマンドの前にシェル/ bashスクリプトで構成を直接提供する必要がありました。のような:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.