Versuch, ein einfaches AWS CLI-Sicherungsskript auszuführen. Es durchläuft Zeilen in einer Include-Datei, sichert diese Pfade bis S3 und gibt die Ausgabe in eine Protokolldatei aus. Wenn ich diesen Befehl direkt ausführe, läuft er fehlerfrei. Wenn ich es über CRON ausführe, wird in meinem Ausgabeprotokoll der Fehler "Anmeldeinformationen können nicht gefunden werden" angezeigt.
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 der Fehler aufgetreten ist, weil ich dachte, dies könnte ihn beheben (obwohl ich mir ziemlich sicher bin, dass AWS dort standardmäßig angezeigt wird).
Shell-Skript wird als root ausgeführt. Ich kann die AWS-Konfigurationsdatei am angegebenen Speicherort sehen. Und alles sieht gut für mich aus (wie ich schon sagte, es läuft gut außerhalb von CRON).
quelle
~/.aws/config
.Antworten:
Wenn es funktioniert, wenn Sie es direkt ausführen, aber nicht von cron, liegt wahrscheinlich etwas anderes in der Umgebung vor. Sie können Ihre Umgebung auf diese Weise interaktiv sichern
Und machen Sie dasselbe in Ihrem Skript
Und dann
diff /tmp/env.cron env.interactive
und sehen, worauf es ankommt. Dinge wiePATH
sind die wahrscheinlichsten Schuldigen.quelle
PATH
Variablen (echo $PATH
die angibt , wie sie lauten soll) im Skript löst sie normalerweise .Wenn Sie einen Job über crontab ausführen,
$HOME
lautet Ihre Umgebungsvariable/
Der Amazon-Client sucht nach
oder
Wenn
$HOME
=/
, findet der Client diese Dateien nichtAktualisieren Sie Ihr Skript, damit es ein tatsächliches Basisverzeichnis für exportiert
$HOME
und legen Sie dann eine Konfiguration oder Anmeldeinformationen-Dateien in
quelle
Ich konnte dieses Problem folgendermaßen lösen :
quelle
aws configure
ist jedoch so, dass Sie keine Anmeldeinformationen in z. B. Skripts einfügen müssen. Lesen Sie die Antwort von @chicks, um das Problem zu lösen.AWS_ACCESS_KEY_ID
undAWS_SECRET_ACCESS_KEY
Werte in Skripten. Die erste Zeile sollte diese Werte bereits angegeben haben.Stellen Sie diesen Code vor die Befehlszeile, damit er in crontab -e ausgeführt wird
quelle
Die Binärdateien des aws cli-Tools werden unter installiert
/usr/local/bin/aws
.Der Fehler, den ich hatte, ist, dass der Cron-Benutzer
/usr/local/bin/aws
während der Ausführung nicht zugreifen konnte ; es kann nur zugreifen/usr/bin/
Ich habe
/usr/bin
mit dem folgenden Befehl einen Link für aws erstellt.Ich habe auch einige Änderungen in meinem Skript hinzugefügt. Hier ist eine Beispielfunktion:
Und der Cron-Eintrag:
Diese Methode hat bei mir funktioniert.
quelle
/usr/bin/aws
ist der Schlüssel zur Lösung.Diese Zeile in der Standarddatei
.bashrc
für den Benutzer verhindert, dass nicht interaktive Shells die vollständige Benutzerumgebung abrufen (einschließlich der Variablen PATH):Kommentieren Sie den Zeilenausgang, damit er
$HOME/.bashrc
in einem nicht interaktiven Kontext ausgeführt werden kann.Ich musste
source
meinem Shell-Skript auch einen expliziten Befehl hinzufügen , um die Umgebung korrekt einzurichten:Weitere Informationen finden Sie in dieser Antwort .
quelle
Wir alle wissen, dass die Umgebungspfadvariable $ PATH die Position von Binärdateien hat. $ PATH von Crontab verfügt möglicherweise nicht über die Position awscli.
Was Sie tun können, ist, den Pfad von awscli binary zu finden.
und füge den Pfad in $ PATH von crontab hinzu, indem du am Anfang deines Skripts (nach shebang) die folgende Zeile hinzufügst.
Das hat bei mir funktioniert !!!
quelle
Ich weiß, dass es nicht die perfekte Lösung ist, aber das hat bei mir funktioniert:
quelle
Nur um einen Mehrwert zu schaffen, hatte ich ein Problem mit der neuen Bash-Version, während
awscli
ich das über PIP installierte Tool verwendete. Bei neuen Bash-Versionen stellte ich fest, dass mit diesem Tool nichts mehr funktioniert.Ich war in der Lage zu lösen, indem ich
aws-apitools-ec2
dieses anbringe, kann durch anbringenIch füge den Leitfaden als Referenz bei.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
quelle
Ich hatte das gleiche Problem, aber nachdem ich die stderr-Umleitung von meinem cron-Eintrag (
2>@1
) entfernt hatte, sah ich esaws: command not found
im Protokoll.Dies liegt daran, dass die AWS-CLI im Basisordner des Benutzers installiert wurde und ich meinem Benutzer eine Zeile hinzugefügt habe
.bash_profile
, um den AWS-CLI-Pfad zum hinzuzufügen$PATH
. Seltsamerweise werden Sie in der AWS-CLI-Installationsdokumentation auf diese Weise aufgefordert, sie zu installieren. Der Benutzer wird.bash_profile
jedoch nicht verwendet, wenn die crontab des Benutzers ausgeführt wird (jedenfalls nicht in meiner Umgebung).Alles was ich getan habe, um dies zu beheben, war sicherzustellen, dass mein Crontab-Skript auch die AWS-CLI in seinem Pfad hatte. Also habe ich jetzt unter dem Knall meines Drehbuchs
PATH=~/.local/bin:$PATH
.quelle
Für mich war das der Trick:
Der Standardbenutzer in heutigen EC2-Instanzen ist ubuntu, und der Stammordner ist der Stammordner dieses Benutzers. Dort existiert auch die aws cli.
quelle
Nicht die beste, aber ich musste die Konfiguration direkt in meinem Shell- / Bash-Skript bereitstellen, bevor der AWS-Client Befehle ausführte. mögen:
quelle