AWS CLI को CRON (क्रेडेंशियल्स) से नहीं चला सकते


27

एक साधारण AWS सीएलआई बैकअप स्क्रिप्ट चलाने की कोशिश कर रहा है। यह एक शामिल फ़ाइल में लाइनों के माध्यम से छोरों, उन रास्तों को 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
सिजॉयज

निश्चित रूप से कोशिश की गई कि पहले (/root/.aws/config का उपयोग कर रहा था), लेकिन कुछ अन्य थ्रेड्स में इसे देखने के बाद वापस ~ / पर कूद गया। वैसे ही त्रुटि।
बाइनरीऑर्गनिक जूल

2
प्रत्यक्ष उत्तर नहीं बल्कि एपीआई कुंजी का उपयोग करने के बारे में एक टिप्पणी: यह बेहतर है (और अधिक आसान) अपने उदाहरणों के लिए भूमिकाएँ सौंपना, और उन भूमिकाओं के आसपास नीतियां बनाना, और फिर आपको चाबियाँ निर्दिष्ट करने की आवश्यकता नहीं है, या उदाहरण के लिए उन्हें प्लेनटेक्स में लेटा हुआ है। दुर्भाग्य से यह केवल उदाहरण के निर्माण के समय पर निर्दिष्ट किया जा सकता है। एक तरफ के रूप में, लॉगफ़ाइल्स (और बैकअप आदि) की प्रतिलिपि बनाने के लिए s3cmd टूल पर एक नज़र है, जो rsync के समान कार्यक्षमता प्रदान करता है।
निको

जवाबों:


20

यदि यह काम करता है जब आप इसे सीधे चलाते हैं लेकिन क्रोन से नहीं तो शायद पर्यावरण में कुछ अलग है। आप अंतःक्रियात्मक रूप से अपने पर्यावरण को बचा सकते हैं

set | sort > env.interactive

और अपनी स्क्रिप्ट में वही काम करो

set | sort > /tmp/env.cron

और फिर diff /tmp/env.cron env.interactiveदेखें कि क्या मायने रखता है। जैसी चीजें PATHसबसे अधिक संभावित अपराधी हैं।


4
धन्यवाद! अपने दम पर समस्या का निवारण करने में सक्षम होने की दिशा में एक कदम मूल रूप से अमूल्य है। PATH वैरिएबल में निश्चित रूप से कई अंतर थे, और मुझे लगता है कि इस मामले में यह गृह का अंतर था जो चीजों को फेंक रहा था। अपने विशिष्ट मुद्दे के रूप में, मैंने इसे केवल / etc / crontab के बजाय उपयोगकर्ता की क्रोन फ़ाइल से चलाना समाप्त किया, जिसने मेरे अंत में सब कुछ हल कर दिया। एक बार फिर धन्यवाद!
बाइनरीऑर्गेनिक जूल

सही। स्क्रिप्ट में एक सही PATHचर जोड़ना ( echo $PATHबताएगा कि यह क्या होना चाहिए) आमतौर पर इसे हल करता है।
Fr0zenFyr

33

जब आप क्रॉस्टैब से नौकरी चलाते हैं, तो आपका $HOMEपर्यावरण परिवर्तनशील होता है/

अमेज़ॅन क्लाइंट या तो दिखता है

~/.aws/config

या

~/.aws/credentials

यदि $HOME= /, तो क्लाइंट को वे फाइलें नहीं मिलेंगी

इसे काम करने के लिए, अपनी स्क्रिप्ट को अपडेट करें ताकि यह एक वास्तविक होम डायरेक्टरी का निर्यात करे $HOME

export HOME=/root

और फिर एक विन्यास या क्रेडेंशियल फ़ाइलों को अंदर रखें

/root/.aws/

यह मदद की से निम्नलिखित फिक्स के साथ stackoverflow.com/a/26480929/354709 जो एडब्ल्यूएस आदेश के लिए निरपेक्ष पथ को जोड़ने शामिल - $ पथ जड़ उपयोगकर्ता में सही ढंग से निर्धारित नहीं थी।
दान स्मार्ट

2
यह स्वीकृत उत्तर होना चाहिए।
मदब्राइक्स

6

मैं निम्नलिखित के माध्यम से इस मुद्दे को हल करने में सक्षम था :

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

1
लेकिन ऐसा करने की पूरी बात aws configureयह है कि आपको लिपियों को उदा लिपियों में नहीं डालना है। इसे ठीक से हल करने के लिए @chicks द्वारा पोस्ट किया गया उत्तर देखें।
मैडब्रेक्स

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

मैंने अंतर के साथ पहला समाधान करने की कोशिश की, लेकिन कुछ भी नहीं। मेरे लिए चाल पैठ चर थी।
बोर्रैकियाब्लू

1

Aws cli टूल के बायनेरिज़ के अंतर्गत स्थापित किया गया है /usr/local/bin/aws

मेरे पास त्रुटि यह थी कि क्रोन उपयोगकर्ता /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

}

और क्रोन प्रविष्टि:

30 5 * * * sh /usr/local/cron/magentocron.sh

इस विधि ने मेरे लिए काम किया।


मंसूर, आपका जवाब स्वरूपण पूरी तरह से टूट गया है।
एल्डेकिन

पूर्ण पथ /usr/bin/awsका उपयोग समाधान की कुंजी है।
रामरतन गुप्ता

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 में स्थान अस्कोली नहीं हो सकता है।

आप जो कुछ भी कर सकते हैं, वह है अस्कोली बाइनरी का रास्ता खोजें।

# which aws
/usr/local/bin/aws

और अपनी पटकथा की शुरुआत में (शेबंग के बाद) नीचे पंक्ति को जोड़कर कॉन्टैब के $ PATH में पथ जोड़ें।

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

यह मेरे लिए काम किया !!!


आपके जवाब ने मेरे लिए काम किया। एक घंटे तक मेरा सिर खुजलाता रहा। धन्यवाद, दोस्त
हुसैन 7

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

बस कुछ वैल्यू एडेड करने के लिए मैं नए bash वर्जन के साथ इश्यू कर रहा था जबकि awscliPIP i के द्वारा इंस्टॉल टूल का उपयोग करते हुए मैंने पाया कि नए बैश वर्जन के साथ इस टूल के साथ कुछ भी काम नहीं करेगा।

मैं इसे स्थापित करने के द्वारा हल करने में सक्षम था द्वारा स्थापित aws-apitools-ec2किया जा सकता है

yum install -y aws-apitools-ec2 

मैं अधिक संदर्भ के लिए इसकी मार्गदर्शिका संलग्न कर रहा हूं।

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


ubuntu 16.04 पर मुझे पैकेज नहीं मिला।
बोर्रैकियाब्लू

0

मेरे पास एक ही मुद्दा था, लेकिन मेरी क्रोन प्रविष्टि ( 2>@1) से स्टीडर रीडायरेक्ट को हटाने के बाद , मैंने aws: command not foundलॉग में देखा ।

ऐसा इसलिए है क्योंकि उपयोगकर्ता के होम फोल्डर में AWS क्ली स्थापित किया गया था और मैंने .bash_profileAWS क्ली पथ को जोड़ने के लिए अपने उपयोगकर्ता के लिए एक पंक्ति जोड़ी थी $PATH। अजीब तरह से, यह वास्तव में वह तरीका है जो AWS cli install प्रलेखन आपको इसे स्थापित करने के लिए कहता है। लेकिन .bash_profileउपयोगकर्ता के क्रैटाब को निष्पादित किए जाने पर उपयोगकर्ता को इसका उपयोग नहीं किया जाता है (कम से कम मेरे वातावरण में वैसे भी नहीं)।

इसलिए मैंने इसे ठीक करने के लिए किया था, यह सुनिश्चित करने के लिए कि मेरी क्रेटाब स्क्रिप्ट भी अपने रास्ते में अईएस क्ली थी। इसलिए मेरी स्क्रिप्ट के नीचे, मेरे पास अब है 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 उदाहरणों में डिफ़ॉल्ट उपयोगकर्ता ubuntu है, और रूट फ़ोल्डर यह है कि उपयोगकर्ता होम फ़ोल्डर। यहीं पर अवीस क्ली मौजूद है।


0

सबसे अच्छा नहीं है, लेकिन मुझे एडब्ल्यूएस क्लाइंट कमांड्स से पहले अपने शेल / बैश स्क्रिप्ट में सीधे कॉन्फ़िगरेशन प्रदान करना था। पसंद:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.