Essayer d'exécuter un simple script de sauvegarde AWS CLI. Il parcourt les lignes d'un fichier inclus, sauvegarde ces chemins jusqu'à S3 et sauvegarde la sortie dans un fichier journal. Lorsque j'exécute cette commande directement, elle s'exécute sans aucune erreur. Lorsque je l'exécute via CRON, j'obtiens une erreur "Impossible de localiser les informations d'identification" dans mon journal de sortie.
Le script 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
Je n'ai ajouté la ligne au fichier de configuration qu'après avoir commencé à voir l'erreur, pensant que cela pourrait la corriger (même si je suis presque sûr que c'est là qu'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 bien (comme je l'ai dit, cela fonctionne bien en dehors de CRON).
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 alors diff /tmp/env.cron env.interactive
et voyez ce qui compte. Des choses comme PATH
sont les coupables les plus probables.
Lorsque vous exécutez un travail à partir de crontab, votre $HOME
la variable d'environnement est /
Le client Amazon recherche soit
~/.aws/config
ou
~/.aws/credentials
Si $HOME
= /
, le client ne trouvera pas ces fichiers
Pour le faire fonctionner, mettez à jour votre script afin qu'il exporte un véritable répertoire personnel pour $HOME
export HOME=/root
puis mettez une configuration ou des fichiers d'informations d'identification dans
/root/.aws/
J'ai pu résoudre ce problème via ce qui suit :
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
Mettez 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
Les fichiers binaires de l'outil aws cli sont installés sous /usr/local/bin/aws
.
L'erreur que j'ai eue est que l'utilisateur cron n'a pas pu accéder à /usr/local/bin/aws
en courant; il ne peut accéder qu'à /usr/bin/
J'ai créé 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 ajouté quelques changements dans mon script; voici un exemple de fonction:
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
}
Et l'entrée cron:
30 5 * * * sh /usr/local/cron/magentocron.sh
Cette méthode a fonctionné pour moi.
Cette ligne dans la valeur par défaut .bashrc
le fichier pour l'utilisateur empêchera les shells non interactifs d'obtenir l'environnement utilisateur complet (y compris la variable PATH):
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
Commentez la ligne pour autoriser $HOME/.bashrc
à exécuter à 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.
Nous savons tous que la variable de chemin d'environnement $ PATH a l'emplacement des binaires. $ PATH de Crontab peut ne pas avoir d'emplacement awscli.
Ce que vous pouvez faire est de trouver le chemin du binaire awscli.
# which aws
/usr/local/bin/aws
et ajoutez le chemin dans $ PATH de crontab en ajoutant la ligne ci-dessous au début de votre script (après Shebang).
PATH=$PATH:/usr/local/bin/
Cela a fonctionné pour moi !!!
Juste pour ajouter de la valeur ajoutée, j'ai eu un problème avec la nouvelle version de bash lors de l'utilisation de l'outil awscli
installé via PIP, j'ai trouvé que rien ne fonctionnerait 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é par
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
Pas le meilleur, mais j'ai dû fournir la configuration directement dans mon script Shell/bash avant les commandes du client AWS. comme:
#!/bin/bash
export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
Pour moi, cela a fait l'affaire:
#!/bin/bash
HOME=/home/ubuntu
AWS_CONFIG_FILE="/home/ubuntu/.aws/config"
aws ec2 describe-instances #or whatever command you need to use.
L'utilisateur par défaut dans les instances EC2 d'aujourd'hui est ubuntu et le dossier racine est le dossier de départ de l'utilisateur. C'est là que le aws cli existe également.
J'ai eu 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 l'AWS cli a été installé dans le dossier de départ de l'utilisateur et que j'avais ajouté une ligne au .bash_profile
De mon utilisateur pour ajouter le chemin AWS cli au $PATH
. Curieusement, c'est en fait la façon dont AWS cli install documentation vous dit de l'installer. Mais l'utilisateur .bash_profile
N'est pas utilisé lorsque la crontab de l'utilisateur est exécutée (du moins pas dans mon environnement de toute façon).
Donc, tout ce que j'ai fait pour résoudre ce problème était de m'assurer que mon script crontab avait également le aws cli sur son chemin. Donc, sous le Shebang de mon script, j'ai maintenant PATH=~/.local/bin:$PATH
.
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