CRON에서 AWS CLI를 실행할 수 없음 (자격 증명)


27

간단한 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 외부에서 잘 작동합니다).


2
에 대한 절대 경로를 시도하십시오 ~/.aws/config.
ceejayoz

확실히 /root/.aws/config를 사용하여 처음 시도했지만 다른 스레드에서 본 후 ~ /로 돌아갔습니다. 어느 쪽이든 같은 오류입니다.
이진 유기

2
직접적인 대답은 아니지만 API 키 사용에 대한 의견 : 인스턴스에 역할을 할당하고 해당 역할에 대한 정책을 작성하는 것이 더 나은 방법이며 훨씬 쉬우므로 키를 지정하지 않아도됩니다. 또는 인스턴스에 평문으로 누워있게합니다. 불행히도 이것은 인스턴스 생성시에만 지정할 수 있습니다. 따로, 로그 파일 (및 백업 등) 복사에는 rsync와 유사한 기능을 제공하는 s3cmd 도구가 있습니다.
니코

답변:


20

cron에서 직접 실행하지 않고 직접 실행할 때 작동하면 환경에 다른 것이있을 수 있습니다. 다음을 수행하여 대화식으로 환경을 저장할 수 있습니다

set | sort > env.interactive

그리고 당신의 스크립트에서 같은 일을

set | sort > /tmp/env.cron

그리고 diff /tmp/env.cron env.interactive중요한 것이 무엇인지보십시오. PATH가장 가능성있는 범인은 다음 과 같습니다.


4
감사! 스스로 문제를 해결할 수있는 단계는 기본적으로 귀중합니다. PATH 변수에는 몇 가지 차이점이 있었으며,이 경우에는 물건을 버리는 것이 HOME의 차이점이라고 생각합니다. 내 특정 문제에 관해서는 / etc / crontab 대신 사용자의 cron 파일에서이를 실행하여 결국 모든 것을 해결했습니다. 다시 감사합니다!
이진 유기

권리. 스크립트에 올바른 PATH변수를 추가하면 ( echo $PATH무엇이되어야하는지 알 수 있음) 보통 해결합니다.
Fr0zenFyr

33

crontab에서 작업을 실행할 때 $HOME환경 변수는/

Amazon 클라이언트는 다음 중 하나를 찾습니다

~/.aws/config

또는

~/.aws/credentials

경우 $HOME= /, 클라이언트는 해당 파일을 찾을 수 없습니다

작동하려면 스크립트를 업데이트하여 실제 홈 디렉토리를 내보내십시오. $HOME

export HOME=/root

그런 다음 구성 또는 자격 증명 파일을

/root/.aws/

이것은 root 사용자에게 $ PATH가 올바르게 설정되지 않았기 때문에 aws 명령의 절대 경로 추가와 관련된 stackoverflow.com/a/26480929/354709 의 다음 수정과 함께 도움이되었습니다 .
Dan Smart

2
이것이 정답입니다.
Madbreaks

6

다음을 통해이 문제를 해결할 수있었습니다 .

export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY

1
그러나 중요한 것은 aws configure스크립트와 같은 자격 증명을 넣을 필요가 없다는 것입니다. 이 문제를 올바르게 해결하려면 @chicks가 게시 한 답변을 참조하십시오.
Madbreaks

1
보관하지 마십시오 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY값 스크립트입니다. 첫 번째 줄은 이미 해당 값을 제공해야합니다.
AWippler

2

이 코드를 명령 행 앞에 두어 crontab -e에 실행하십시오.

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

나는 diff로 첫 번째 해결책을 시도했지만 아무것도하지 않았습니다. 나를위한 트릭은 PATH 변수였습니다.
borracciaBlu

1

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

이 방법은 저에게 효과적이었습니다.


Mansur, 답변 형식이 완전히 깨졌습니다.
Aldekein

전체 경로를 사용하는 /usr/bin/aws것이 솔루션의 핵심입니다.
Ramratan Gupta 1

1

.bashrc사용자 의 기본 파일에있는 이 줄은 비 대화식 쉘이 전체 사용자 환경 (PATH 변수 포함)을 얻지 못하게합니다.

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

$HOME/.bashrc비대화 형 컨텍스트에서 실행될 수 있도록 라인을 주석 처리하십시오 .

또한 source환경을 올바르게 설정하려면 쉘 스크립트에 명시 적 명령 을 추가 해야했습니다.

#!/bin/bash
source $HOME/.bashrc

추가 정보는 이 답변 을 참조하십시오 .


1

우리는 환경 경로 변수 $ PATH에 바이너리 위치가 있다는 것을 알고 있습니다. Crontab의 $ PATH에 위치 awscli가 없을 수 있습니다.

당신이 할 수있는 일은 awscli 바이너리의 경로를 찾는 것입니다.

# which aws
/usr/local/bin/aws

스크립트 시작 부분에 (shebang 후) 아래 행을 추가하여 crontab의 $ PATH에 경로를 추가하십시오.

PATH=$PATH:/usr/local/bin/

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


당신의 대답은 나를 위해 일했습니다. 한 시간 동안 내 머리를 긁적. 감사합니다, 친구
Hussain7

0

완벽한 솔루션은 아니지만 저에게 효과적이라는 것을 알고 있습니다.

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

awscliPIP를 통해 설치된 도구 를 사용하는 동안 새로운 bash 버전에 문제가 발생했습니다. 새로운 bash 버전 에서는이 도구와 아무것도 작동하지 않습니다.

설치하여 해결할 aws-apitools-ec2수 있습니다.

yum install -y aws-apitools-ec2 

자세한 내용을 위해 가이드를 첨부하고 있습니다.

http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf


우분투 16.04에서 패키지를 찾을 수 없습니다.
borracciaBlu

0

같은 문제가 있었지만 cron 항목 ( 2>@1) 에서 stderr 리디렉션을 제거한 후 aws: command not found로그에서 보았습니다 .

AWS cli가 사용자의 홈 폴더에 설치되었고 .bash_profileAWS cli 경로를에 추가하기 위해 사용자의 줄을 추가했기 때문 $PATH입니다. 이상하게도, 이것은 실제로 AWS CLI 설치 설명서 에서 설치하도록 지시 하는 방식입니다 . 그러나 .bash_profile사용자의 crontab이 실행될 때 사용자는 사용되지 않습니다 (적어도 내 환경에서는 그렇지 않습니다).

그래서이 문제를 해결하기 위해 crontab 스크립트에 aws cli가 있는지 확인했습니다. 내 스크립트의 shebang 아래에 이제 있습니다 PATH=~/.local/bin:$PATH.


0

나에게 이것은 트릭을했다 :

#!/bin/bash

HOME=/home/ubuntu
AWS_CONFIG_FILE="/home/ubuntu/.aws/config"

aws ec2 describe-instances #or whatever command you need to use.

오늘날 EC2 인스턴스의 기본 사용자는 우분투이며 루트 폴더는 해당 사용자의 홈 폴더입니다. 그것이 바로 AWS CLI가 존재하는 곳입니다.


0

최선은 아니지만 AWS 클라이언트 명령 전에 쉘 / bash 스크립트에서 직접 구성을 제공해야했습니다. 처럼:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.