간단한 AWS CLI 백업 스크립트를 실행하려고합니다. 포함 파일에서 행을 반복하고 해당 경로를 S3까지 백업하며 출력을 로그 파일로 덤프합니다. 이 명령을 직접 실행하면 오류없이 실행됩니다. CRON을 통해 실행할 때 출력 로그에 “자격 증명을 찾을 수 없습니다”라는 오류가 발생합니다.
쉘 스크립트 :
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
오류가 발생하기 시작한 후에 만 구성 파일에 줄을 추가했는데, 이것이 AWS가 기본적으로 보이는 위치라고 확신하더라도 오류를 해결할 수 있다고 생각했습니다.
쉘 스크립트가 루트로 실행 중입니다. 지정된 위치에서 AWS 구성 파일을 볼 수 있습니다. 그리고 그것은 모두 나에게 좋아 보입니다 (내가 말했듯이 CRON 외부에서 잘 작동합니다).
답변
cron에서 직접 실행하지 않고 직접 실행할 때 작동하면 환경에 다른 것이있을 수 있습니다. 다음을 수행하여 대화식으로 환경을 저장할 수 있습니다
set | sort > env.interactive
그리고 당신의 스크립트에서 같은 일을
set | sort > /tmp/env.cron
그리고 diff /tmp/env.cron env.interactive
중요한 것이 무엇인지보십시오. PATH
가장 가능성있는 범인은 다음 과 같습니다.
답변
crontab에서 작업을 실행할 때 $HOME
환경 변수는/
Amazon 클라이언트는 다음 중 하나를 찾습니다
~/.aws/config
또는
~/.aws/credentials
경우 $HOME
= /
, 클라이언트는 해당 파일을 찾을 수 없습니다
작동하려면 스크립트를 업데이트하여 실제 홈 디렉토리를 내보내십시오. $HOME
export HOME=/root
그런 다음 구성 또는 자격 증명 파일을
/root/.aws/
답변
다음을 통해이 문제를 해결할 수있었습니다 .
export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
답변
이 코드를 명령 행 앞에 두어 crontab -e에 실행하십시오.
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
답변
AWS CLI 도구의 바이너리는 아래에 설치됩니다 /usr/local/bin/aws
.
내가 가진 오류는 cron 사용자가 /usr/local/bin/aws
실행하는 동안 액세스 할 수 없다는 것입니다 . 그것은 단지 액세스 할 수 있습니다/usr/bin/
내가 /usr/bin
한 것은 아래 명령으로 aws 에 대한 링크를 만드는 것 입니다.
root@gateway:~# ln -s /usr/local/bin/aws /usr/bin/aws
또한 스크립트에 몇 가지 변경 사항을 추가했습니다. 다음은 샘플 함수입니다.
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
}
그리고 cron 항목 :
30 5 * * * sh /usr/local/cron/magentocron.sh
이 방법은 저에게 효과적이었습니다.
답변
.bashrc
사용자 의 기본 파일에있는 이 줄은 비 대화식 쉘이 전체 사용자 환경 (PATH 변수 포함)을 얻지 못하게합니다.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
$HOME/.bashrc
비대화 형 컨텍스트에서 실행될 수 있도록 라인을 주석 처리하십시오 .
또한 source
환경을 올바르게 설정하려면 쉘 스크립트에 명시 적 명령 을 추가 해야했습니다.
#!/bin/bash
source $HOME/.bashrc
추가 정보는 이 답변 을 참조하십시오 .
답변
우리는 환경 경로 변수 $ PATH에 바이너리 위치가 있다는 것을 알고 있습니다. Crontab의 $ PATH에 위치 awscli가 없을 수 있습니다.
당신이 할 수있는 일은 awscli 바이너리의 경로를 찾는 것입니다.
# which aws
/usr/local/bin/aws
스크립트 시작 부분에 (shebang 후) 아래 행을 추가하여 crontab의 $ PATH에 경로를 추가하십시오.
PATH=$PATH:/usr/local/bin/
이것은 나를 위해 일했다! !!