Ngawangun API Scalable on AWS Spot Instances

Halo sadayana! Nami abdi Kirill, abdi CTO di Adapty. Seuseueurna arsitéktur urang aya dina AWS, sareng dinten ayeuna kuring bakal nyarioskeun kumaha urang ngirangan biaya server ku 3 kali ku ngagunakeun instansi spot dina lingkungan produksi, kitu ogé kumaha carana nyetél skala otomatis na. Mimitina bakal aya tinjauan kumaha éta jalanna, teras petunjuk lengkep pikeun ngamimitian.

Naon Instansi Spot?

titik instansi mangrupakeun server pamaké AWS séjén anu ayeuna dianggurkeun, sarta aranjeunna ngajual eta kalawan diskon badag (Amazon nyerat nepi ka 90%, dina pangalaman urang ~ 3x, beda-beda gumantung kana wewengkon, AZ jeung tipe conto). Beda utama aranjeunna ti anu biasa nyaéta aranjeunna tiasa pareum iraha waé. Ku alatan éta, pikeun lila urang yakin yén éta normal ngagunakeun éta pikeun lingkungan parawan, atawa keur tugas ngitung hal, kalawan hasil panengah disimpen dina S3 atanapi dina database, tapi teu keur jualan. Aya solusi pihak katilu anu ngamungkinkeun anjeun ngagunakeun bintik-bintik dina produksi, tapi aya seueur crutches pikeun kasus kami, janten kami henteu nerapkeunana. Pendekatan anu dijelaskeun dina tulisan éta tiasa dianggo sadayana dina fungsionalitas AWS standar, tanpa naskah tambahan, makuta, jsb.

Di handap ieu aya sababaraha screenshot nu nembongkeun sajarah harga pikeun instansi spot.

m5.badag di wewengkon eu-kulon-1 (Irlandia). Hargana biasana stabil salami 3 bulan, ayeuna ngahémat 2.9x.

Ngawangun API Scalable on AWS Spot Instances

m5.badag di urang-wétan-1 wewengkon (N. Virginia). Hargana terus-terusan robih salami 3 bulan, ayeuna disimpen tina 2.3x ka 2.8x gumantung kana zona kasadiaan.

Ngawangun API Scalable on AWS Spot Instances

t3.leutik di wewengkon us-wétan-1 (N. Virginia). Harga geus stabil pikeun 3 bulan, ayeuna nyimpen 3.4x.

Ngawangun API Scalable on AWS Spot Instances

arsitéktur jasa

Arsitéktur dasar jasa anu bakal urang bahas dina tulisan ieu dipidangkeun dina diagram di handap ieu.

Ngawangun API Scalable on AWS Spot Instances

Aplikasi Beban Balancer → EC2 Target Grup → Elastis Wadahna Service

Aplikasi Beban Balancer (ALB) dipaké salaku balancer a, nu ngirim requests ka EC2 Target Grup (TG). TG tanggung jawab pikeun muka palabuhan on instansi pikeun ALBs sarta nyambungkeun ka palabuhan tina wadahna Elastis Wadahna Service (ECS). ECS mangrupikeun analog tina Kubernetes di AWS, anu ngatur wadah Docker.

Hiji conto tiasa gaduh sababaraha wadah anu ngajalankeun sareng palabuhan anu sami, janten kami henteu tiasa nyetélana. ECS ngabejaan TG yén éta téh launching tugas anyar (dina terminologi Kubernetes ieu disebut pod a), cek pikeun bebas palabuhan on conto jeung nangtukeun salah sahijina kana tugas dibuka. TG ogé rutin mariksa naha instance jeung API nu dipake dina eta ngagunakeun cek kaséhatan, sarta lamun eta nilik masalah naon, eta eureun ngirim requests dinya.

Grup Skala EC2 Otomatis + Panyadia Kamampuh ECS

Diagram di luhur henteu nunjukkeun jasa EC2 Auto Scaling Groups (ASG). Tina nami anjeun tiasa ngartos yén éta tanggung jawab pikeun skala instan. Nanging, dugi ka ayeuna, AWS henteu gaduh kamampuan anu diwangun pikeun ngatur jumlah mesin anu ngajalankeun ti ECS. ECS ngamungkinkeun pikeun skala jumlah tugas, contona, ku ngagunakeun CPU, RAM atawa jumlah requests. Tapi lamun tugas nempatan sagala instansi bébas, mesin anyar teu otomatis dijieun.

Ieu parantos robih sareng munculna ECS Capacity Providers (ECS CP). Ayeuna unggal jasa di ECS tiasa dikaitkeun sareng ASG, sareng upami tugasna henteu pas dina instansi anu ngajalankeun, maka anu énggal bakal diangkat (tapi dina wates ASG anu ditetepkeun). Ieu ogé jalan dina arah nu lalawanan, lamun ECS CP nilik instansi dianggurkeun tanpa tugas, mangka bakal masihan paréntah ASG pikeun Cicing aranjeunna handap. ECS CP mibanda kamampuhan pikeun nangtukeun perséntase targét tina beban instance, ku kituna sajumlah mesin salawasna bébas pikeun tugas skala gancang; Kuring gé ngobrol ngeunaan ieu saeutik engké.

EC2 peluncuran Citakan

Ladenan terakhir anu bakal kuring bahas sateuacan rinci ngeunaan nyiptakeun infrastruktur ieu nyaéta Témplat Peluncuran EC2. Eta ngidinan Anjeun pikeun nyieun template nurutkeun nu sagala mesin bakal ngamimitian, ku kituna teu ngulang ieu ti scratch unggal waktu. Di dieu anjeun tiasa milih jinis mesin pikeun ngamimitian, grup kaamanan, gambar disk sareng seueur parameter sanésna. Anjeun oge bisa nangtukeun data pamaké nu bakal diunggah ka sadaya instansi dibuka. Anjeun tiasa ngajalankeun skrip dina data pangguna, contona, anjeun tiasa ngédit eusi file Konfigurasi agén ECS.

Salah sahiji parameter konfigurasi anu paling penting pikeun tulisan ieu nyaéta ECS_ENABLE_SPOT_INSTANCE_DRAINING= leres. Upami parameter ieu diaktipkeun, teras saatos ECS nampi sinyal yén conto titik dicabut, éta mindahkeun sadaya pancén anu tiasa dianggo kana status Draining. Henteu aya tugas énggal anu bakal ditugaskeun ka conto ieu; upami aya tugas anu badé digulung ayeuna, éta bakal dibatalkeun. Requests ti balancer ogé eureun datang. Bewara ngeunaan penghapusan instan datang 2 menit sateuacan kajadian anu sabenerna. Janten, upami jasa anjeun henteu ngalaksanakeun tugas langkung ti 2 menit sareng henteu nyimpen nanaon kana disk, anjeun tiasa nganggo instansi spot tanpa kaleungitan data.

Ngeunaan disk - AWS nembe geuning Kasebut nyaéta dimungkinkeun pikeun ngagunakeun Elastic File System (EFS) babarengan jeung ECS; kalawan skéma ieu, sanajan disk teu jadi halangan, tapi urang teu coba ieu, saprak prinsipna mah urang teu butuh disk pikeun nyimpen kaayaan. Sacara standar, saatos nampi SIGINT (dikirim nalika tugas ditransfer ka status Draining), sadaya tugas anu ngajalankeun bakal dieureunkeun saatos 30 detik, sanaos henteu acan réngsé; anjeun tiasa ngarobih waktos ieu nganggo parameter. ECS_CONTAINER_STOP_TIMEOUT. Hal utama henteu nyetél éta langkung ti 2 menit pikeun mesin titik.

Nyiptakeun jasa

Hayu urang teraskeun kana nyiptakeun jasa anu dijelaskeun. Dina prosésna, kuring ogé bakal ngajelaskeun sababaraha poin anu mangpaat anu henteu disebatkeun di luhur. Sacara umum, ieu mangrupikeun instruksi léngkah-léngkah, tapi kuring moal nganggap sababaraha hal anu dasar pisan atanapi, sabalikna, kasus anu khusus pisan. Sadaya tindakan anu dilakukeun dina konsol visual AWS, tapi bisa dihasilkeun programmatically maké CloudFormation atanapi Terraform. Di Adapty kami nganggo Terraform.

Citakan peluncuran EC2

Ladenan ieu nyiptakeun konfigurasi mesin anu bakal dianggo. Témplat dikokolakeun dina EC2 -> Instances -> bagian peluncuran template.

Gambar mesin Amazon (AMI) — Sebutkeun gambar disk dimana sadaya instansi bakal diluncurkeun. Pikeun ECS, dina kalolobaan kasus sia ngagunakeun gambar dioptimalkeun ti Amazon. Ieu rutin diropéa sarta ngandung sagalana dipikabutuh pikeun ECS jalan. Pikeun manggihan ID gambar ayeuna, buka kaca Amazon ECS-dioptimalkeun AMIs, pilih daérah anu anjeun anggo sareng salin ID AMI pikeun éta. Contona, pikeun wewengkon us-wétan-1, ID ayeuna dina waktu nulis nyaéta ami-00c7c1cf5bdc913ed. ID ieu kedah diselapkeun kana item Sebutkeun nilai khusus.

Jenis conto - nunjukkeun jinis conto. Pilih hiji anu paling cocog sareng tugas anjeun.

Pasangan konci (login) — Sebutkeun sertipikat anu anjeun tiasa nyambungkeun kana conto liwat SSH, upami diperyogikeun.

Setélan jaringan - nangtukeun parameter jaringan. Platform jaringan dina kalolobaan kasus kedah aya Virtual Private Cloud (VPC). Grup kaamanan - grup kaamanan pikeun instansi Anjeun. Kusabab urang bakal ngagunakeun balancer di hareup instansi, Abdi nyarankeun nangtukeun grup dieu anu ngamungkinkeun sambungan asup ngan ti balancer nu. Hartina, anjeun bakal boga 2 grup kaamanan, hiji keur balancer, nu ngidinan sambungan inbound ti mana on palabuhan 80 (http) jeung 443 (HTTPS), sarta kadua pikeun mesin, nu ngidinan sambungan asup kana sagala palabuhan ti grup balancer. . Koneksi outbound dina duanana grup kudu dibuka ngagunakeun protokol TCP ka sadaya palabuhan ka sadaya alamat. Anjeun tiasa ngawates palabuhan sareng alamat pikeun sambungan kaluar, tapi anjeun kedah terus-terusan ngawas yén anjeun henteu nyobian ngaksés hiji hal dina palabuhan anu ditutup.

Panyimpenan (volume) - nangtukeun parameter disk pikeun mesin. Ukuran disk teu tiasa kirang ti anu dijelaskeun dina AMI; pikeun ECS Optimized éta 30 GiB.

rinci canggih - nangtukeun parameter tambahan.

Pilihan meuli - naha urang hoyong mésér instansi spot. Kami hoyong, tapi kami moal pariksa kotak ieu di dieu; kami bakal ngonpigurasikeunana dina Grup Skala Otomatis, aya seueur pilihan di dinya.

profil conto IAM - nunjukkeun peran dimana instansi bakal diluncurkeun. Supados instansi ngajalankeun di ECS, aranjeunna peryogi idin, nu biasana kapanggih dina peran ecsInstanceRole. Dina sababaraha kasus eta bisa dijieun, lamun henteu, teras di dieu parentah on kumaha ngalakukeun ieu. Saatos nyiptakeun, kami nunjukkeun éta dina citakan.
Salajengna aya seueur parameter, dasarna anjeun tiasa ngantunkeun nilai standar dimana-mana, tapi masing-masing gaduh katerangan anu jelas. Kuring salawasna ngaktipkeun conto EBS-dioptimalkeun sarta T2 / T3 pilihan Unlimited lamun dipaké burstable instansi.

data pamaké - nunjukkeun data pangguna. Urang bakal ngédit file /etc/ecs/ecs.config, nu ngandung konfigurasi agén ECS.
Hiji conto kumaha data pamaké bisa kasampak kawas:

#!/bin/bash
echo ECS_CLUSTER=DemoApiClusterProd >> /etc/ecs/ecs.config
echo ECS_ENABLE_SPOT_INSTANCE_DRAINING=true >> /etc/ecs/ecs.config
echo ECS_CONTAINER_STOP_TIMEOUT=1m >> /etc/ecs/ecs.config
echo ECS_ENGINE_AUTH_TYPE=docker >> /etc/ecs/ecs.config
echo "ECS_ENGINE_AUTH_DATA={"registry.gitlab.com":{"username":"username","password":"password"}}" >> /etc/ecs/ecs.config

ECS_CLUSTER=DemoApiClusterProd - parameter nunjukkeun yén conto milik klaster jeung ngaran dibikeun, nyaeta, klaster ieu bakal tiasa nempatkeun tugas na dina server ieu. Kami henteu acan nyiptakeun klaster, tapi kami bakal nganggo nami ieu nalika nyiptakeunana.

ECS_ENABLE_SPOT_INSTANCE_DRAINING=true - parameter nangtukeun yén nalika sinyal ditampi pikeun mareuman instansi titik, sadaya pancén dina éta kudu dibikeun ka status Draining.

ECS_CONTAINER_STOP_TIMEOUT=1m - parameter nangtukeun yén sanggeus narima sinyal SIGINT, sadaya tugas boga 1 menit saméméh ditelasan.

ECS_ENGINE_AUTH_TYPE=docker - parameter nunjukkeun yén skéma Docker dipaké salaku mékanisme otorisasina

ECS_ENGINE_AUTH_DATA=... - parameter sambungan kana pendaptaran wadahna swasta, dimana gambar Docker anjeun disimpen. Upami éta umum, maka anjeun henteu kedah netepkeun nanaon.

Pikeun kaperluan artikel ieu, kuring bakal ngagunakeun gambar umum ti Docker Hub, jadi tangtukeun parameter ECS_ENGINE_AUTH_TYPE и ECS_ENGINE_AUTH_DATA teu peryogi.

mangpaat uninga: Disarankeun pikeun ngapdet AMI rutin, sabab versi anyar ngamutahirkeun versi Docker, Linux, agén ECS, jsb Pikeun ulah poho ngeunaan ieu, anjeun tiasa. nyetél béwara ngeunaan sékrési versi anyar. Anjeun tiasa nampi béwara ku email sareng ngapdet sacara manual, atanapi anjeun tiasa nyerat fungsi Lambda anu otomatis bakal nyiptakeun versi anyar tina Citakan peluncuran sareng AMI anu diropéa.

EC2 Otomatis Skala Grup

Auto Scaling Group tanggung jawab pikeun peluncuran sareng skala instan. Grup diatur dina EC2 -> Skala Otomatis -> bagian Grup Skala Otomatis.

Citakan peluncuran - pilih témplat dijieun dina hambalan saméméhna. Urang ninggalkeun versi standar.

Pilihan beuli sareng jinis conto - nangtukeun jenis instansi pikeun klaster. Taat pikeun ngaluncurkeun témplat nganggo jinis conto tina Citakan Peluncuran. Ngagabungkeun pilihan pameseran sareng jinis instan ngamungkinkeun anjeun pikeun ngonpigurasikeun jinis instan sacara fleksibel. Urang bakal ngagunakeun éta.

Pilihan dumasar kana Paménta - Jumlah instansi non-spot biasa anu bakal salawasna jalan.

Persentase on-demand luhureun dasar - rasio persentase instansi reguler jeung titik, 50-50 bakal disebarkeun sarua, 20-80 pikeun tiap instansi reguler 4 titik bakal diangkat. Pikeun tujuan conto ieu, kuring bakal nunjukkeun 50-50, tapi dina kanyataanana urang paling sering ngalakukeun 20-80, dina sababaraha kasus 0-100.

Jenis conto - Di dieu anjeun tiasa netepkeun jinis instansi tambahan anu bakal dianggo dina kluster. Kami henteu kantos nganggo éta kusabab kuring henteu ngartos naon maksud caritana. Panginten ieu kusabab watesan dina jinis instansi khusus, tapi aranjeunna tiasa gampang ningkat ku dukungan. Upami anjeun terang aplikasina, kuring bakal resep maca dina koméntar)

Ngawangun API Scalable on AWS Spot Instances

Network - Setélan jaringan, pilih VPC sareng subnet pikeun mesin, dina kalolobaan kasus anjeun kedah milih sadaya subnet anu sayogi.

Beban balancing - setélan balancer, tapi urang bakal ngalakukeun ieu misah, urang moal noél nanaon di dieu. Cék kaséhatan ogé bakal ngonpigurasi engké.

Ukuran grup - urang nunjukkeun wates dina jumlah mesin dina klaster jeung jumlah dipikahoyong mesin di mimiti. Jumlah mesin dina klaster moal pernah jadi kirang ti minimum dieusian tur leuwih ti maksimum, sanajan skala kudu lumangsung nurutkeun metrics.

Kawijakan skala - parameter skala, tapi urang bakal skala dumasar kana ngajalankeun tugas ECS, jadi urang bakal ngonpigurasikeun skala nu engké.

Instance skala-di panyalindungan - panyalindungan instansi tina ngahapus nalika skala handap. Kami ngaktifkeunana supados ASG henteu ngahapus mesin anu ngagaduhan tugas. ECS Kapasitas Provider bakal nganonaktipkeun panyalindungan pikeun instansi nu teu boga tugas.

Tambihkeun tag - Anjeun tiasa nangtukeun tag pikeun instansi (kanggo ieu, kotak centang Tag instansi anyar kudu dipariksa). Abdi nyarankeun nangtukeun tag Ngaran, teras sadaya instansi anu diluncurkeun dina grup bakal gaduh nami anu sami, sareng éta gampang pikeun ningali éta dina konsol.

Ngawangun API Scalable on AWS Spot Instances

Saatos nyiptakeun grup, buka teras angkat ka bagian Konfigurasi Lanjut. Naha henteu sadayana pilihan katingali dina konsol dina tahap nyiptakeun.

kawijakan terminasi - aturan anu dipertimbangkeun nalika ngahapus instansi. Aranjeunna dilarapkeun dina urutan. Kami biasana nganggo anu aya dina gambar di handap ieu. Kahiji, instansi jeung Citakan peluncuran pangkolotna dihapus (contona, lamun urang diropéa AMI, urang dijieun versi anyar, tapi sakabeh instansi junun pindah ka dinya). Teras instansi anu pangdeukeutna ka jam tagihan salajengna dipilih. Teras anu pangkolotna dipilih dumasar kana tanggal peluncuran.

Ngawangun API Scalable on AWS Spot Instances

mangpaat uninga: pikeun ngapdet sadaya mesin dina klaster a, merenah ngagunakeun Instance Refresh. Upami anjeun ngagabungkeun ieu sareng fungsi Lambda tina léngkah anu saacanna, anjeun bakal ngagaduhan sistem pembaruan instan anu otomatis otomatis. Sateuacan ngapdet sadaya mesin, anjeun kedah nganonaktipkeun panyalindungan skala-instan pikeun sadaya instansi dina grup. Teu konfigurasi dina grup, tapi panyalindungan tina mesin sorangan, ieu dipigawé dina tab manajemén instansi.

Aplikasi Beban Balancer jeung EC2 Target Grup

Balancer dijieun dina bagian EC2 → Load Balancing → Load Balancers. Urang bakal ngagunakeun Aplikasi Beban Balancer; a ngabandingkeun tina tipena béda balancers bisa dibaca di kaca jasa.

Listeners - asup akal sangkan palabuhan 80 jeung 443 sarta alihan ti 80 ka 443 ngagunakeun aturan balancer engké.

Zona Kasadiaan — dina kalolobaan kasus, urang milih zona aksés pikeun sadayana.

Konpigurasikeun Setélan Kaamanan — sertipikat SSL pikeun balancer dituduhkeun di dieu, pilihan anu paling merenah nyaéta nyieun sertipikat dina ACM. Ngeunaan bédana Sarat jeung Kaayaan kaamanan bisa dibaca dina dokuméntasi, Anjeun bisa ninggalkeun eta dipilih sacara standar ELBSecurityPolicy-2016-08. Sanggeus nyieun balancer, anjeun bakal nempo eta Ngaran DNS, nu Anjeun kudu ngonpigurasikeun CNAME pikeun domain Anjeun. Salaku conto, ieu kumaha katingalina dina Cloudflare.

Ngawangun API Scalable on AWS Spot Instances

Grup Kaamanan - nyieun atawa milih grup kaamanan pikeun balancer nu, Kuring nulis langkung seueur ngeunaan ieu ngan di luhur dina EC2 peluncuran Citakan → Setélan jaringan bagian.

Udagan group - urang nyieun grup nu jawab requests routing ti balancer ka mesin jeung mariksa kasadiaan maranéhanana guna ngaganti eta bisi aya masalah. Jinis target kedah janten conto, Protocol и palabuhan wae, lamun make HTTPS pikeun komunikasi antara balancer jeung instansi, mangka anjeun kudu unggah sertipikat ka aranjeunna. Pikeun tujuan conto ieu, urang moal ngalakukeun ieu, urang ngan saukur ninggalkeun port 80.

Cék kaséhatan - parameter pikeun mariksa pungsionalitas jasa. Dina layanan nyata, ieu kedah janten pamundut misah nu implements bagian penting tina logika bisnis; keur kaperluan conto ieu, kuring bakal ninggalkeun setélan standar. Salajengna, anjeun tiasa milih interval pamundut, seep, Konci kasuksésan, jsb Dina conto urang, urang bakal nunjukkeun Konci Kasuksesan 200-399, sabab gambar Docker anu bakal dipaké mulih kode 304.

Ngawangun API Scalable on AWS Spot Instances

Ngadaptar Target - Di dieu mobil pikeun grup dipilih, tapi bisi urang ieu bakal dilakukeun ku ECS, jadi urang ngan skip hambalan ieu.

mangpaat uninga: dina tingkat balancer anjeun tiasa ngaktipkeun log anu bakal disimpen dina S3 dina tangtu formatna. Ti dinya aranjeunna tiasa diékspor ka jasa pihak katilu pikeun analitik, atanapi anjeun tiasa ngadamel pamundut SQL langsung kana data dina S3 nganggo ngagunakeun Athena. Éta merenah sareng tiasa dianggo tanpa kode tambahan. Kuring ogé nyarankeun nyetel panyabutan log ti ember S3 sanggeus periode waktu nu ditangtukeun.

ECS Tugas Harti

Dina léngkah-léngkah saacanna, kami nyiptakeun sadayana anu aya hubunganana sareng infrastruktur jasa; ayeuna urang teraskeun pikeun ngajelaskeun wadah anu bakal kami luncurkeun. Hal ieu dilakukeun dina bagian ECS → Tugas Definisi.

kasaluyuan tipe peluncuran - pilih EC2.

Palaksanaan tugas peran IAM - milih ecsTaskExecutionRole. Ngagunakeun eta, log ditulis, aksés ka variabel rusiah dibikeun, jsb.

Dina bagian Wadah Wadahna, klik Tambahkeun Wadahna.

gambaran - link kana gambar sareng kode proyék; pikeun conto ieu kuring bakal nganggo gambar umum tina Docker Hub bitnami / titik-conto: 0.0.1.

wates memori - wates memori pikeun wadahna. Wates teuas - wates teuas, lamun wadahna mana saluareun nilai dieusian, docker maéhan paréntah bakal dieksekusi, wadahna bakal maot geuwat. Wates lemes - wates lemes, wadahna bisa balik saluareun nilai dieusian, tapi parameter ieu bakal dibawa kana akun nalika nempatkeun tugas dina mesin. Contona, upami mesin boga 4 GiB RAM, sarta wates lemes wadahna 2048 MiB, mesin ieu bisa boga maksimum 2 ngajalankeun tugas kalawan wadahna ieu. Kanyataanna, 4 GiB RAM rada kirang ti 4096 MiB, ieu tiasa ditingali dina tab ECS Instans dina kluster. wates lemes teu bisa leuwih gede ti wates teuas. Penting pikeun ngarti yén upami aya sababaraha wadah dina hiji tugas, maka watesna dijumlahkeun.

Port mappings - at palabuhan host Urang nunjukkeun 0, ieu ngandung harti yén port bakal ditugaskeun dinamis sarta bakal diawaskeun ku Grup Target. Port wadahna - port dimana aplikasi anjeun dijalankeun sering dieusian dina paréntah palaksanaan, atanapi ditugaskeun dina kode aplikasi anjeun, Dockerfile, jsb. Pikeun conto urang urang bakal nganggo 3000 sabab didaptarkeun di dockerfile gambar nu dipaké.

Cék kaséhatan - parameter dipariksa kaséhatan wadahna, teu matak bingung jeung hiji ngonpigurasi dina Target Grup.

lingkungan - setélan lingkungan. Unit CPU - sarupa wates Mémori, ngan ngeunaan processor. Unggal inti processor nyaéta 1024 hijian, jadi lamun server ngabogaan processor dual-core na wadahna disetel ka 512, lajeng 4 tugas kalawan wadahna ieu bisa dibuka dina hiji server. Unit CPU salawasna pakait jeung jumlah cores; teu bisa jadi saeutik saeutik di antarana, sakumaha dina kasus memori.

parentah - paréntah pikeun ngamimitian jasa di jero wadah, sadaya parameter disaluyukeun dipisahkeun ku koma. Ieu tiasa gunicorn, npm, jsb. Upami teu dieusian, nilai diréktif CMD ti Dockerfile bakal dianggo. Urang nunjukkeun npm,start.

Variabel lingkungan - variabel lingkungan wadahna. Ieu tiasa boh data téks basajan atawa variabel rusiah tina Manajer Rahasia atawa Parameter Toko.

Panyimpenan sareng Logging - di dieu urang bakal nyetél log in CloudWatch Logs (layanan pikeun log ti AWS). Jang ngalampahkeun ieu, ngan aktipkeun kotak centang Auto-configure CloudWatch Logs. Sanggeus nyieun Tugas Definition, grup log bakal otomatis dijieun dina CloudWatch. Sacara standar, log disimpen di jerona salamina; Abdi nyarankeun ngarobih jaman Panyimpenan tina Never Expired ka periode anu diperyogikeun. Hal ieu dilakukeun dina grup CloudWatch Log, anjeun kedah klik dina jaman ayeuna sareng pilih anu énggal.

Ngawangun API Scalable on AWS Spot Instances

ECS Cluster jeung ECS ​​Kapasitas Provider

Buka bagian ECS → Kluster pikeun nyieun klaster. Kami milih EC2 Linux + Networking salaku citakan.

Ngaran klaster - pohara penting, urang nyieun dieu nami sarua sakumaha dieusian dina parameter peluncuran Citakan ECS_CLUSTER, dina kasus urang - DemoApiClusterProd. Pariksa kotak centang Jieun klaster kosong. Opsional, anjeun tiasa ngaktipkeun Wawasan Wadah pikeun ningali métrik pikeun jasa di CloudWatch. Upami anjeun ngalakukeun sadayana leres, maka dina bagian ECS Instances anjeun bakal ningali mesin anu didamel dina grup Skala Otomatis.

Ngawangun API Scalable on AWS Spot Instances

Pindah ka tab Kapasitas panyadia jeung nyieun nu anyar. Hayu atuh ngingetkeun yén éta diperlukeun pikeun ngadalikeun kreasi sarta shutdown mesin gumantung kana jumlah ngajalankeun tugas ECS. Kadé dicatet yén panyadia ngan bisa ditugaskeun ka hiji grup.

Grup Skala Otomatis - pilih grup nu dijieun saméméhna.

Diurus skala - Aktipkeun supados panyadia tiasa skala jasa.

Kapasitas target% - sabaraha perséntase mesin dieusian ku tugas urang kudu. Upami anjeun netepkeun 100%, maka sadaya mesin bakal sibuk sareng ngajalankeun tugas. Lamun nangtukeun 50%, satengah tina mobil bakal salawasna jadi gratis. Dina hal ieu, upami aya luncat seukeut dina beban, taksi anyar bakal langsung meunang mobil bébas, tanpa kudu ngadagoan instansi keur deployed.

panyalindungan terminasi junun — Aktipkeun, parameter ieu ngamungkinkeun panyadia pikeun ngaleungitkeun panyalindungan instansi tina ngahapus. Ieu lumangsung nalika euweuh tugas aktip dina mesin tur ngamungkinkeun kapasitas Target%.

ECS Service jeung setelan skala

Lengkah pamungkas :) Pikeun nyieun layanan, Anjeun kudu indit ka klaster dijieun saméméhna dina tab Layanan.

Jenis peluncuran — anjeun kedah klik Pindah ka strategi panyadia kapasitas sareng pilih panyadia anu tos didamel sateuacana.

Ngawangun API Scalable on AWS Spot Instances

Harti Tugas - pilih Tugas Definition saméméhna dijieun jeung révisi na.

Ngaran ladénan - pikeun ngahindarkeun kabingungan, urang sok nunjukkeun sami sareng Definisi Tugas.

Jinis jasa - salawasna Replica.

Jumlah tugas - jumlah nu dipikahoyong tina tugas aktip dina layanan. Parameter ieu dikawasa ku skala, tapi tetep kudu dieusian.

Persen séhat minimum и perséntase maksimum - nangtukeun paripolah tugas salila deployment. Nilai standar nyaéta 100 sareng 200, nunjukkeun yén dina waktos panyebaran jumlah tugas bakal ningkat sababaraha kali, teras uih deui ka nilai anu dipikahoyong. Upami Anjeun gaduh 1 tugas ngajalankeun, mnt = 0, sarta max = 100, lajeng salila deployment bakal tiwas, sarta sanggeus éta nu anyar bakal diangkat, nyaeta, bakal downtime. Lamun 1 tugas ngajalankeun, mnt = 50, max = 150, lajeng deployment moal lumangsung pisan, sabab 1 tugas teu bisa dibagi satengah atawa ngaronjat ku hiji satengah kali.

Jenis panyebaran - ninggalkeun update Rolling.

Témplat panempatan - aturan pikeun nempatkeun tugas dina mesin. Standarna nyaéta AZ Balanced Spread - ieu ngandung harti yén unggal tugas anyar bakal disimpen dina conto anyar dugi mesin di sadaya zona kasadiaan naék. Biasana urang ngalakukeun BinPack - CPU sareng Spread - AZ; kalayan kabijakan ieu, tugas-tugas ditempatkeun padet-gancang dina hiji mesin per CPU. Lamun perlu nyieun mesin anyar, eta dijieun dina zone kasadiaan anyar.

Ngawangun API Scalable on AWS Spot Instances

Jenis beban balancer — pilih Application Load Balancer.

Service peran IAM - milih ecsServiceRole.

Ngaran load balancer - pilih balancer nu geus dijieun saméméhna.

Mangsa tenggang cek kaséhatan - ngareureuhkeun sateuacan ngalakukeun pamariksaan kaséhatan saatos ngaluncurkeun tugas énggal, biasana urang nyetél ka 60 detik.

Wadah pikeun ngamuat kasaimbangan - dina item Ngaran grup Target, pilih grup saméméhna dijieun, jeung sagalana bakal dieusian otomatis.

Ngawangun API Scalable on AWS Spot Instances

Service Otomatis Skala - parameter skala jasa. Pilih Konpigurasikeun Skala Otomatis Layanan pikeun nyaluyukeun jumlah anu dipikahoyong tina jasa anjeun. Urang nyetel jumlah minimum jeung maksimum tugas nalika skala.

peran IAM pikeun Service Otomatis Skala - milih AWSServiceRoleForApplicationAutoScaling_ECSService.

Kawijakan skala tugas otomatis - aturan pikeun skala. Aya 2 jenis:

  1. Target nyukcruk - nyukcruk metrics target (CPU / RAM pamakéan atawa jumlah requests pikeun tiap tugas). Salaku conto, urang hoyong beban prosesor rata-rata janten 85%, nalika janten langkung luhur, tugas énggal bakal ditambah dugi ka ngahontal nilai target. Upami bebanna langkung handap, maka tugas-tugasna bakal dipupus, sabalikna, kecuali panyalindungan ngalawan skala handap diaktipkeun (Nonaktipkeun skala-in).
  2. Skala léngkah - réaksi ka acara sawenang. Di dieu anjeun tiasa ngonpigurasikeun réaksi kana acara naon waé (CloudWatch Alarm), nalika éta kajantenan, anjeun tiasa nambihan atanapi ngahapus jumlah tugas anu ditangtukeun, atanapi nangtukeun jumlah tugas anu pasti.

Hiji layanan mungkin gaduh sababaraha aturan skala, ieu tiasa mangpaat, hal utama nyaéta pikeun mastikeun yén maranéhna teu konflik saling.

kacindekan

Upami anjeun nuturkeun paréntah sareng nganggo gambar Docker anu sami, jasa anjeun kedah uih deui halaman sapertos kieu.

Ngawangun API Scalable on AWS Spot Instances

  1. Kami parantos nyiptakeun témplat anu mana sadaya mesin dina jasa diluncurkeun. Urang ogé diajar kumaha carana ngapdet mesin lamun template robah.
  2. Kami geus ngonpigurasi ngolah sinyal eureun instansi titik, jadi dina hiji menit sanggeus narima eta, sadaya pancén ngajalankeun dipiceun tina mesin, jadi euweuh leungit atawa interrupted.
  3. Urang ngangkat balancer pikeun ngadistribusikaeun beban merata sakuliah mesin.
  4. Kami parantos nyiptakeun jasa anu dijalankeun dina instansi tempat, anu ngirangan biaya mesin sakitar 3 kali.
  5. Kami parantos ngonpigurasikeun skala otomatis dina dua arah pikeun nanganan beban kerja anu ningkat tanpa ngahasilkeun biaya downtime.
  6. Kami nganggo Kapasitas Provider supados aplikasi ngatur infrastruktur (mesin) sareng henteu sabalikna.
  7. Kami hebat.

Upami anjeun gaduh beban anu tiasa diprediksi, contona anjeun pariwara dina kampanye email anu ageung, anjeun tiasa nyetél skala ku jadwal.

Anjeun ogé tiasa skala dumasar kana data tina sababaraha bagian sistem anjeun. Salaku conto, urang gaduh fungsionalitas ngirim kaluar nawaran promosi individu pamaké tina aplikasi mobile. Kadang kampanye dikirim ka 1M + jalma. Saatos distribusi sapertos kitu, aya paningkatan anu ageung dina paménta ka API, sabab seueur pangguna asup kana aplikasi dina waktos anu sami. Ku kituna lamun urang nempo yén aya nyata leuwih indikator baku dina antrian pikeun ngirim bewara push promosi, urang bisa langsung ngajalankeun sababaraha mesin tambahan sarta tugas jadi siap pikeun beban.

Kuring bakal bungah lamun ngabejaan ka kuring dina komentar kasus metot ngagunakeun instansi titik sarta ECS atawa hal ngeunaan skala.

Moal lami deui bakal aya artikel ngeunaan kumaha urang ngolah rébuan acara analitik per detik dina tumpukan utamana serverless (jeung duit) jeung kumaha deployment tina jasa jalan ngagunakeun GitLab CI jeung Terraform Cloud.

Ngalanggan kami, éta bakal metot!

Ngan pamaké nu kadaptar bisa ilubiung dina survey. Daptar, Punten.

Naha anjeun nganggo instansi spot dina produksi?

  • 22,2%Leres6

  • 66,7%No18

  • 11,1%Kuring diajar ngeunaan éta tina hiji artikel sareng rencanana ngagunakeunana3

27 pamaké milih. 5 pamaké abstained.

sumber: www.habr.com

Tambahkeun komentar