Próbuję uruchomić prosty skrypt kopii zapasowej AWS CLI. Pętla przechodzi przez linie w pliku dołączania, kopiuje te ścieżki do S3 i zrzuca dane wyjściowe do pliku dziennika. Kiedy uruchamiam to polecenie bezpośrednio, działa ono bez żadnego błędu. Kiedy uruchamiam go przez CRON, w moim dzienniku wyjściowym pojawia się błąd „Nie można zlokalizować danych logowania”.
Skrypt powłoki:
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
Dodałem wiersz do pliku konfiguracyjnego dopiero po tym, jak zobaczyłem błąd, myśląc, że to może go naprawić (chociaż jestem pewien, że tam domyślnie wygląda AWS).
Skrypt powłoki działa jako root. Widzę plik konfiguracyjny AWS w określonej lokalizacji. I wszystko wygląda dla mnie dobrze (jak powiedziałem, działa dobrze poza CRON).
bash
amazon-web-services
cron
shell
binarno-organiczny
źródło
źródło
~/.aws/config
.Odpowiedzi:
Jeśli działa, gdy uruchamiasz go bezpośrednio, ale nie z crona, prawdopodobnie w środowisku jest coś innego. Możesz w ten sposób interaktywnie ratować swoje środowisko
I zrób to samo w swoim skrypcie
A potem
diff /tmp/env.cron env.interactive
i zobacz, co się liczy. Takie rzeczyPATH
są najbardziej prawdopodobnymi winowajcami.źródło
PATH
zmiennej (echo $PATH
powie, jaka powinna być) w skrypcie zwykle ją rozwiązuje.Gdy uruchamiasz zadanie z crontab, twoją
$HOME
zmienną środowiskową jest/
Klient Amazon szuka jednego z nich
lub
Jeśli
$HOME
=/
, to klient nie znajdzie tych plikówAby działało, zaktualizuj skrypt, aby wyeksportował rzeczywisty katalog domowy
$HOME
a następnie włóż pliki konfiguracyjne lub poświadczenia
źródło
Udało mi się rozwiązać ten problem poprzez poniżej :
źródło
aws configure
to, abyś nie musiał wpisywać poświadczeń np. W skryptach. Zobacz odpowiedź wysłaną przez @chicks, aby rozwiązać ten problem poprawnie.AWS_ACCESS_KEY_ID
iAWS_SECRET_ACCESS_KEY
wartości w skryptach. Pierwszy wiersz powinien już podać te wartości.Umieść ten kod przed wierszem polecenia, aby go wykonać w crontab -e
źródło
Pliki binarne narzędzia aws cli są zainstalowane pod
/usr/local/bin/aws
.Wystąpił błąd polegający na tym, że użytkownik cron nie mógł uzyskać dostępu
/usr/local/bin/aws
podczas działania; ma dostęp tylko/usr/bin/
To, co zrobiłem, to utworzenie linku
/usr/bin
do aws za pomocą poniższego polecenia.Dodałem także kilka zmian w moim skrypcie; oto przykładowa funkcja:
I wpis crona:
Ta metoda działała dla mnie.
źródło
/usr/bin/aws
jest kluczem do rozwiązania.Ta linia w domyślnym
.bashrc
pliku dla użytkownika zapobiegnie uzyskaniu pełnego środowiska użytkownika przez powłoki nieinteraktywne (w tym zmienną PATH):Skomentuj wyjście liniowe, aby umożliwić
$HOME/.bashrc
wykonanie z nieinteraktywnego kontekstu.Musiałem także dodać jawne
source
polecenie do skryptu powłoki, aby poprawnie skonfigurować środowisko:Zobacz tę odpowiedź, aby uzyskać dodatkowe informacje.
źródło
Wszyscy wiemy, że zmienna środowiskowa $ PATH ma lokalizację plików binarnych. $ PATH of Crontab może nie mieć awscli lokalizacji.
Co możesz zrobić, to znaleźć ścieżkę do bsc awscli.
i dodaj ścieżkę w $ PATH crontab, dodając poniżej linii na początku skryptu (po shebang).
To działało dla mnie !!!
źródło
Wiem, że to nie jest idealne rozwiązanie, ale to działało dla mnie:
źródło
Aby dodać wartość dodaną, miałem problem z nową wersją bash podczas korzystania z
awscli
narzędzia zainstalowanego za pomocą PIP i stwierdziłem, że nic nie będzie działać z tym narzędziem z nowymi wersjami bash.Mogłem rozwiązać, instalując
aws-apitools-ec2
to można zainstalować przezZałączam jego przewodnik, aby uzyskać więcej informacji.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
źródło
Miałem ten sam problem, ale po usunięciu przekierowania stderr z mojego wpisu cron (
2>@1
) zobaczyłemaws: command not found
w dzienniku.Wynika to z faktu, że cli AWS zostało zainstalowane w folderze domowym użytkownika, a ja dodałem linię do mojego użytkownika,
.bash_profile
aby dodać ścieżkę cli AWS do pliku$PATH
. Co dziwne, w rzeczywistości jest to sposób, w jaki dokumentacja instalacji AWS cli każe ci ją zainstalować. Ale użytkownik.bash_profile
nie przyzwyczaja się, gdy crontab użytkownika jest wykonywany (przynajmniej nie w moim środowisku).Więc wszystko, co zrobiłem, aby to naprawić, to upewnić się, że mój skrypt crontab ma również aws cli na swojej drodze. Tak więc poniżej zera mojego skryptu mam teraz
PATH=~/.local/bin:$PATH
.źródło
Dla mnie to załatwiło sprawę:
Domyślnym użytkownikiem w dzisiejszych instancjach EC2 jest ubuntu, a folderem głównym jest folder domowy użytkowników. Tam właśnie istnieje również aws cli.
źródło
Nie najlepsze, ale musiałem dostarczyć konfigurację bezpośrednio w moim skrypcie powłoki / bash przed poleceniami klienta AWS. lubić:
źródło