Intentando ejecutar un script de copia de seguridad simple de AWS CLI. Recorre las líneas en un archivo de inclusión, realiza copias de seguridad de esas rutas hasta S3 y volca la salida en un archivo de registro. Cuando ejecuto este comando directamente, se ejecuta sin ningún error. Cuando lo ejecuto a través de CRON, aparece el error "No se pueden ubicar las credenciales" en mi registro de salida.
El script de 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
Solo agregué la línea al archivo de configuración después de que comencé a ver el error, pensando que esto podría solucionarlo (aunque estoy bastante seguro de que es donde AWS se ve por defecto).
El script de Shell se ejecuta como root. Puedo ver el archivo de configuración de AWS en la ubicación especificada. Y todo me parece bien (como dije, funciona bien fuera de CRON).
fuente
~/.aws/config
.Respuestas:
Si funciona cuando lo ejecutas directamente pero no desde cron, probablemente haya algo diferente en el entorno. Puede guardar su entorno de forma interactiva haciendo
Y haz lo mismo en tu guión
Y luego
diff /tmp/env.cron env.interactive
y ver qué importa. Cosas comoPATH
son los culpables más probables.fuente
PATH
variable correcta (echo $PATH
dirá lo que debería ser) en el script generalmente lo resuelve.Cuando ejecuta un trabajo desde crontab, su
$HOME
variable de entorno es/
El cliente de Amazon busca
o
Si
$HOME
=/
, entonces el cliente no encontrará esos archivosPara que funcione, actualice su script para que exporte un directorio de inicio real para
$HOME
y luego poner una configuración o archivos de credenciales en
fuente
Pude resolver este problema a través de lo siguiente :
fuente
aws configure
es que no tenga que poner credenciales, por ejemplo, en scripts. Vea la respuesta publicada por @chicks para resolver esto correctamente.AWS_ACCESS_KEY_ID
niAWS_SECRET_ACCESS_KEY
valores en scripts. La primera línea ya debería haber proporcionado esos valores.Ponga este código antes de que su línea de comando se ejecute en crontab -e
fuente
Los binarios de la herramienta aws cli se instalan en
/usr/local/bin/aws
.El error que tuve es que el usuario cron no pudo acceder
/usr/local/bin/aws
mientras se ejecutaba; solo puede acceder/usr/bin/
Lo que hice fue crear un enlace
/usr/bin
para aws con el siguiente comando.También agregué algunos cambios en mi script; Aquí hay una función de muestra:
Y la entrada cron:
Este método funcionó para mi.
fuente
/usr/bin/aws
es clave para la solución.Esta línea en el
.bashrc
archivo predeterminado para el usuario evitará que los shells no interactivos obtengan el entorno de usuario completo (incluida la variable PATH):Comente la línea para permitir
$HOME/.bashrc
que se ejecute desde un contexto no interactivo.También tuve que agregar un
source
comando explícito a mi script de shell para configurar el entorno correctamente:Vea esta respuesta para obtener información adicional.
fuente
Todos sabemos que la variable de ruta de entorno $ PATH tiene la ubicación de los archivos binarios. $ PATH de Crontab podría no tener ubicación awscli.
Lo que puedes hacer es encontrar el camino del binario awscli.
y agregue la ruta en $ PATH de crontab agregando la siguiente línea al comienzo de su script (después de shebang).
Esto funcionó para mí!
fuente
Sé que no es la solución perfecta, pero eso funcionó para mí:
fuente
Solo para agregar algo de valor agregado, estaba teniendo problemas con la nueva versión de bash mientras usaba la
awscli
herramienta instalada a través de PIP, descubrí que nada funcionaría con esta herramienta con las nuevas versiones de bash.Pude resolver instalando
aws-apitools-ec2
esto se puede instalar porAdjunto su guía para más referencia.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
fuente
Tuve el mismo problema, pero después de eliminar la redirección stderr de mi entrada cron (
2>@1
), viaws: command not found
en el registro.Esto se debe a que AWS cli se instaló en la carpeta de inicio del usuario y agregué una línea a mi usuario
.bash_profile
para agregar la ruta de AWS cli a$PATH
. Curiosamente, esta es la forma en que la documentación de instalación de AWS cli le indica que lo instale. Pero el usuario.bash_profile
no se utiliza cuando se ejecuta crontab del usuario (al menos no en mi entorno de todos modos).Así que todo lo que hice para solucionar esto fue asegurarme de que mi script crontab también tuviera el aws cli en su camino. Entonces, debajo del shebang de mi guión, ahora tengo
PATH=~/.local/bin:$PATH
.fuente
Para mí esto hizo el truco:
El usuario predeterminado en las instancias EC2 de hoy es ubuntu, y la carpeta raíz es la carpeta de inicio de ese usuario. Ahí es donde también existe el aws cli.
fuente
No es el mejor, pero tuve que proporcionar la configuración directamente en mi script shell / bash antes de que los comandos del cliente AWS. me gusta:
fuente