Essayer d'exécuter un simple script de sauvegarde AWS CLI. Il parcourt les lignes d'un fichier include, 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 pratiquement 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).
la source
~/.aws/config
.Réponses:
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
Et faites la même chose dans votre script
Et puis
diff /tmp/env.cron env.interactive
et voyez ce qui compte. Des choses commePATH
les coupables les plus probables.la source
PATH
variable correcte (echo $PATH
indiquera ce qu'elle devrait être) dans le script la résout généralement .Lorsque vous exécutez un travail à partir de crontab, votre
$HOME
variable d'environnement est/
Le client Amazon recherche soit
ou
Si
$HOME
=/
, le client ne trouvera pas ces fichiersPour le faire fonctionner, mettez à jour votre script afin qu'il exporte un véritable répertoire personnel pour
$HOME
puis mettez une configuration ou des fichiers d'informations d'identification dans
la source
J'ai pu résoudre ce problème grâce aux éléments suivants :
la source
aws configure
est de ne pas avoir à mettre de justificatifs d'identité, par exemple dans des scripts. Voir la réponse publiée par @chicks pour résoudre ce problème correctement.AWS_ACCESS_KEY_ID
etAWS_SECRET_ACCESS_KEY
valeurs dans les scripts. La première ligne aurait déjà dû fournir ces valeurs.Mettez ce code avant votre ligne de commande à exécuter dans crontab -e
la source
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 cours d'exécution; il ne peut accéder qu'à/usr/bin/
Ce que j'ai fait était de créer un lien
/usr/bin
pour aws avec la commande ci-dessous.J'ai également ajouté quelques changements dans mon script; voici un exemple de fonction:
Et l'entrée cron:
Cette méthode a fonctionné pour moi.
la source
/usr/bin/aws
est la clé de la solution.Cette ligne dans le
.bashrc
fichier par défaut de l'utilisateur empêchera les shells non interactifs d'obtenir l'environnement utilisateur complet (y compris la variable PATH):Commentez la ligne pour permettre
$HOME/.bashrc
son exécution à partir d'un contexte non interactif.J'ai également dû ajouter une
source
commande explicite à mon script shell pour configurer correctement l'environnement:Voir cette réponse pour plus d'informations.
la source
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.
et ajoutez le chemin dans $ PATH de crontab en ajoutant la ligne ci-dessous au début de votre script (après shebang).
Cela a fonctionné pour moi !!!
la source
Je sais que ce n'est pas la solution parfaite mais cela a fonctionné pour moi:
la source
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'
awscli
outil installé via PIP, j'ai constaté que rien ne fonctionnerait avec cet outil avec les nouvelles versions de bash.J'ai pu résoudre en installant
aws-apitools-ec2
cela peut être installé parJe joins son guide pour plus de référence.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
la source
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 vuaws: command not found
dans le journal.En effet, l'AWS cli a été installé dans le dossier de base de l'utilisateur et j'avais ajouté une ligne à mon utilisateur
.bash_profile
pour ajouter le chemin AWS cli au$PATH
. Curieusement, c'est en fait la façon dont la documentation d'installation d'AWS cli 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, je l'ai maintenant
PATH=~/.local/bin:$PATH
.la source
Pour moi, cela a fait l'affaire:
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.
la source
Pas le meilleur, mais j'ai dû fournir la configuration directement dans mon script shell / bash avant les commandes du client AWS. comme:
la source