Tidak dapat menjalankan AWS CLI dari CRON (kredensial)

27

Mencoba menjalankan skrip cadangan AWS CLI sederhana. Ini loop melalui baris dalam file sertakan, mendukung jalur tersebut hingga S3, dan membuang output ke file log. Ketika saya menjalankan perintah ini secara langsung, itu berjalan tanpa kesalahan. Ketika saya menjalankannya melalui CRON saya mendapatkan kesalahan "Tidak dapat menemukan kredensial" di log output saya.

Script shell:

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

Saya hanya menambahkan baris ke file konfigurasi setelah saya mulai melihat kesalahan, berpikir ini mungkin memperbaikinya (meskipun saya cukup yakin di situlah AWS terlihat secara default).

Script shell berjalan sebagai root. Saya dapat melihat file konfigurasi AWS di lokasi yang ditentukan. Dan itu semua terlihat bagus untuk saya (seperti saya katakan, itu berjalan dengan baik di luar CRON).

binerorganik
sumber
2
Coba jalur absolut ke ~/.aws/config.
ceejayoz
Pasti mencobanya dulu (menggunakan /root/.aws/config), tetapi melompat kembali ke ~ / setelah melihatnya di beberapa utas lainnya. Kesalahan yang sama juga.
binaryorganic
2
Bukan jawaban langsung tetapi komentar tentang penggunaan kunci API: Ini adalah praktik yang lebih baik (dan lebih mudah) untuk menetapkan peran ke instance Anda, dan membuat kebijakan di sekitar peran itu, dan kemudian Anda tidak diharuskan untuk menentukan kunci sama sekali, atau minta mereka berbaring di plaintext pada contoh. Sayangnya ini hanya dapat ditentukan saat waktu pembuatan. Sebagai tambahan, untuk menyalin file log (dan cadangan dll) lihat alat s3cmd, yang menyediakan fungsionalitas yang mirip dengan rsync.
nico

Jawaban:

20

Jika berfungsi ketika Anda menjalankannya secara langsung tetapi tidak dari cron mungkin ada sesuatu yang berbeda di lingkungan. Anda dapat menyelamatkan lingkungan Anda secara interaktif dengan melakukan

set | sort > env.interactive

Dan lakukan hal yang sama dalam naskah Anda

set | sort > /tmp/env.cron

Dan kemudian diff /tmp/env.cron env.interactivedan lihat apa yang penting. Hal-hal seperti PATHadalah penyebab yang paling mungkin.

anak ayam
sumber
4
Terima kasih! Langkah menuju kemampuan untuk memecahkan masalah sendiri pada dasarnya sangat berharga. Jelas ada beberapa perbedaan dalam variabel PATH, dan saya agak berpikir dalam kasus ini adalah perbedaan dalam HOME yang membuang semuanya. Adapun masalah spesifik saya, saya akhirnya hanya menjalankan ini dari file cron pengguna, bukan / etc / crontab, yang menyelesaikan semuanya pada saya. Terima kasih lagi!
binaryorganic
Kanan. menambahkan PATHvariabel yang benar ( echo $PATHakan memberi tahu apa yang seharusnya) dalam skrip biasanya menyelesaikannya.
Fr0zenFyr
33

Saat Anda menjalankan pekerjaan dari crontab, $HOMEvariabel lingkungan Anda adalah/

Klien Amazon mencari keduanya

~/.aws/config

atau

~/.aws/credentials

Jika $HOME= /, maka klien tidak akan menemukan file-file itu

Untuk membuatnya berfungsi, perbarui skrip Anda sehingga mengekspor direktori home aktual untuk $HOME

export HOME=/root

dan kemudian masukkan file config atau kredensial

/root/.aws/
Garreth McDaid
sumber
Ini membantu, bersama dengan perbaikan berikut dari stackoverflow.com/a/26480929/354709 yang melibatkan penambahan path absolut untuk perintah aws - karena $ PATH tidak diatur dengan benar di pengguna root.
Dan Smart
2
Ini harus menjadi jawaban yang diterima.
Madbreaks
6

Saya dapat mengatasi masalah ini melalui yang berikut :

export AWS_CONFIG_FILE="/root/.aws/config"
export AWS_ACCESS_KEY_ID=XXXX
export AWS_SECRET_ACCESS_KEY=YYYY
Daniel Tronolone
sumber
1
Tetapi inti dari melakukan aws configureini adalah agar Anda tidak harus memasukkan kredensial dalam skrip misalnya. Lihat jawaban yang diposting oleh @chicks untuk menyelesaikannya dengan benar.
Madbreaks
1
Jangan simpan AWS_ACCESS_KEY_IDdan AWS_SECRET_ACCESS_KEYnilai dalam skrip. Baris pertama seharusnya sudah memberikan nilai-nilai itu.
AWippler
2

Letakkan kode ini sebelum baris perintah Anda untuk dieksekusi ke crontab -e

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Roberto Carlos Reyes Fernández
sumber
Saya mencoba solusi pertama dengan diff tetapi tidak ada. Trik bagi saya adalah variabel PATH.
borracciaBlu
1

Biner aws cli tool diinstal di bawah /usr/local/bin/aws.

Kesalahan yang saya miliki adalah bahwa pengguna cron tidak dapat mengakses /usr/local/bin/awssaat menjalankan; itu hanya dapat mengakses/usr/bin/

Apa yang saya lakukan adalah membuat tautan /usr/binuntuk aws dengan perintah di bawah ini.

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

Saya juga menambahkan beberapa perubahan pada skrip saya; di sini adalah fungsi sampel:

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

}

Dan entri cron:

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

Metode ini bekerja untuk saya.

Mansur Ali
sumber
Mansur, format jawaban Anda benar-benar rusak.
Aldekein
menggunakan path lengkap /usr/bin/awsadalah kunci untuk solusi.
Ramratan Gupta
1

Baris ini di .bashrcfile default untuk pengguna akan mencegah shell non-interaktif dari mendapatkan lingkungan pengguna penuh (termasuk variabel PATH):

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

Komentari garis keluar untuk memungkinkan $HOME/.bashrcdieksekusi dari konteks non-interaktif.

Saya juga harus menambahkan sourceperintah eksplisit ke skrip shell saya untuk mengatur lingkungan dengan benar:

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

Lihat jawaban ini untuk info tambahan.

Peter Gluck
sumber
1

Kita semua tahu bahwa variabel path lingkungan $ PATH memiliki lokasi binari. $ PATH dari Crontab mungkin tidak memiliki lokasi awscli.

Yang dapat Anda lakukan adalah, temukan path binary awscli.

# which aws
/usr/local/bin/aws

dan tambahkan path di $ PATH of crontab dengan menambahkan baris di bawah ini di awal skrip Anda (setelah shebang).

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

Ini berhasil untuk saya !!!

Nijil
sumber
Jawaban Anda berhasil untuk saya. Menggaruk kepalaku selama satu jam. Terima kasih, sobat
Hussain7
0

Saya tahu itu bukan solusi yang sempurna tetapi itu berhasil bagi saya:

export HOME=/home/user
export AWS_CONFIG_FILE="/home/user/.aws/config"
export AWS_ACCESS_KEY_ID=XXX
export AWS_SECRET_ACCESS_KEY=XXX
Gustavo
sumber
0

Hanya untuk menambahkan beberapa nilai tambah, saya mengalami masalah dengan versi bash baru saat menggunakan awsclialat yang diinstal melalui PIP saya menemukan bahwa tidak ada yang akan berfungsi dengan alat ini dengan versi bash baru.

Saya dapat menyelesaikan dengan menginstal aws-apitools-ec2ini dapat menginstal oleh

yum install -y aws-apitools-ec2 

Saya melampirkan panduannya untuk referensi lebih lanjut.

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

Mansur Ali
sumber
di ubuntu 16.04 saya tidak dapat menemukan paketnya.
borracciaBlu
0

Saya memiliki masalah yang sama, tetapi setelah menghapus stderr redirect dari entri cron saya ( 2>@1), saya melihat aws: command not founddi log.

Ini karena AWS cli diinstal di folder home pengguna dan saya telah menambahkan baris ke pengguna saya .bash_profileuntuk menambahkan jalur AWS AWS ke $PATH. Anehnya, ini sebenarnya cara dokumentasi AWS cli install memberitahu Anda untuk menginstalnya. Tetapi pengguna .bash_profiletidak terbiasa ketika crontab pengguna dijalankan (setidaknya tidak di lingkungan saya).

Jadi yang saya lakukan untuk memperbaikinya adalah memastikan skrip crontab saya juga memiliki aws cli di jalurnya. Jadi di bawah shebang skrip saya, sekarang saya miliki PATH=~/.local/bin:$PATH.

alexkb
sumber
0

Bagi saya ini berhasil:

#!/bin/bash

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

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

Pengguna default di instance EC2 todays adalah ubuntu, dan folder root adalah folder home pengguna tersebut. Di situlah aws cli juga ada.

GotBatteries
sumber
0

Bukan yang terbaik, tapi saya harus memberikan konfigurasi langsung di skrip shell / bash saya sebelum perintah klien AWS. seperti:

#!/bin/bash

export AWS_ACCESS_KEY_ID=<ZZZ>
export AWS_SECRET_ACCESS_KEY=<AAA>
export AWS_DEFAULT_REGION=<BBB>
aws s3 cp ....
pengguna1859675
sumber