web-dev-qa-db-fra.com

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

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

29
binaryorganic

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.

21
chicks

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/
36
Garreth McDaid

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
6
Daniel Tronolone

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.

1
Mansur Ali

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.

1
Peter Gluck

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 !!!

1
Nijil

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

0
Mansur Ali

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 ....
0
user1859675

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.

0
GotBatteries

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.

0
alexkb

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
0
Gustavo