AWS CLI’yı CRON’dan çalıştıramıyor (kimlik bilgileri)


27

Basit bir AWS CLI yedekleme betiği çalıştırmaya çalışıyorum. Bir içerme dosyasındaki çizgiler arasında dolaşır, bu yolları S3'e kadar yedekler ve çıktıyı bir günlük dosyasına döker. Bu komutu doğrudan çalıştırdığımda, hatasız çalışıyor. CRON üzerinden çalıştırdığımda çıktı günlüğümde "Kimlik bilgileri bulunamıyor" hatası alıyorum.

Kabuk betiği:

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

Satırı sadece config dosyasını görmeye başladım, hatayı görmeye başladım, düzeltebileceğimi düşünüyorum (AWS'nin varsayılan olarak göründüğü yer olmasına emin olduğum halde).

Shell betiği root olarak çalışıyor. AWS config dosyasını belirtilen yerde görebiliyorum. Ve hepsi bana iyi geliyor (dediğim gibi, CRON'un dışında iyi çalışıyor).


2
İçin mutlak bir yol deneyin ~/.aws/config.
ceejayoz

Bunu kesinlikle denedi (/root/.aws/config kullanıyordu), ancak diğer bazı iş parçacıklarında gördükten sonra tekrar ~ / 'e atladı. Her iki şekilde de aynı hata.
binaryorganic

2
Doğrudan bir cevap değil, API tuşlarını kullanma hakkında bir yorum: Örneklerinize roller atamak ve bu rollerin etrafında politikalar oluşturmak daha iyi bir uygulamadır (ve çok daha kolaydır) ve sonra anahtarları belirtmeniz gerekmez. Örnek üzerinde düz metinlerle etrafta yatmalarını sağlayın. Ne yazık ki bu, yalnızca örnek oluşturma zamanında belirtilebilir. Bunun yanı sıra, günlük dosyalarının (ve yedeklerin vb.) Kopyalanması için rsync'e benzer işlevsellik sağlayan s3cmd araçlarına bakın.
nico,

Yanıtlar:


20

Doğrudan çalıştırdığınızda çalışır, ancak crondan değil, çevrede muhtemelen farklı bir şey vardır. Yaparak ortamınızı etkileşimli olarak kaydedebilirsiniz.

set | sort > env.interactive

Ve betiğinde de aynı şeyi yap.

set | sort > /tmp/env.cron

Ve sonra diff /tmp/env.cron env.interactiveönemli olan ne bakın. Gibi şeyler PATHen muhtemel suçlulardır.


4
Teşekkürler! Sorunu kendi başıma giderebilmeye yönelik bir adım, temel olarak paha biçilmezdir. PATH değişkeninde kesinlikle bazı farklılıklar vardı ve bence bu durumda HOME'da bir şeyleri fırlatan fark oldu. Benim özel sorunumdan gelince, bunu sadece ucumdaki her şeyi çözen / etc / crontab yerine kullanıcının cron dosyasından çalıştırarak bitirdim. Tekrar teşekkürler!
binaryorganic

Sağ. doğru bir PATHdeğişken eklemek ( echo $PATHne olması gerektiğini söyleyecektir) komut dosyasında genellikle çözer.
Fr0zenFyr

33

Bir işi crontab'dan çalıştırdığınızda, $HOME ortam değişkeniniz/

Amazon istemcisi ya arar

~/.aws/config

veya

~/.aws/credentials

Eğer $HOME= ise /, müşteri bu dosyaları bulamaz

Çalışmasını sağlamak için, betiğinizi güncellemek için gerçek bir giriş dizini verecek şekilde güncelleyin. $HOME

export HOME=/root

ve sonra bir config veya kimlik bilgisi dosyalarını

/root/.aws/

Bu , aws komutu için mutlak yolun eklenmesini içeren stackoverflow.com/a/26480929/354709 adresindeki aşağıdaki düzeltmeyle birlikte - $ PATH root kullanıcısında doğru bir şekilde ayarlanmamıştır.
Dan Smart,

2
Bu kabul edilen cevap olmalı.
Madbreaks

6

Bu sorunu şu şekilde çözebildim :

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

1
Ancak yapmanın tek aws configureamacı, komut dosyalarına kimlik bilgisi koymanıza gerek kalmamasıdır. Bu sorunu çözmek için @ chicks tarafından gönderilen cevaba bakınız.
Madbreaks

1
Kodlarda saklamayın AWS_ACCESS_KEY_IDve AWS_SECRET_ACCESS_KEYdeğerleri saklamayın . İlk satır zaten bu değerleri sağlamalıydı.
AWippler

2

Bu kodu crontab -e içine çalıştırılacak komut satırından önce koyun

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

İlk çözümü diff ile yaptım ama hiçbir şey ile denedim. benim için püf noktası PATH değişkeni idi.
borracciaBlu

1

Aws cli aracının ikili dosyaları altında kuruludur /usr/local/bin/aws.

Sahip olduğum hata cron kullanıcısının /usr/local/bin/awsçalışırken erişemeyeceği ; sadece erişebilir/usr/bin/

Yaptığım şey bir bağlantı oluşturmaktı. /usr/bin aşağıdaki komutu içeren aws için .

root@gateway:~# ln -s /usr/local/bin/aws /usr/bin/aws

Ayrıca betiğimde bazı değişiklikler de ekledim; İşte örnek bir fonksiyon:

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

}

Ve cron girişi:

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

Bu yöntem benim için çalıştı.


Mansur, cevap biçimlendirme tamamen bozuldu.
Aldekein 27:16

tam yol kullanarak /usr/bin/awsçözüm için anahtardır.
Ramratan Gupta

1

.bashrcKullanıcının varsayılan dosyasındaki bu satır, etkileşimli olmayan kabukların tam kullanıcı ortamını almasını önler (PATH değişkeni dahil):

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

$HOME/.bashrcEtkileşimli olmayan bir bağlamda yürütülmesine izin vermek için satırı yorumlayın .

Ayrıca sourceortamın doğru şekilde kurulmasını sağlamak için kabuk komut dosyama açık bir komut eklemem gerekiyordu:

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

Ek bilgi için bu cevaba bakınız .


1

Hepimiz biliyoruz ki $ PATH çevre yolu değişkeni ikilik konumlara sahiptir. $ Crontab of PATH, awscli konumunda olmayabilir.

Yapabileceğin şey, awscli binary yolunu bulmak.

# which aws
/usr/local/bin/aws

ve betiğinizin başına (shebang'dan sonra) aşağıdaki satırı ekleyerek crontab'ın $ PATH dizinine ekleyin.

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

Bu benim için çalıştı !!!


Cevabınız benim için çalıştı. Bir saat boyunca kafamı tırmalamak. Teşekkürler dostum
Hussain7

0

Bunun mükemmel bir çözüm olmadığını biliyorum ama bu benim için işe yaradı:

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

Aynı sorunu yaşadım, ancak cder girişimden stderr yönlendirmesini çıkardıktan sonra ( 2>@1) aws: command not foundkayıt defterinde gördüm .

Bunun nedeni AWS cli'nin kullanıcının giriş klasörüne kurulmuş olması ve .bash_profileAWS cli yolunu eklemek için kullanıcıma bir satır eklemiş olmamdır $PATH. İşin garibi, bu aslında AWS cli kurulum belgelerinin size kurulumunu söyleme şekli . Ancak, kullanıcının .bash_profilecrontab'ı yürütüldüğünde kullanıcı alışmaz (en azından benim çevremde değil).

Bu yüzden bunu düzeltmek için tek yaptığım, crontab betiğimin de kendi yolunda aws cli'larının olmasını sağlamaktı. Yani senaryomun shebang altında, şimdi var PATH=~/.local/bin:$PATH.


0

Benim için bu hile yaptı:

#!/bin/bash

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

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

Bugünün EC2 örneklerinde varsayılan kullanıcı ubuntu'dur ve kök klasör bu kullanıcıların giriş klasörüdür. Aws cli'nin de var olduğu yer burası.


0

En iyisi değil, fakat AWS istemcisi komutlarından önce config kodunu doğrudan shell / bash betiğimde sağlamak zorunda kaldım. sevmek:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.