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).
sumber
~/.aws/config
.Jawaban:
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
Dan lakukan hal yang sama dalam naskah Anda
Dan kemudian
diff /tmp/env.cron env.interactive
dan lihat apa yang penting. Hal-hal sepertiPATH
adalah penyebab yang paling mungkin.sumber
PATH
variabel yang benar (echo $PATH
akan memberi tahu apa yang seharusnya) dalam skrip biasanya menyelesaikannya.Saat Anda menjalankan pekerjaan dari crontab,
$HOME
variabel lingkungan Anda adalah/
Klien Amazon mencari keduanya
atau
Jika
$HOME
=/
, maka klien tidak akan menemukan file-file ituUntuk membuatnya berfungsi, perbarui skrip Anda sehingga mengekspor direktori home aktual untuk
$HOME
dan kemudian masukkan file config atau kredensial
sumber
Saya dapat mengatasi masalah ini melalui yang berikut :
sumber
aws configure
ini adalah agar Anda tidak harus memasukkan kredensial dalam skrip misalnya. Lihat jawaban yang diposting oleh @chicks untuk menyelesaikannya dengan benar.AWS_ACCESS_KEY_ID
danAWS_SECRET_ACCESS_KEY
nilai dalam skrip. Baris pertama seharusnya sudah memberikan nilai-nilai itu.Letakkan kode ini sebelum baris perintah Anda untuk dieksekusi ke crontab -e
sumber
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/aws
saat menjalankan; itu hanya dapat mengakses/usr/bin/
Apa yang saya lakukan adalah membuat tautan
/usr/bin
untuk aws dengan perintah di bawah ini.Saya juga menambahkan beberapa perubahan pada skrip saya; di sini adalah fungsi sampel:
Dan entri cron:
Metode ini bekerja untuk saya.
sumber
/usr/bin/aws
adalah kunci untuk solusi.Baris ini di
.bashrc
file default untuk pengguna akan mencegah shell non-interaktif dari mendapatkan lingkungan pengguna penuh (termasuk variabel PATH):Komentari garis keluar untuk memungkinkan
$HOME/.bashrc
dieksekusi dari konteks non-interaktif.Saya juga harus menambahkan
source
perintah eksplisit ke skrip shell saya untuk mengatur lingkungan dengan benar:Lihat jawaban ini untuk info tambahan.
sumber
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.
dan tambahkan path di $ PATH of crontab dengan menambahkan baris di bawah ini di awal skrip Anda (setelah shebang).
Ini berhasil untuk saya !!!
sumber
Saya tahu itu bukan solusi yang sempurna tetapi itu berhasil bagi saya:
sumber
Hanya untuk menambahkan beberapa nilai tambah, saya mengalami masalah dengan versi bash baru saat menggunakan
awscli
alat 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-ec2
ini dapat menginstal olehSaya melampirkan panduannya untuk referensi lebih lanjut.
http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/ec2-clt.pdf
sumber
Saya memiliki masalah yang sama, tetapi setelah menghapus stderr redirect dari entri cron saya (
2>@1
), saya melihataws: command not found
di log.Ini karena AWS cli diinstal di folder home pengguna dan saya telah menambahkan baris ke pengguna saya
.bash_profile
untuk menambahkan jalur AWS AWS ke$PATH
. Anehnya, ini sebenarnya cara dokumentasi AWS cli install memberitahu Anda untuk menginstalnya. Tetapi pengguna.bash_profile
tidak 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
.sumber
Bagi saya ini berhasil:
Pengguna default di instance EC2 todays adalah ubuntu, dan folder root adalah folder home pengguna tersebut. Di situlah aws cli juga ada.
sumber
Bukan yang terbaik, tapi saya harus memberikan konfigurasi langsung di skrip shell / bash saya sebelum perintah klien AWS. seperti:
sumber