Frage Kann AWS CLI nicht von CRON aus ausführen (Anmeldeinformationen)


Es wird versucht, ein einfaches AWS CLI-Sicherungsskript auszuführen. Es durchläuft Zeilen in einer Include-Datei, sichert diese bis S3 und gibt die Ausgabe in eine Protokolldatei aus. Wenn ich diesen Befehl direkt ausführe, läuft er ohne Fehler. Wenn ich es durch CRON ausführe, erhalte ich einen Fehler in meinem Ausgabeprotokoll, der "Kann Anmeldeinformationen nicht finden".

Das Shell-Skript:

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

Ich habe die Zeile erst zur Konfigurationsdatei hinzugefügt, nachdem ich den Fehler gesehen habe, und dachte, dass dies den Fehler beheben könnte (obwohl ich mir ziemlich sicher bin, dass AWS dort standardmäßig aussieht).

Shell-Skript läuft als root. Ich kann die AWS-Konfigurationsdatei am angegebenen Speicherort sehen. Und es sieht alles gut für mich aus (wie ich schon sagte, es läuft gut außerhalb von CRON).


23
2017-07-23 15:51


Ursprung


Versuchen Sie einen absoluten Pfad zu ~/.aws/config. - ceejayoz
Ich habe es definitiv zuerst versucht (war /root/.aws/config), bin aber zurück zu ~ / gegangen, nachdem ich es in anderen Threads gesehen habe. Derselbe Fehler wie auch immer. - binaryorganic
Keine direkte Antwort, sondern ein Kommentar zur Verwendung der API-Schlüssel: Es ist besser (und viel einfacher), Ihren Instanzen Rollen zuzuweisen und Richtlinien für diese Rollen zu erstellen, und dann müssen Sie die Schlüssel überhaupt nicht angeben, oder Lass sie im Klartext auf der Instanz herumliegen. Leider kann dies nur zum Zeitpunkt der Instanzerstellung angegeben werden. Nebenbei, zum Kopieren von Logfiles (und Backups usw.) schauen Sie sich die s3cmd-Tools an, die ähnliche Funktionen wie rsync bieten. - nico


Antworten:


Wenn es funktioniert, wenn Sie es direkt ausführen, aber nicht von Cron, gibt es wahrscheinlich etwas anderes in der Umgebung. Sie können Ihre Umgebung interaktiv speichern, indem Sie dies tun

set | sort > env.interactive

Und machen Sie dasselbe in Ihrem Skript

set | sort > /tmp/env.cron

Und dann diff /tmp/env.cron env.interactive und sehen, was zählt. Dinge wie PATH sind die wahrscheinlichsten Schuldigen.


19
2017-07-24 22:19



Vielen Dank! Ein Schritt, um das Problem selbst beheben zu können, ist grundsätzlich von unschätzbarem Wert. Es gab definitiv einige Unterschiede in der PATH-Variable, und ich denke, in diesem Fall war es der Unterschied in HOME, der Dinge wegwarf. Was mein spezifisches Problem anbelangt, habe ich das am Ende nur aus der Cron-Datei des Benutzers heraus ausgeführt, anstatt von / etc / crontab, was alles an meinem Ende löste. Danke noch einmal! - binaryorganic
Recht. Hinzufügen eines korrekten PATH Variable(echo $PATH wird sagen, was es sein soll) im Skript meistens löst es. - Fr0zenFyr


Wenn Sie einen Job von crontab ausführen, wird Ihr $HOME Umgebungsvariable ist /

Der Amazon-Client sucht nach beiden

~/.aws/config

oder

~/.aws/credentials

Ob $HOME = /, dann findet der Client diese Dateien nicht

Aktualisieren Sie Ihr Skript, damit es ein aktuelles Basisverzeichnis für exportiert $HOME

export HOME=/root

und dann legen Sie eine Config oder Credentials-Dateien in

/root/.aws/

27
2017-10-15 14:00



Dies half, zusammen mit dem folgenden Fix von stackoverflow.com/a/26480929/354709 Dazu gehörte das Hinzufügen des absoluten Pfads für den Befehl aws - da $ PATH im root-Benutzer nicht korrekt festgelegt wurde. - Dan Smart
Dies sollte die akzeptierte Antwort sein. - Madbreaks


Ich konnte dieses Problem lösen folgende:

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

6
2017-07-08 17:35



Aber der ganze Sinn des Tuns aws configure ist so, dass Sie Anmeldeinformationen nicht in z.B. Skripte. Siehe Antwort von @chicks, um dies richtig zu lösen. - Madbreaks
Nicht lagern AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY Werte in Skripten. Die erste Zeile sollte diese Werte bereits enthalten haben. - AWippler


Die Binärdateien des aws cli tool sind unter installiert /usr/local/bin/aws.

Der Fehler, den ich hatte, ist, dass der Benutzer cron nicht zugreifen konnte /usr/local/bin/aws während dem Rennen; es kann nur zugreifen /usr/bin/

Ich habe einen Link erstellt /usr/bin für aws mit dem folgenden Befehl.

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

Ich habe auch einige Änderungen in meinem Skript hinzugefügt. Hier ist eine Beispielfunktion:

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

}

Und der Cron-Eintrag:

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

Diese Methode hat bei mir funktioniert.


1
2017-08-11 06:37



Mansur, deine Antwortformatierung ist komplett kaputt. - Aldekein
den vollständigen Pfad verwenden /usr/bin/aws ist der Schlüssel zur Lösung. - Ramratan Gupta


Setzen Sie diesen Code vor Ihre Befehlszeile, um in crontab -e ausgeführt zu werden

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

1
2018-05-31 20:48



Ich habe die erste Lösung mit dem Diff aber nichts ausprobiert. Der Trick für mich war die Variable PATH. - borracciaBlu


Diese Zeile ist standardmäßig .bashrc Datei für den Benutzer verhindert, dass nicht interaktive Shells die vollständige Benutzerumgebung (einschließlich der PATH-Variablen) erhalten:

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

Kommentieren Sie die Linie, um zu erlauben $HOME/.bashrc aus einem nicht interaktiven Kontext ausgeführt werden.

Ich musste auch explizit hinzufügen source Befehl an mein Shell-Skript, um die Umgebung korrekt einzurichten:

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

Sehen diese Antwort Für weitere Informationen.


1
2017-10-04 19:20





Ich weiß, es ist nicht die perfekte Lösung, aber das hat für mich funktioniert:

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
2018-03-29 07:30





Nur um einen Mehrwert hinzuzufügen, hatte ich Probleme mit der neuen Bash-Version während der Verwendung awscli Tool über PIP installiert habe ich festgestellt, dass nichts mit diesem Tool mit neuen Bash-Versionen arbeiten wird.

Ich konnte das beheben, indem ich installierte aws-apitools-ec2 Dies kann durch installiert werden

yum install -y aws-apitools-ec2 

Ich füge seinen Führer für mehr Referenz an.

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


0
2017-08-02 04:51



Auf Ubuntu 16.04 konnte ich das Paket nicht finden. - borracciaBlu


Ich hatte das gleiche Problem, aber nach dem Entfernen der Stderr Redirect von meinem Cron-Eintrag (2>@1), Ich sah aws: command not found im Protokoll.

Dies liegt daran, dass der AWS-CLI im Benutzerordner des Benutzers installiert war und ich eine Zeile zu meinem Benutzer hinzugefügt hatte .bash_profile fügen Sie den AWS-Clipfilm dem hinzu $PATH. Seltsamerweise ist dies in der Tat die Art, dass die AWS cli installieren Sie die Dokumentation sagt Ihnen, es zu installieren. Aber der Benutzer .bash_profile wird nicht verwendet, wenn die crontab des Benutzers ausgeführt wird (jedenfalls nicht in meiner Umgebung).

Also alles, was ich getan habe, um dies zu beheben, war, dass mein crontab-Skript auch den aws cli in seinem Pfad hatte. Unter dem Shebang meines Skripts habe ich jetzt PATH=~/.local/bin:$PATH.


0
2017-08-24 10:43