Tentando executar um script de backup simples da AWS CLI. Ele percorre as linhas em um arquivo de inclusão, faz backup desses caminhos até o S3 e despeja a saída em um arquivo de log. Quando executo esse comando diretamente, ele é executado sem nenhum erro. Quando o executo pelo CRON, recebo o erro "Não é possível localizar credenciais" no meu log de saída.
O 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
Eu apenas adicionei a linha ao arquivo de configuração depois que comecei a ver o erro, pensando que isso pode corrigi-lo (mesmo tendo certeza de que é onde a AWS parece por padrão).
O script do shell está sendo executado como root. Eu posso ver o arquivo de configuração da AWS no local especificado. E tudo parece bom para mim (como eu disse, funciona bem fora do CRON).
bash
amazon-web-services
cron
shell
binário-orgânico
fonte
fonte
~/.aws/config
.Respostas:
Se funcionar quando você o executa diretamente, mas não a partir do cron, provavelmente há algo diferente no ambiente. Você pode salvar seu ambiente interativamente fazendo
E faça a mesma coisa no seu script
E então
diff /tmp/env.cron env.interactive
e veja o que importa. Coisas comoPATH
são os culpados mais prováveis.fonte
PATH
variável correta (echo $PATH
dirá o que deveria ser) no script geralmente a resolve.Quando você executa um trabalho no crontab, sua
$HOME
variável de ambiente é/
O cliente Amazon procura por
ou
Se
$HOME
=/
, o cliente não encontrará esses arquivosPara fazê-lo funcionar, atualize seu script para que exporte um diretório inicial real para
$HOME
e, em seguida, coloque os arquivos de configuração ou credenciais em
fonte
Consegui resolver esse problema da seguinte maneira :
fonte
aws configure
é fazer com que você não precise colocar credenciais, por exemplo, scripts. Veja a resposta postada por @chicks para resolver isso corretamente.AWS_ACCESS_KEY_ID
eAWS_SECRET_ACCESS_KEY
valores em scripts. A primeira linha já deveria ter fornecido esses valores.Coloque esse código antes da linha de comando para ser executado no crontab -e
fonte
Os binários da ferramenta aws cli estão instalados em
/usr/local/bin/aws
.O erro que tive foi que o usuário cron não pôde acessar
/usr/local/bin/aws
durante a execução; só pode acessar/usr/bin/
O que fiz foi criar um link
/usr/bin
para aws com o comando abaixo.Eu também adicionei algumas mudanças no meu script; aqui está uma função de exemplo:
E a entrada cron:
Este método funcionou para mim.
fonte
/usr/bin/aws
é a chave para a solução.Esta linha no
.bashrc
arquivo padrão para o usuário impedirá que shells não interativos obtenham o ambiente completo do usuário (incluindo a variável PATH):Comente a linha para permitir
$HOME/.bashrc
a execução a partir de um contexto não interativo.Eu também precisei adicionar um
source
comando explícito ao meu script de shell para configurar o ambiente corretamente:Veja esta resposta para informações adicionais.
fonte
Todos sabemos que a variável de caminho do ambiente $ PATH possui a localização dos binários. $ PATH do Crontab pode não ter a localização awscli.
O que você pode fazer é encontrar o caminho do binário awscli.
e adicione o caminho em $ PATH do crontab adicionando a linha abaixo no início do seu script (após shebang).
Isso funcionou para mim !!!
fonte
Eu sei que não é a solução perfeita, mas que funcionou para mim:
fonte
Apenas para adicionar algum valor agregado, eu estava tendo problemas com a nova versão do bash ao usar a
awscli
ferramenta instalada via PIP, e descobri que nada funcionaria com essa ferramenta nas novas versões do bash.Eu era capaz de resolver instalando
aws-apitools-ec2
este pode ser instalado porEstou anexando seu guia para mais referências.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
fonte
Eu tive o mesmo problema, mas depois de remover o redirecionamento stderr da minha entrada cron (
2>@1
), viaws: command not found
no log.Isso ocorre porque o cli da AWS foi instalado na pasta inicial do usuário e eu adicionei uma linha ao meu usuário
.bash_profile
para adicionar o caminho do cli da AWS ao$PATH
. Estranhamente, é assim que a documentação de instalação do AWS cli diz para você instalá-lo. Mas o usuário.bash_profile
não se acostuma quando o crontab do usuário é executado (pelo menos não no meu ambiente).Então, tudo o que fiz para corrigir isso foi garantir que meu script crontab também tivesse o aws cli em seu caminho. Então, abaixo do shebang do meu script, eu tenho agora
PATH=~/.local/bin:$PATH
.fonte
Para mim, isso fez o truque:
O usuário padrão nas instâncias atuais do EC2 é o ubuntu e a pasta raiz é a pasta inicial do usuário. É aí que o aws cli existe também.
fonte
Não é o melhor, mas tive que fornecer a configuração diretamente no meu script shell / bash antes dos comandos do cliente da AWS. gostar:
fonte