Skip to content

Instantly share code, notes, and snippets.

@ejlp12
Last active November 25, 2020 15:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ejlp12/2283929b437f271bf5846f6bbe67e063 to your computer and use it in GitHub Desktop.
Save ejlp12/2283929b437f271bf5846f6bbe67e063 to your computer and use it in GitHub Desktop.
aws spot instances

Ketika Anda menjalankan EC2 instance dari AWS Management Console dengan mengklik tombol "Launch instance" atau menggunakan AWS CLI (Command Line Interface) yaitu dengan perintah aws ec2 run-instances ... maka anda menjalankan EC2 instance yang disebut On-Demand instance

Dengan On-Demand instance anda membayar kapasitas komputasi yang dihitung per jam atau detik (minimum 60 detik) tanpa komitmen jangka panjang. Tanpa komitmen jangkan pajang artinya anda dapat menjalankan atau mematikan instance (berhenti) kapan saja. Harga dari On-Demand instance bersifat tetap dan tergantung dari:

  1. Tipe dari EC2 instance (besarnya daya komputasi CPU, memory, storage dan jaringan)
  2. Amazon Machine Image (AMI) yang digunakan. Yang berarti tergantung dari sistem operasi (misalnya Linux atau Windows) dan software yang terdapat didalamnya (misalnya SQL Server database atau software lain yang bisa anda dapatkan dari AWS Marketplace)
  3. AWS Region yang anda pilih

Spot Instance

Nah ada jenis EC2 instance lainnya yaitu yang dinamanakan Spot Instance yang harganya bisa jauh lebih murah dari On-Demand. Harganya bisa sampai 70-90% lebih murah dibanding On-Demand instance. Wow kan?

Kenapa bisa lebih murah? Karena Spot Instance merupakan instance yang tidak diprioritaskan, sewaktu-waktu AWS bisa mematikan instance tersebut karena pada saat itu permintaan On-Demand instance (instance yang lebih prioritas) sedang banyak-banyaknya :-) dan tidak ada lagi kapasitas yang tersedia tanpa mengorbankan Spot instance yang sedang berjalan.

Jadi saat anda meminta sebuah EC2 Spot instance dengan tipe tertentu, misalkan saja m5.xlarge di Availability Zone (AZ) dan Region tertentu, jika ada kapasitas dengan tipe yang anda request maka anda akan mendapatkan EC2 instance tersebut, artinya anda bisa pakai instance tersebut. Setelah instance kita running dalam waktu tertentu, tiba-tiba banyak pelanggan (customer) AWS lain mencoba menjalankan On-Demand instance dengan tipe yang sama yaitu m5.xlarge di AZ dan Region yang sama dan kebetulan juga pada saat itu tidak ada lagi kapasitas yang "kosong" untuk instance tersebut di AZ dan Region tersebut, hal ini akan menyebabkan EC2 Spot instance yang anda jalankan akan mati secara otomatis (bisa berarti shutdown, terminate atau hibernate) karena kapasitasnya diambil atau diberikan ke pelanggan lain yang mencoba menjalankan On-Demand instance.

Jika permintaan Spot instance dengan tipe tertentu tidak tersedia di AZ dan Region yang anda tentukan, maka request tersebut akan menunggu sampai instance tersebut tersedia kecuali anda gagalkan (cancel) permintaan anda itu. Jadi anda meminta detik ini, selama belum digagalkan, bisa jadi Spot instance anda akan jalan setelah beberapa jam kemudian.

Spot instance juga bisa mati secara tiba-tiba jika harga saat itu mencapai harga maksimum yang anda tentukan. Lebih jelasnya akan dibahas kemudian.

Harga Spot Instance

"Spot" berarti suatu titik di waktu tertentu. Dinamakan "Spot Instance" karena harga perjam dari sebuah Spot Instance dapat berubah-ubah (fluktuatif) setiap waktu, harga tersebut dinamakan Spot price (saya sebut "harga Spot" disini). Harga Spot untuk suatu tipe EC2 instance di suatu AZ dan di waktu tertentu diset oleh AWS dengan perhitungan otomatis yang memperhitungkan permintaan dan ketersediaan (supply and demand) dari Spot Instances.

Spot instance anda akan tetap berjalan (running) saat kapasitasnya tersedia dan juga harga maksimum yang anda tentukan (request) masih lebih rendah dari harga Spot saat itu.

Jadi saat anda melakukan permintaan Spot instance, anda perlu menentukan harga tertentu yaitu harga batas atas dimana anda masih mau membayar agar Spot instance tersebut agar instance tetap berjalan (tidak "dibunuh" atau dimatikan). Misalkan anda meminta (request) Spot instance dengan tipe m5.xlarge dengan menentukan harga maksimum $0.07.

Catatan: Jika anda membaca artikel di tempat lain tentang Spot price dengan konsep tawar-menawar harga (bidding) seperti pada konsep lelang (auction) dimana harga Spot sangat fluktuatif karena harga ditentukan dari tawaran harga dari semua pelanggan yang melakukan permintaan (request) Spot Instances, serta membaca konsep dimana Spot instance dapat mati karena ada pelanggan lain meminta Spot instance yang harga tawaran yang lebih tinggi dari harga Spot yang anda tawarkan, nah konsep bidding itu adalah konsep lama. Konsep baru harga Spot mulai 13 Maret 2018 hanya ditentukan dari supply and demand dari kapasitas EC2 On-Demand sisa (spare capacity) yang tidak digunakan sehingga kemungkinan Spot instance untuk mati menjadi lebih kecil dari saat harganya ditentukan oleh harga lelang.

Untuk menjalankan Spot instance dengan AWS CLI, anda perlu perintah seperti berikut ini, dimana anda bisa tidak menentukan harga Spot maksimum:

aws ec2 run-instances --instance-market-options '{"MarketType":"Spot"}' \
    --image-id ami-1a2b3c4d --count 1 --instance-type t2.micro

Catatan: Jika anda cukup baru dengan layanan AWS, jangan copy-paste perintah diatas karena nilai image-id perlu anda tentukan sesuai dengan Region yang ada pilih. Jadi bisa jadi perintah diatas tidak sesuai dengan lingkungan yang ada gunakan.

atau dengan perintah berikut:

aws ec2 request-spot-instances --instance-count 1 --type "one-time" \
--launch-specification file://specification.json

Catatan: Beberapa contoh file launch-specification bisa dilihat dokumentasi. Anda dapat menentukan atau tidak menentukan AZ tertentu, atau menentukan subnet tertentu di file tersebut dan beberapa opsi lainnya.

Sebelumnya anda harus selalu menentukan harga maksimum seperti ini (Catatan: perintah ini juga masih bisa digunakan saat ini):

aws ec2 run-instances --instance-market-options
'{"MarketType":"spot", "SpotOptions": {"MaxPrice": "0.12"}}' \
 --image-id ami-1a2b3c4d --count 1 --instance-type c3.large

atau seperti ini:

aws ec2 request-spot-instances --spot-price "0.050" \
  --instance-count 1 --type "one-time" \
  --launch-specification file://specification.json

Spot Instance Duration atau Spot blocks

Anda mungkin ingin harga yang murah tapi tidak ingin sewaktu-waktu EC2 instance dimatikan (interrupted) oleh AWS secara tiba-tiba. Anda mungkin ingin kepastian (atau sedikit kepastian) bahwa EC2 instance anda akan tetap jalan selama durasi tertentu misalnya selama beberapa jam.

Nah AWS punya yang namanya Spot blocks, yaitu Spot instance yang didesain tidak akan diinterupsi dan akan terus berjalan dengan durasi yang anda tentukan. Tapi itu tidak benar-benar pasti, AWS menyebutkan pada situasi yang jarang sekali terjadi, Spot block tetap bisa mati sebelum durasi yang kita tentukan, disebabkan karena kebutuhan kapasitas EC2 On-Demand. AWS akan memberikan warning sebelum 2 menit sebelum AWS benar-benar mematikan sebuah Spot block instance dan anda tidak akan dibebani biaya dari instance tersebut walaupun anda sudah menggunakannya dalam durasi tertentu.

Kita dapat meminta Spot blok untuk durasi dengan kelipatan 1 jam, sampai maksimum 6 jam saja.

Harga Spot block juga berfluktuasi tapi tentu saja berbeda dengan Spot instance biasa. Harga Spot blok yang selalu diupdate setiap 5 menit dapat dilihat disini. Ada dua jenis harga Spot block disitu yaitu harga 1 jam dan harga 6 jam. Harga untuk 1 sampai 5 jam mengikuti kelipatan harga 1 jam, misalnya: harga 3 jam berarti 3 kali harga 1 jam.

Untuk meminta Spot blocks dengan AWS CLI, anda hanya perlu menetapkan nilai durasi pada argumen --block-duration seperti berikut:

aws ec2 request-spot-instances \
  --instance-count 5 \
  --block-duration-minutes 120 \
  --type "one-time" \
  --launch-specification file://specification.json

Baca dokumentasi untuk lebih jelasnya. Anda juga bisa lihat beberapa contoh launch spesification disini

Menangani interupsi (tindakan sebelum instance tiba-tiba dimatikan)

Spot instance bisa dimatikan tiba-tiba oleh AWS karena beberapa sebab, oleh karena itu penting untuk melakukan tindakan saat interupsi terjadi atau sebelum terjadi. Beberapa sebab yang menybabkan Spot instance mati adalah:

  • Harga – Harga Spot price lebih besar dari harga maksimum yang ada tentukan
  • Kapasitas – Jika EC instance yang tidak digunakan tidak dapat memenuhi permintaan Spot instances.
  • Batasan-batasan tertentu yang anda tentukan (Constraints) – Misalnya anda menentukan sebuah launch group atau AZ tertentu, makan Spot instance anda akan dimatikan jika batasan tersebut tidak bisa dipenuhi.

EC2 Spot Instance Interruption Warning memberikan peringatan berupa CloudWatch event (message), dua menit sebelum interupsi dilakukan. Dengan adanya event ini, anda bisa melakukan sesuatu disaat interupsi terjadi misalnya anda ingin mendapatkan notifikasi berupa email atau SMS saat Spot instance mati. Selain itu, biasanya event ini digunakan untuk mentrigger aplikasi yang berjalan di Spot instance untuk melakukan sesuatu yang berguna misalnya saja:

  • mengirimkan log file
  • melakukan stop aplikasi dengan layak (proper)
  • mehilangkan (unregister) Spot instance dari load balancer agar traffic tidak dikirim lagi ke instance tersebut

Anda dapat memanfatkan Lambda function yang ditrigger oleh CloudWatch untuk melakukan berbagai hal.

Dua menit sebelum interupsi, selain CloudWatch event, terdapat informasi "EC2 instance metadata" yang bisa digunakan untuk menidentifikasi kejadian tersebut. Instance metadata dapat diperoleh dengan mengirimkan HTTP GET request ke URL yang telah ditentukan, misalnya dengan perintah berikut:

curl -s http://169.254.169.254/latest/meta-data/spot/instance-action

Anda akan mendapatkan reponse seperti ini (note nilai dari key "action" bisa stop, terminate, atau hibernete):

{"action": "stop", "time": "2017-09-18T08:22:00Z"}

Sebelum adanya fitur CLoudWatch event pada Spot instance, pelanggan AWS hanya bisa mengandalkan instance metadata ini sebagai solusi untuk menagani interupsi dengan cara melakukan request HTTP setiap < 2 menit.

Lebih detail baca disini, anda juga bisa mencoba contoh solusi yang memanfatkan Lambda function.

Memilih tipe EC2 instance yang cocok dan dengan kemungkinan interupsi yang kecil

Pertama gunakan prinsip "Right Sizing" kemudian lihat persentase kemungkinan interupsi dari berbagai tipe EC2 instance disini. Persentasi kemungkinan interupsi untuk setiap tipe EC2 berbeda-beda, AWS memberikan informasi berdasarkan riwayat (history) interupsi yang terjadi pada setiap Spot instance, jadi data tersebut selalu diperbarui setiap saat.

Sebisa mungkin pilihlah tipe instance yang presentasi interupsinya < 5% jika aplikasi anda bukan aplikasi yang hanya jalan dalam waktu singkat.

Menentukan batas harga Spot Instance

Untuk anda yang dangat peduli dengan harga, misalnya anda ingin menggunakan spot instances dengan tipe tertentu dan hanya jika harganya dibawah harga tertentu yang anda tentukan tapi tidak ingin instance anda terlalu cepat terinterupsi karena harga yang ada tentukan terlalu kecil, maka data riwayat harga spot akan membantu.

Riwayat harga spot instance bisa didapat menggunakan AWS CLI:

aws ec2 describe-spot-price-history --instance-types m1.xlarge \
 --product-description "Linux/UNIX (Amazon VPC)" \
 --start-time 2014-01-06T07:08:09 \
 --end-time 2014-01-06T08:09:10

atau dilihat dalam bentuk diagram grafik di AWS Administration console seperti contoh berikut

image

Jenis beban kerja (workload) yang cocok menggunakan Spot Instance

Spot Instances merupakan pilihan infrastruktur komputasi yang yang cost-effective jika aplikasi anda bisa jalan dan dapat diinterupsi kapan saja, misalnya data analisis, batch jobs, background processing, proses CI/CD, dan pekerjaan yang bersifat opsional.

Spot Instances juga cocok untuk digunakan untuk aplikasi yang tidak kritis dan hanya perlu berjalan disaat tertentu saja misalnya lingkungan development, atau untuk keperluan ujicoba fungsional atau load test.

Tapi apakah Spot Instance bisa digunakan untuk aplikasi yang perlu hidup terus-menerus? Jawaban singkatnya bisa. Untuk memastikan aplikasi selalu tersedia (high available) anda perlu memiliki beberapa instances yang jalan bersamaan yang menangani beban kerja tertentu dan diseimbangkan bebannya (load balancer) oleh Load Balancer.

Tentu saja walaupun anda memiliki beberapa Spot instances untuk satu aplikasi bisa saja terjadi pada suatu saat semua spot instance terinterupsi sehingga aplikasi anda menjadi mati (outage), oleh karena anda dapt menggabungkan Spot instances dengan On-demand instances untuk aplikasi yang sangat-sangat kritis. Ada baiknya juga anda memiliki mekanisme otomatis untuk menjalankan Spot instance pengganti (dengan tipe lain yang tersedia) saat suatu Spot instance terinterupsi. Jadi Spot instances juga biasa digunakan sebagai suplemen (instance tambahan) yang mendukung On-Demand Instances, disaat tertentu, dan bukan untuk menagangi 100% beban kerja dari aplikasi.

Spot Fleet

Untuk menangani suatu beban kerja suatu aplikasi tertentu kadang anda tidak terlalu memikirkan jenis EC2 instance yang digunakan, anda tidak peduli apakah menggunakan t3.small atau t3.medium atau yang lain, tapi yang penting buat anda adalah total daya komputasi misalnya total anda menginginkan 20 vCPU cores, dan 20 GB memory. Dengan kebutuhan seperti itu, anda bisa menggunakan kira-kira 10 instances t3.small, atau 3 instance t3.large, atau kombinasi {1 instance c3.xlarge ditambah 1 instance c3.4xlarge} dan kombinasi yang lain yang hampir sesuai dengan kebutuhan total daya komputasi anda.

Kebutuhan seperti itu, dapat penuhi dengan menggunakan Spot Fleet. Spot Fleet merupakan kumpulan (fleet) dari Spot Instances yang memenuhi kebutuhan suatu workload tertentu. Spot fleet dapat juga (opsional) terdiri dari On-Demand Instances.

Dengan Spot Fleet, anda bisa menjalankan beberapa Spot Instances dan On-Demand Instances untuk memenuhi target kapasitas yang ada tentukan saat anda melakukan permintaan Spot Fleet. Permintaan (request) tersebut akan dipenuhi jika maksimum harga yang ada tetapkan masih dibawah dengan harga Spot dan kapasitasnya tersedia. Secara otomatis Spot Fleet juga akan selalu berusaha memenuhi kebutuhan kapasitas target yang anda tentukan ketika satu atau beberapa Spot instance yang sudah berjalan harus mengalami interupsi (mati tiba-tiba) karena perubahan harga atau ketersediaan kapasitas.

Dengan Spot Fleet, anda dapat menentukan target berupa jumlah instances, vCPUs, dan satuan-satuan spesifik yang terkait aplikasi (application-oriented units). Anda juga dapat menentukan strategi dalam alokasi pemenuhan Spot Fleet sehingga anda dapat menimbang antara efektifitas biaya dan kemungkinan seringnya interupsi. Bisa jadi anda lebih mementingkan biaya rendah tapi tidak masalah dengan interupsi yang sering terjadi atau sebaliknya anda mau Spot instances anda tidak sering terinterupsi walaupun biayanya bukan yang paling rendah yang mungkin bisa diberikan.

Berikut contoh screenshot saat anda membuat Spot Fleet dari AWS Management console. Anda bisa pilih jenis-jenis EC2 instances yang digunakan atau anda menggunakan yang direkomendasikan secara otomatis oleh AWS.

image

Praktek Menggunakan Spot Instances

Anda bisa mencoba materi workshop berikut untuk mulai mencoba Spot Instance:

Amazon EC2 Spot Instances Workshop Website

Referensi:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment