ไม่สามารถเรียกใช้ AWS CLI จาก CRON (ข้อมูลรับรอง)


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 ที่ตำแหน่งที่ระบุ และมันก็ดูดีสำหรับฉัน (อย่างที่ฉันบอกว่ามันทำงานได้ดีนอก CRON)


2
~/.aws/configลองเส้นทางที่แน่นอนที่จะ
ceejayoz

ลองใช้ครั้งแรกอย่างแน่นอน (ใช้ /root/.aws/config) แต่กลับไปที่ ~ / หลังจากเห็นในกระทู้อื่น ๆ ข้อผิดพลาดเดียวกันทั้งสองทาง
เลขฐานสอง

2
ไม่ใช่คำตอบโดยตรง แต่เป็นความคิดเห็นเกี่ยวกับการใช้คีย์ API: เป็นการปฏิบัติที่ดีกว่า (และง่ายกว่ามาก) ในการกำหนดบทบาทให้กับอินสแตนซ์ของคุณและสร้างนโยบายเกี่ยวกับบทบาทเหล่านั้นจากนั้นคุณไม่จำเป็นต้องระบุคีย์เลย ให้พวกเขานอนเรียงกันเป็นคนธรรมดา น่าเสียดายที่สิ่งนี้สามารถระบุได้ในเวลาที่สร้างอินสแตนซ์เท่านั้น นอกจากนี้สำหรับการคัดลอก logfiles (และการสำรองข้อมูล ฯลฯ ) มีลักษณะที่เครื่องมือ s3cmd ที่ให้การทำงานคล้ายกับ rsync
โก้

คำตอบ:


20

ถ้ามันทำงานเมื่อคุณเรียกใช้โดยตรง แต่ไม่ใช่จาก cron อาจมีบางสิ่งที่แตกต่างในสภาพแวดล้อม คุณสามารถบันทึกสภาพแวดล้อมแบบโต้ตอบได้ด้วยการทำ

set | sort > env.interactive

และทำสิ่งเดียวกันในสคริปต์ของคุณ

set | sort > /tmp/env.cron

และจากนั้นdiff /tmp/env.cron env.interactiveและดูสิ่งที่สำคัญ สิ่งที่ชอบPATHเป็นตัวการที่น่าจะเป็นไปได้มากที่สุด


4
ขอบคุณ! ขั้นตอนในการแก้ไขปัญหาด้วยตัวเองนั้นเป็นสิ่งที่ประเมินค่าไม่ได้ มีความแตกต่างหลายอย่างในตัวแปร PATH และฉันคิดว่าในกรณีนี้มันเป็นความแตกต่างใน HOME ที่ทิ้งสิ่งต่าง ๆ สำหรับปัญหาเฉพาะของฉันฉันลงเอยด้วยการเรียกใช้จากไฟล์ cron ของผู้ใช้แทนที่จะเป็น / etc / crontab ซึ่งแก้ไขทุกอย่างในตอนท้าย ขอบคุณอีกครั้ง!
ไบนารี

ขวา. การเพิ่มPATHตัวแปรที่ถูกต้อง( echo $PATHจะบอกสิ่งที่ควรจะเป็น) ในสคริปต์มักจะแก้ปัญหาได้
Fr0zenFyr

33

เมื่อคุณเรียกใช้งานจาก crontab $HOMEตัวแปรสภาพแวดล้อมของคุณคือ/

ลูกค้าของ Amazon ก็มองหาเช่นกัน

~/.aws/config

หรือ

~/.aws/credentials

ถ้า $HOME = /จากนั้นไคลเอ็นต์จะไม่พบไฟล์เหล่านั้น

หากต้องการทำให้มันใช้งานได้ให้อัปเดตสคริปต์ของคุณเพื่อให้ส่งออกโฮมไดเรกทอรีจริง $HOME

export HOME=/root

จากนั้นใส่ไฟล์ config หรือหนังสือรับรองใน

/root/.aws/

สิ่งนี้ช่วยรวมถึงการแก้ไขต่อไปนี้จากstackoverflow.com/a/26480929/354709ซึ่งเกี่ยวข้องกับการเพิ่มพา ธ สัมบูรณ์สำหรับคำสั่ง aws - เนื่องจาก $ PATH ไม่ได้ตั้งค่าอย่างถูกต้องในผู้ใช้รูท
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_IDและAWS_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

วิธีนี้ใช้ได้ผลสำหรับฉัน


มันซูการจัดรูปแบบคำตอบของคุณเสียอย่างสมบูรณ์
Aldekein

การใช้เส้นทางแบบเต็ม/usr/bin/awsเป็นกุญแจสำคัญในการแก้ปัญหา
Ramratan Gupta

1

บรรทัดนี้ใน.bashrcไฟล์เริ่มต้นสำหรับผู้ใช้จะป้องกันไม่ให้เชลล์แบบไม่โต้ตอบรับสภาพแวดล้อมผู้ใช้เต็มรูปแบบ (รวมถึงตัวแปร PATH):

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

แสดงความคิดเห็นบรรทัดที่จะอนุญาต $HOME/.bashrcสามารถดำเนินการได้จากบริบทที่ไม่โต้ตอบ

ฉันยังต้องเพิ่มsourceคำสั่งอย่างชัดเจนในเชลล์สคริปต์ของฉันเพื่อให้การตั้งค่าสภาพแวดล้อมถูกต้อง:

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

ดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม


1

เราทุกคนรู้ว่าตัวแปรเส้นทางสภาพแวดล้อม $ PATH มีที่ตั้งของไบนารี $ PATH ของ Crontab อาจไม่มีตำแหน่ง awscli

สิ่งที่คุณสามารถทำได้คือหาเส้นทางของ awscli ไบนารี

# which aws
/usr/local/bin/aws

และเพิ่มเส้นทางใน $ PATH ของ crontab โดยเพิ่มบรรทัดด้านล่างในจุดเริ่มต้นของสคริปต์ของคุณ (หลังจาก shebang)

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

เพียงเพิ่มมูลค่าบางอย่างที่ฉันมีปัญหากับรุ่นทุบตีใหม่ในขณะที่ใช้awscliเครื่องมือที่ติดตั้งผ่าน PIP ฉันพบว่าไม่มีอะไรจะทำงานกับเครื่องมือนี้ด้วยรุ่นทุบตีใหม่

ฉันสามารถแก้ไขได้โดยการติดตั้งaws-apitools-ec2สิ่งนี้สามารถติดตั้งได้

yum install -y aws-apitools-ec2 

ฉันกำลังแนบคำแนะนำสำหรับการอ้างอิงเพิ่มเติม

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


บน Ubuntu 16.04 ฉันหาแพ็คเกจไม่เจอ
borracciaBlu

0

ฉันมีปัญหาเดียวกัน แต่หลังจากลบการเปลี่ยนเส้นทาง stderr จากรายการ cron ของฉัน ( 2>@1) ฉันเห็นaws: command not foundในบันทึก

เพราะนี่คือ CLI AWS ได้รับการติดตั้งในโฟลเดอร์บ้านของผู้ใช้และฉันได้เพิ่มสายให้กับผู้ใช้ของฉันที่.bash_profileจะเพิ่ม AWS เส้นทาง 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 ชอบ:

#!/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.