CRON에서 AWS CLI를 실행할 수 없음 (자격 증명) 실행됩니다. CRON을 통해 실행할

간단한 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/

이것은 나를 위해 일했다! !!