36 votes

Impossible d'exécuter AWS CLI à partir de CRON (certificats)

Essayer d'exécuter un script de sauvegarde AWS CLI simple. Il boucle à travers les lignes dans un fichier d'inclusion, sauvegarde ces chemins vers S3 et enregistre la sortie dans un fichier journal. Lorsque j'exécute cette commande directement, elle s'exécute sans erreur. Lorsque je l'exécute via CRON, j'obtiens une erreur "Impossible de localiser les informations d'identification" dans mon fichier journal de sortie.

Le script shell :

AWS_CONFIG_FILE="~/.aws/config"

while read p; do
 /usr/local/bin/aws s3 cp $p s3://CHEMIN/VERS/BUCKET --recursive >> /CHEMIN/VERS/LOG 2>&1
done 

`

J'ai ajouté la ligne au fichier de configuration après avoir commencé à voir l'erreur, pensant que cela pourrait la corriger (même si je suis assez sûr que c'est là où AWS regarde par défaut).

Le script shell s'exécute en tant que root. Je peux voir le fichier de configuration AWS à l'emplacement spécifié. Et tout me semble bon (comme je l'ai dit, cela fonctionne bien en dehors de CRON).

`

46voto

Garreth McDaid Points 3269

Lorsque vous exécutez une tâche à partir de crontab, votre variable d'environnement $HOME est /

Le client Amazon recherche soit

~/.aws/config

ou

~/.aws/credentials

Si $HOME = /, alors le client ne trouvera pas ces fichiers

Pour que cela fonctionne, mettez à jour votre script pour qu'il exporte un répertoire home réel pour $HOME

export HOME=/root

et ensuite placez un fichier de configuration ou de credentials dans

/root/.aws/

24voto

chicks Points 3599

Si cela fonctionne lorsque vous l'exécutez directement mais pas depuis cron, il y a probablement quelque chose de différent dans l'environnement. Vous pouvez sauvegarder votre environnement de manière interactive en faisant

set | sort > env.interactive

Et faites la même chose dans votre script

set | sort > /tmp/env.cron

Et ensuite diff /tmp/env.cron env.interactive et voyez ce qui importe. Des choses comme PATH sont les coupables les plus probables.

6voto

WeSee Points 296

J'ai pu résoudre ce problème grâce à ce qui suit:

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

3voto

Placez ce code avant votre ligne de commande à exécuter dans crontab -e

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

1voto

Mansur Ul Hasan Points 264

Les binaires de l'outil aws cli sont installés sous /usr/local/bin/aws.

L'erreur que j'ai rencontrée est que l'utilisateur cron ne pouvait pas accéder à /usr/local/bin/aws lors de son exécution; il peut seulement accéder à /usr/bin/

Ce que j'ai fait a été de créer un lien dans /usr/bin pour aws avec la commande ci-dessous.

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

J'ai également apporté quelques modifications dans mon script; voici une fonction d'exemple:

starter () {
    echo "
    ==================================================

    Démarrage de l'instance

    ==================================================
    "

    /usr/bin/aws ec2 start-instances --instance-ids $instance --region us-east-1

    sleep 30

    echo "Attribution de l'adresse IP"

    /usr/bin/aws ec2 associate-address --instance-id $instance  --region us-east-1 --public-ip XX.XX.XX.XX

}

Et l'entrée cron:

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

Cette méthode a fonctionné pour moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X