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).

`

1voto

hashpling Points 263

Cette ligne dans le fichier .bashrc par défaut pour l'utilisateur empêchera les shells non interactifs d'obtenir l'environnement utilisateur complet (y compris la variable PATH) :

# Si ce n'est pas interactif, ne rien faire
[ -z "$PS1" ] && return

Commentez la ligne pour permettre l'exécution de $HOME/.bashrc à partir d'un contexte non interactif.

J'ai également dû ajouter une commande source explicite à mon script shell pour configurer correctement l'environnement :

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

Voir cette réponse pour plus d'informations.

1voto

Nijil Points 121

Nous savons tous que la variable d'environnement $PATH contient l'emplacement des binaires. Le $PATH de Crontab pourrait ne pas contenir l'emplacement awscli.

Ce que vous pouvez faire, c'est trouver le chemin du binaire awscli.

# which aws
/usr/local/bin/aws

et ajouter le chemin dans le $PATH de crontab en ajoutant la ligne suivante au début de votre script (après le shebang).

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

Cela a fonctionné pour moi!!!

0voto

Je sais que ce n'est pas la solution parfaite mais cela a fonctionné pour moi:

export HOME=/home/user
export AWS_CONFIG_FILE="/home/user/.aws/config"
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=XXX

0voto

Mansur Ul Hasan Points 264

Juste pour ajouter de la valeur ajoutée, j'avais des problèmes avec la nouvelle version de bash lors de l'utilisation de l'outil awscli installé via PIP, j'ai trouvé que rien ne fonctionnera avec cet outil avec les nouvelles versions de bash.

J'ai pu résoudre le problème en installant aws-apitools-ec2 cela peut être installé en utilisant

yum install -y aws-apitools-ec2 

Je joins son guide pour plus de référence.

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

0voto

alexkb Points 103

J'avais le même problème, mais après avoir supprimé la redirection stderr de mon entrée cron (2>@1), j'ai vu aws: command not found dans le journal.

Cela est dû au fait que le AWS cli était installé dans le dossier personnel de l'utilisateur et j'avais ajouté une ligne au .bash_profile de mon utilisateur pour ajouter le chemin du AWS cli au $PATH. Étrangement, c'est en fait la manière dont la documentation d'installation de AWS cli vous dit de l'installer. Mais le .bash_profile de l'utilisateur n'est pas utilisé lorsque le crontab de l'utilisateur est exécuté (du moins pas dans mon environnement en tout cas).

Donc tout ce que j'ai fait pour résoudre ce problème était de m'assurer que le script de mon crontab avait également le aws cli dans son chemin. Donc en dessous du shebang de mon script, j'ai maintenant PATH=~/.local/bin:$PATH.

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