Impossibile eseguire l'interfaccia della riga di comando di AWS da CRON (credenziali)


27

Tentativo di eseguire un semplice script di backup della CLI AWS. Passa attraverso le linee in un file include, esegue il backup di quei percorsi fino a S3 e scarica l'output in un file di registro. Quando eseguo questo comando direttamente, viene eseguito senza errori. Quando lo eseguo tramite CRON, nel registro di output viene visualizzato l'errore "Impossibile individuare le credenziali".

Lo script della shell:

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

Ho aggiunto la linea al file di configurazione solo dopo aver iniziato a vedere l'errore, pensando che questo potrebbe risolverlo (anche se sono abbastanza sicuro che AWS sia quello di default per impostazione predefinita).

Lo script della shell è in esecuzione come root. Posso vedere il file di configurazione AWS nella posizione specificata. E tutto mi sembra buono (come ho detto, funziona benissimo al di fuori di CRON).


2
Prova un percorso assoluto per ~/.aws/config.
Ceejayoz,

Sicuramente ho provato prima (stava usando /root/.aws/config), ma sono tornato a ~ / dopo averlo visto in altri thread. Stesso errore in entrambi i casi.
binaryorganic,

2
Non una risposta diretta ma un commento sull'uso delle chiavi API: è buona prassi (e molto più semplice) assegnare ruoli alle istanze e creare criteri relativi a tali ruoli, quindi non è necessario specificare affatto le chiavi, oppure li hanno in giro in chiaro sull'istanza. Purtroppo questo può essere specificato solo al momento della creazione dell'istanza. A parte questo, per copiare file di registro (e backup ecc.) Dai un'occhiata agli strumenti s3cmd, che offrono funzionalità simili a rsync.
nico,

Risposte:


20

Se funziona quando lo esegui direttamente ma non da cron, probabilmente c'è qualcosa di diverso nell'ambiente. Puoi salvare il tuo ambiente in modo interattivo facendo

set | sort > env.interactive

E fai la stessa cosa nella tua sceneggiatura

set | sort > /tmp/env.cron

E poi diff /tmp/env.cron env.interactivee vedi cosa conta. Cose come PATHsono i colpevoli più probabili.


4
Grazie! Un passo verso la capacità di risolvere il problema da solo è sostanzialmente prezioso. C'erano sicuramente diverse differenze nella variabile PATH, e penso che in questo caso sia stata la differenza in HOME a buttare via le cose. Per quanto riguarda il mio problema specifico, ho finito per eseguirlo dal file cron dell'utente, anziché / etc / crontab, che ha risolto tutto da parte mia. Grazie ancora!
binaryorganic,

Destra. l'aggiunta di una PATHvariabile corretta ( echo $PATHdirà cosa dovrebbe essere) nello script di solito la risolve.
Fr0zenFyr,

33

Quando si esegue un lavoro da crontab, la $HOMEvariabile di ambiente è/

Il client Amazon cerca entrambi

~/.aws/config

o

~/.aws/credentials

Se $HOME= /, il client non troverà quei file

Per farlo funzionare, aggiorna lo script in modo che esporti una directory home effettiva per $HOME

export HOME=/root

e quindi inserire un file di configurazione o credenziali

/root/.aws/

Questo ha aiutato, insieme alla seguente correzione da stackoverflow.com/a/26480929/354709 che prevedeva l'aggiunta del percorso assoluto per il comando aws - poiché $ PATH non era impostato correttamente nell'utente root.
Dan Smart,

2
Questa dovrebbe essere la risposta accettata.
Madbreaks

6

Sono stato in grado di risolvere questo problema attraverso il seguente :

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

1
Ma il punto aws configureè fare in modo che non si debbano inserire credenziali, ad esempio negli script. Vedi la risposta inviata da @chicks per risolverlo correttamente.
Madbreaks

1
Non archiviare AWS_ACCESS_KEY_IDe AWS_SECRET_ACCESS_KEYvalori negli script. La prima riga avrebbe già dovuto fornire questi valori.
AWippler,

2

Inserisci questo codice prima della tua riga di comando per essere eseguito in crontab -e

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

Ho provato la prima soluzione con il diff ma niente. il trucco per me era la variabile PATH.
BorracciaBlu,

1

I binari dello strumento aws cli sono installati sotto /usr/local/bin/aws.

L'errore che ho avuto è che l'utente cron non ha potuto accedere /usr/local/bin/awsdurante l'esecuzione; può solo accedere/usr/bin/

Quello che ho fatto è stato creare un collegamento /usr/binper aws con il comando seguente.

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

Ho anche aggiunto alcune modifiche alla mia sceneggiatura; ecco una funzione di esempio:

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

}

E la voce cron:

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

Questo metodo ha funzionato per me.


Mansur, la tua formattazione della risposta è completamente rotta.
Aldekein,

l'utilizzo del percorso completo /usr/bin/awsè la chiave per la soluzione.
Ramratan Gupta,

1

Questa riga nel .bashrcfile predefinito per l'utente impedirà alle shell non interattive di ottenere l'ambiente utente completo (inclusa la variabile PATH):

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

Commenta la riga per consentire $HOME/.bashrcl'esecuzione da un contesto non interattivo.

Ho anche dovuto aggiungere un sourcecomando esplicito al mio script di shell per configurare correttamente l'ambiente:

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

Vedi questa risposta per ulteriori informazioni.


1

Sappiamo tutti che la variabile del percorso di ambiente $ PATH ha la posizione dei binari. $ PATH di Crontab potrebbe non avere awscli di posizione.

Quello che puoi fare è trovare il percorso di awscli binario.

# which aws
/usr/local/bin/aws

e aggiungi il percorso in $ PATH di crontab aggiungendo la riga sotto all'inizio dello script (dopo shebang).

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

Questo ha funzionato per me !!!


La tua risposta ha funzionato per me. Grattandomi la testa per un'ora. Grazie amico
Hussain7 il

0

So che non è la soluzione perfetta ma ha funzionato per me:

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

Solo per aggiungere un po 'di valore aggiunto, ho awscliriscontrato problemi con la nuova versione di bash mentre utilizzavo lo strumento installato tramite PIP, ho scoperto che nulla funzionerà con questo strumento con le nuove versioni di bash.

Sono stato in grado di risolvere installando aws-apitools-ec2questo può essere installato da

yum install -y aws-apitools-ec2 

Vi allego la sua guida per ulteriori riferimenti.

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


su Ubuntu 16.04 non sono riuscito a trovare il pacchetto.
BorracciaBlu,

0

Ho avuto lo stesso problema, ma dopo aver rimosso il reindirizzamento stderr dalla mia voce cron ( 2>@1), ho visto aws: command not foundnel registro.

Questo perché AWS cli è stato installato nella cartella home dell'utente e ho aggiunto una riga al mio utente .bash_profileper aggiungere il percorso cli AWS a $PATH. Stranamente, questo è in effetti il ​​modo in cui la documentazione di installazione di AWS cli ti dice di installarlo. Ma l'utente .bash_profilenon si abitua quando viene eseguito il crontab dell'utente (almeno non nel mio ambiente).

Quindi tutto ciò che ho fatto per risolvere questo problema era assicurarmi che il mio script crontab avesse anche il percorso aws cli nel suo percorso. Quindi sotto lo shebang della mia sceneggiatura, ora ho PATH=~/.local/bin:$PATH.


0

Per me questo ha funzionato:

#!/bin/bash

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

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

L'utente predefinito nelle istanze EC2 odierne è ubuntu e la cartella principale è quella home directory dell'utente. Ecco dove esiste anche il aws cli.


0

Non il migliore, ma ho dovuto fornire la configurazione direttamente nel mio script shell / bash prima dei comandi del client AWS. piace:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.