Dapatkah saya secara otomatis memulai dan menghentikan instans Amazon saya menggunakan API Amazon? Bisakah Anda menjelaskan bagaimana ini bisa dilakukan? Idealnya, saya perlu memulai instance dan menghentikan instance pada interval waktu yang ditentukan setiap hari.
api
amazon-ec2
amazon-web-services
Semacam spageti
sumber
sumber
Jawaban:
Seandainya seseorang tersandung pada pertanyaan lama ini, saat ini Anda dapat mencapai hal yang sama dengan menambahkan jadwal ke grup penskalaan otomatis: tingkatkan jumlah instance dalam grup penskalaan otomatis menjadi 1 pada waktu tertentu dan turunkan kembali ke 0 setelahnya .
Dan karena jawaban ini mendapatkan banyak tampilan, saya berpikir untuk menautkan ke panduan yang sangat membantu tentang ini: Menjalankan Instans EC2 pada Jadwal Berulang dengan Auto Scaling
sumber
Anda dapat mencoba menggunakan alat API Amazon EC2 secara langsung. Hanya ada dua perintah yang Anda butuhkan: ec2-start-instance dan ec2-stop-instance. Pastikan variabel lingkungan seperti EC2_HOME, AWS_CREDENTIAL_FILE, EC2_CERT, EC2_PRIVATE_KEY, dll. Dikonfigurasi dengan benar dan semua kredensial AWS, sertifikat, dan file kunci pribadi berada di lokasi yang tepat - Anda dapat menemukan info selengkapnya di dokumentasi alat API AWS EC2.
Anda dapat menguji perintah dengan tangan terlebih dahulu dan kemudian, ketika semuanya berfungsi dengan baik, konfigurasikan crontab Unix atau Tugas Terjadwal di Windows. Anda dapat menemukan contoh di bawah ini untuk file Linux / etc / crontab (jangan lupa bahwa semua variabel lingkungan yang disebutkan di atas harus ada untuk pengguna 'akun-Anda'.
Saya seorang pengembang untuk proyek BitNami Cloud, di mana kami mengemas alat AWS (termasuk yang saya sebutkan) dalam penginstal gratis dan mudah digunakan yang mungkin ingin Anda coba: BitNami CloudTools pack stack
sumber
Saya menyarankan Anda untuk melihat Panduan Memulai EC2 , yang menunjukkan kepada Anda bagaimana melakukan apa yang Anda perlukan dengan menggunakan alat baris perintah EC2. Anda dapat dengan mudah membuat skrip ini menjadi pekerjaan cron (di Linux / UNIX) atau pekerjaan terjadwal di Windows untuk memanggil perintah start dan stop pada waktu tertentu.
Jika Anda ingin melakukan ini dari kode Anda sendiri, Anda dapat menggunakan SOAP atau REST API; lihat Panduan Pengembang untuk detailnya.
sumber
Saya menulis kode dengan Python, menggunakan pustaka Boto, untuk melakukan ini. Anda dapat menyesuaikan ini untuk penggunaan Anda sendiri. Pastikan untuk menjalankan ini sebagai bagian dari tugas cron, dan Anda akan dapat memulai atau mematikan sebanyak mungkin instans yang Anda perlukan selama pekerjaan cron dijalankan.
#!/usr/bin/python # # Auto-start and stop EC2 instances # import boto, datetime, sys from time import gmtime, strftime, sleep # AWS credentials aws_key = "AKIAxxx" aws_secret = "abcd" # The instances that we want to auto-start/stop instances = [ # You can have tuples in this format: # [instance-id, name/description, startHour, stopHour, ipAddress] ["i-12345678", "Description", "00", "12", "1.2.3.4"] ] # -------------------------------------------- # If its the weekend, then quit # If you don't care about the weekend, remove these three # lines of code below. weekday = datetime.datetime.today().weekday() if (weekday == 5) or (weekday == 6): sys.exit() # Connect to EC2 conn = boto.connect_ec2(aws_key, aws_secret) # Get current hour hh = strftime("%H", gmtime()) # For each instance for (instance, description, start, stop, ip) in instances: # If this is the hour of starting it... if (hh == start): # Start the instance conn.start_instances(instance_ids=[instance]) # Sleep for a few seconds to ensure starting sleep(10) # Associate the Elastic IP with instance if ip: conn.associate_address(instance, ip) # If this is the hour of stopping it... if (hh == stop): # Stop the instance conn.stop_instances(instance_ids=[instance])
sumber
Jika bukan misi penting - Hal sederhana yang harus dilakukan adalah menjadwalkan file batch untuk menjalankan 'SHUTDOWN' (windows) pada jam 3 pagi setiap hari. Maka setidaknya Anda tidak mengambil risiko secara tidak sengaja meninggalkan instance yang tidak diinginkan berjalan tanpa batas.
Jelas ini hanya separuh cerita!
sumber
Perusahaan tempat saya bekerja memiliki pelanggan yang secara teratur bertanya tentang hal ini sehingga kami telah menulis aplikasi penjadwalan EC2 freeware yang tersedia di sini:
http://blog.simple-help.com/2012/03/free-ec2-scheduler/
Ini berfungsi di Windows dan Mac, memungkinkan Anda membuat beberapa jadwal harian / mingguan / bulanan dan memungkinkan Anda menggunakan filter yang cocok untuk menyertakan sejumlah besar contoh dengan mudah atau menyertakan yang Anda tambahkan di masa mendatang.
sumber
AWS Data Pipeline berfungsi dengan baik. https://aws.amazon.com/premiumsupport/knowledge-center/stop-start-ec2-instances/
Jika Anda ingin mengecualikan hari dari awal (misalnya akhir pekan) tambahkan objek ShellCommandPrecondition.
Di AWS Console / Data Pipeline, buat pipeline baru. Lebih mudah untuk mengedit / mengimpor definisi (JSON)
Letakkan skrip Bash yang akan di-dowload dan dijalankan sebagai prasyarat di bucket S3 Anda
Saat mengaktifkan dan menjalankan pipeline pada hari-hari akhir pekan, Status Kesehatan Pipeline konsol AWS membaca "ERROR" yang menyesatkan. Skrip bash mengembalikan kesalahan (keluar 1) dan EC2 tidak dimulai. Pada hari ke 1 sampai ke 5, statusnya adalah "SEHAT".
Untuk menghentikan EC2 secara otomatis pada waktu penutupan kantor, gunakan perintah AWS CLI setiap hari tanpa prasyarat.
sumber
Anda bisa melihat Ylastic untuk melakukan ini. Alternatifnya tampaknya menjalankan satu mesin yang mematikan / memulai instance lain menggunakan tugas cron atau tugas terjadwal.
Jelas jika Anda hanya menginginkan satu contoh, ini adalah solusi yang mahal, karena satu mesin harus selalu berjalan, dan membayar ~ $ 80 sebulan untuk satu mesin menjalankan tugas cron tidaklah efektif dari segi biaya.
sumber
AutoScaling terbatas pada instans penghentian. Jika Anda ingin menghentikan sebuah instance dan mempertahankan status server, maka skrip eksternal adalah pendekatan terbaik.
Anda dapat melakukan ini dengan menjalankan pekerjaan di instans lain yang berjalan 24/7 atau Anda dapat menggunakan layanan pihak ketiga seperti Ylastic (disebutkan di atas) atau Rocket Peak .
Misalnya di C # kode untuk menghentikan server cukup mudah:
sumber
IMHO menambahkan jadwal ke grup penskalaan otomatis adalah pendekatan "seperti cloud" terbaik seperti yang disebutkan sebelumnya.
Tetapi jika Anda tidak dapat menghentikan instans Anda dan menggunakan yang baru, misalnya jika Anda memiliki IP Elastis yang terkait dengan dll.
Anda dapat membuat skrip Ruby untuk memulai dan menghentikan instance Anda berdasarkan rentang waktu tanggal.
#!/usr/bin/env ruby # based on https://github.com/phstc/amazon_start_stop require 'fog' require 'tzinfo' START_HOUR = 6 # Start 6AM STOP_HOUR = 0 # Stop 0AM (midnight) conn = Fog::Compute::AWS.new(aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) server = conn.servers.get('instance-id') tz = TZInfo::Timezone.get('America/Sao_Paulo') now = tz.now stopped_range = (now.hour >= STOP_HOUR && now.hour < START_HOUR) running_range = !stopped_range if stopped_range && server.state != 'stopped' server.stop end if running_range && server.state != 'running' server.start # if you need an Elastic IP # (everytime you stop an instance Amazon dissociates Elastic IPs) # # server.wait_for { state == 'running' } # conn.associate_address server.id, 127.0.0.0 end
Silahkan lihat pada amazon_start_stop untuk membuat scheduler gratis menggunakan Heroku Scheduler .
sumber
Meskipun ada cara untuk mencapai ini menggunakan penskalaan otomatis, ini mungkin tidak cocok untuk semua kesempatan karena ini menghentikan instans. Cron job tidak akan pernah berfungsi untuk satu instance (meskipun ini dapat digunakan dengan sempurna untuk situasi seperti menghentikan satu instance dan menjadwalkan instance lain saat menjalankan banyak instance). Anda dapat menggunakan panggilan API seperti StartInstancesRequest , dan StopInstancesRequest untuk mencapai hal yang sama, tetapi sekali lagi Anda harus mengandalkan sumber daya ketiga. Ada banyak aplikasi untuk menjadwalkan instans AWS dengan banyak fitur, tetapi untuk solusi sederhana saya akan merekomendasikan aplikasi gratis seperti snapleaf.io
sumber
Ya, Anda dapat melakukannya menggunakan AWS Lambda. Anda dapat memilih pemicu di Cloudwatch yang berjalan pada ekspresi Cron pada UTC.
Ini adalah tautan terkait https://aws.amazon.com/premiumsupport/knowledge-center/start-stop-lambda-cloudwatch/
Alternatif lain adalah dengan menggunakan
awscli
yang tersedia daripip
,apt-get
,yum
ataubrew
, dan kemudian berjalanaws configure
dengan mandat Anda yang diekspor dari IAM dan mengeksekusi skrip bash berikut, untuk menghentikan EC2 yang telah ditandai denganName: Appname
danValue: Appname Prod
. Anda dapat menggunakanawscli
untuk menandai instans Anda atau menandainya secara manual dari konsol AWS.aws ec2 stop-instances
akan menghentikan instance danjq
digunakan untuk memfilter kueri json dan mengambil id instance yang benar menggunakan tag dariaws ec2 describe-instances
.Untuk memverifikasi bahwa
aws configure
berhasil dan mengembalikan keluaran json yang dijalankanaws ec2 describe-instances
dan id instance yang sedang berjalan harus ada di keluaran. Berikut adalah contoh keluarannyaThe bash script berikut ini
stop-ec2.sh
di/home/centos/cron-scripts/
mana terinspirasi dari SO posting iniJalankan file menggunakan
sh /home/centos/cron-scripts/stop-ec2.sh
dan verifikasi bahwa instans EC2 dihentikan. Untuk men-debug, jalankanaws ec2 describe-instances | jq '.Reservations[].Instances | select(.[].Tags[].Value | startswith("Appname Prod") ) | select(.[].Tags[].Key == "Appname") | {InstanceId: .[].InstanceId, PublicDnsName: .[].PublicDnsName, State: .[].State, LaunchTime: .[].LaunchTime, Tags: .[].Tags} | [.]' | jq -r .[].InstanceId
dan lihat apakah itu mengembalikan ID instance yang benar yang telah diberi tag.Kemudian di
crontab -e
baris berikut dapat ditambahkan30 14 * * * sh /home/centos/cron-scripts/stop-ec2.sh >> /tmp/stop
yang akan mencatat keluaran ke
/tmp/stop
. Ini30 14 * * *
adalah ekspresi cron UTC yang dapat Anda periksahttps://crontab.guru/
. Demikian pula, mengganti denganaws ec2 start-instances
dapat memulai sebuah instance.sumber
Saya yakin pertanyaan awal itu agak membingungkan. Itu tergantung pada apa yang dibutuhkan Pasta: 1. meluncurkan / mengakhiri (penyimpanan instans) - Penskalaan Otomatis adalah solusi yang tepat (jawaban Nakedible) 2. memulai / menghentikan instans boot EBS - Penskalaan Otomatis tidak membantu, saya menggunakan skrip terjadwal jarak jauh (mis. , ec2 CLI).
sumber
Anda tidak dapat melakukan ini secara otomatis, atau setidaknya tidak tanpa beberapa pemrograman dan manipulasi API dalam file skrip. Jika Anda ingin solusi yang dapat diandalkan untuk menghentikan, memulai ulang, dan mengelola gambar Anda (mungkin untuk mengontrol biaya di lingkungan Anda) maka Anda mungkin ingin melihat LabSlice . Penafian: Saya bekerja untuk perusahaan ini.
sumber