{"id":87393,"date":"2020-07-08T01:42:02","date_gmt":"2020-07-07T23:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws"},"modified":"2020-07-08T01:42:02","modified_gmt":"2020-07-07T23:42:02","slug":"sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","title":{"rendered":"Cre\u00ebren van een schaalbare API op spot-instance van AWS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo allemaal! Mijn naam is Kirill, ik ben CTO bij Adapty. Het grootste deel van onze architectuur draait op AWS, en vandaag zal ik uitleggen hoe we onze serverkosten met 3 keer hebben verminderd door gebruik te maken van spot instances in de productieomgeving. Eerst zal ik een overzicht geven van hoe dit werkt, en daarna volgt een gedetailleerde handleiding voor het opzetten ervan.<\/p>\n<p><\/p>\n<h2 id=\"chto-takoe-spotovye-instansy\">Wat zijn spot instances?<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/ec2\/spot\/\">Spot<\/a><\/noindex> instances zijn servers van andere AWS-gebruikers die momenteel niet in gebruik zijn, en ze worden met een hoge korting verkocht (Amazon zegt tot 90%, maar uit onze ervaring is het ongeveer 3x, dit varieert afhankelijk van de regio, AZ en het type instance). Het belangrijkste verschil met normale instances is dat ze op elk moment kunnen worden uitgeschakeld. Daarom hebben we lange tijd gedacht dat het normaal is om ze te gebruiken voor ontwikkelingsomgevingen of voor berekeningen met tussentijdse resultaten die op S3 of in een database worden opgeslagen, maar niet voor productie. Er zijn derden-oplossingen die het gebruik van spot instances in productie mogelijk maken, maar voor onze cases zijn er veel haken en ogen, dus hebben we ze niet ge\u00efmplementeerd. De methode die in dit artikel wordt beschreven, werkt volledig binnen de standaardfunctionaliteit van AWS, zonder extra scripts, cronjobs, enz.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Hieronder volgen een aantal screenshots die de prijsontwikkeling van spot instances tonen.<\/p>\n<p><\/p>\n<p>m5.large in de regio eu-west-1 (Ierland). De prijs is gedurende 3 maanden voornamelijk stabiel, momenteel is de besparing 2.9x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/901a259955c386493557280489f582fe.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>m5.large in de regio us-east-1 (N. Virginia). De prijs varieert voortdurend over een periode van 3 maanden, momenteel is de besparing tussen 2.3x en 2.8x afhankelijk van de beschikbaarheidszone.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/49c89430f03b2c7025355562d2873b6b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>t3.small in de regio us-east-1 (N. Virginia). De prijs is gedurende 3 maanden stabiel, momenteel is de besparing 3.4x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/2e139dcc6d44bd37caf9d75eb6ec4835.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"arhitektura-servisa\">Architectuur van de service<\/h2>\n<p><\/p>\n<p>De basisarchitectuur van de service waarover we in dit artikel zullen spreken, is weergegeven in de onderstaande diagram.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/d89bd595675400861360670adaacaf03.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"application-load-balancer--ec2-target-group--elastic-container-service\">Application Load Balancer \u2192 EC2 Target Group \u2192 Elastic Container Service<\/h3>\n<p><\/p>\n<p>Als load balancer wordt de Application Load Balancer (ALB) gebruikt, die aanvragen naar de EC2 Target Group (TG) stuurt. TG is verantwoordelijk voor het openen van poorten op de instances voor de ALB en het koppelen van deze aan de poorten van de Elastic Container Service (ECS) containers. ECS is de tegenhanger van Kubernetes in AWS, die verantwoordelijk is voor het beheren van Docker-containers.<\/p>\n<p><\/p>\n<p>Op \u00e9\u00e9n instantie kunnen meerdere werkende containers met dezelfde poorten draaien, dus we kunnen deze niet vast instellen. ECS meldt TG dat het een nieuwe taak start (in de terminologie van Kubernetes wordt dit een pod genoemd), deze controleert beschikbare poorten op de instantie en wijst er een toe voor de startende taak. TG controleert ook regelmatig of de instantie en de API daarop functioneren met behulp van een health check, en als het problemen waarneemt, stopt het met het doorsturen van verzoeken daarheen.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-groups--ecs-capacity-providers\">EC2 Auto Scaling Groups + ECS Capaciteitsproviders<\/h3>\n<p><\/p>\n<p>In het bovenstaande diagram is de EC2 Auto Scaling Groups (ASG) service niet weergegeven. Uit de naam blijkt dat deze verantwoordelijk is voor het schalen van instanties. Tot voor kort had AWS geen ingebouwde mogelijkheid om het aantal actieve machines vanuit ECS te beheren. ECS stelde in staat om het aantal taken te schalen, bijvoorbeeld op basis van CPU-, RAM-gebruik of het aantal verzoeken. Maar als taken alle beschikbare instanties gebruikten, werden er geen nieuwe machines automatisch opgestart.<\/p>\n<p><\/p>\n<p>Dit veranderde met de komst van ECS Capaciteitsproviders (ECS CP). Nu kan elke service in ECS worden gekoppeld aan een ASG, en als taken niet meer passen op de actieve instanties, zullen er nieuwe worden opgestart (maar binnen de vastgestelde limieten van de ASG). Dit werkt ook in omgekeerde richting; als ECS CP inactieve instanties zonder taken ziet, geeft het ASG de opdracht om deze uit te schakelen. ECS CP heeft de mogelijkheid om een doelpercentage van de belasting van instanties op te geven, zodat een aantal machines altijd vrij is voor snelle schaalvergroting van taken; daarover later meer.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-templates\">EC2 Launch Templates<\/h3>\n<p><\/p>\n<p>De laatste service waarover ik zal vertellen voordat ik verder ga met een gedetailleerde beschrijving van het opzetten van deze infrastructuur, zijn de EC2 Launch Templates. Hiermee kunt u een sjabloon maken dat gebruikt zal worden voor het opstarten van alle machines, zodat u dit niet telkens opnieuw hoeft te doen. Hier kunt u het type machine selecteren, de beveiligingsgroep, de schijfimage en veel andere parameters. Ook kunt u gebruikersgegevens opgeven die op alle opgestarte instanties worden geladen. In de gebruikersgegevens kunnen scripts worden uitgevoerd, bijvoorbeeld om de inhoud van een bestand te bewerken. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">configuratie van de ECS-agent<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Een van de meest belangrijke parameters van configuratie in dit artikel is <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/container-instance-spot.html\">ECS_ENABLE_SPOT_INSTANCE_DRAINING<\/a><\/noindex>=true. Als deze parameter is ingeschakeld, zal ECS zodra het een signaal ontvangt dat de spotinstantie wordt be\u00ebindigd, alle taken die erop draaien in de status Draining zetten. Er kunnen geen nieuwe taken aan deze instantie worden toegewezen; als er taken zijn die willen worden uitgevoerd, worden ze geannuleerd. Verzoeken van de load balancer worden ook gestopt. Een melding van de verwijdering van de instantie komt 2 minuten voor het feitelijke evenement. Als uw service geen taken langer dan 2 minuten uitvoert en niets op de schijf opslaat, kunt u spotinstellingen gebruiken zonder dataverlies.<\/p>\n<p><\/p>\n<p>Wat betreft de schijf \u2014 AWS heeft onlangs <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/about-aws\/whats-new\/2020\/04\/amazon-ecs-aws-fargate-support-amazon-efs-filesystems-generally-available\/#:~:text=To%20use%20EFS%20with%20ECS,or%20TLS%20encryption%20in%20transit.\">mogelijk gemaakt<\/a><\/noindex> om Elastic File System (EFS) samen met ECS te gebruiken; met dit schema vormt de schijf zelfs geen belemmering, maar we hebben dit niet getest, omdat we in principe geen schijf nodig hebben voor statusopslag. Standaard zullen bij ontvangst van SIGINT (verzonden op het moment dat de taak in de status Draining gaat) alle actieve taken binnen 30 seconden worden gestopt, zelfs als ze niet zijn afgerond. Deze tijd kan worden gewijzigd met de parameter <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">ECS_CONTAINER_STOP_TIMEOUT<\/a><\/noindex>. Het is belangrijk om deze niet op meer dan 2 minuten in te stellen voor spotmachines.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-servisa\">Een service maken<\/h2>\n<p><\/p>\n<p>Laten we direct overgaan op het maken van de beschreven service. Onderweg zal ik nog een aantal nuttige punten beschrijven die eerder niet zijn genoemd. In wezen is dit een stapsgewijze handleiding, maar enkele heel basis of zeer specifieke gevallen zal ik niet behandelen. Alle acties worden uitgevoerd in de visuele AWS-console, maar ze kunnen ook programmatisch worden gereproduceerd met CloudFormation of Terraform. Bij Adapty gebruiken we Terraform.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-template\"><strong>EC2 Launch Template<\/strong><\/h3>\n<p><\/p>\n<p>In deze service wordt een configuratie van de machines gemaakt die zullen worden gebruikt. Het beheer van sjablonen vindt plaats in de sectie EC2 -&gt; Instances -&gt; Launch templates.<\/p>\n<p><\/p>\n<p><strong>Amazon machine image (AMI)<\/strong> \u2014 we geven de schijfafbeelding op waarmee alle instanties worden gestart. Voor ECS moet in de meeste gevallen het geoptimaliseerde beeld van Amazon worden gebruikt. Dit wordt regelmatig bijgewerkt en bevat alles wat nodig is voor de werking van ECS. Om de actuele AMI-ID te achterhalen, gaan we naar de pagina <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-optimized_AMI.html\">Amazon ECS-optimized AMIs<\/a><\/noindex>, kiezen de gebruikte regio en kopi\u00ebren de AMI-ID voor die regio. Bijvoorbeeld, voor de regio us-east-1 is de actuele ID op het moment van schrijven <em>ami-00c7c1cf5bdc913ed<\/em>. Deze ID moet in het veld Specify a custom value worden ingevoerd.<\/p>\n<p><\/p>\n<p><strong>Instance type<\/strong> \u2014 geef het type instantie op. Kies degene die het beste past bij uw taak.<\/p>\n<p><\/p>\n<p><strong>Sleutelpair (inloggen)<\/strong> \u2014 geef het certificaat op waarmee verbinding kan worden gemaakt met de instantie via SSH, indien nodig.<\/p>\n<p><\/p>\n<p><strong>Netwerkinstellingen<\/strong> \u2014 geef de netwerkparameters op. <strong>Netwerkplatform<\/strong> in de meeste gevallen moet dit Virtual Private Cloud (VPC) zijn. <strong>Beveiligingsgroepen<\/strong> \u2014 beveiligingsgroepen voor uw instanties. Aangezien we een load balancer voor de instanties gaan gebruiken, raad ik aan hier een groep op te geven die alleen inkomende verbindingen vanaf de load balancer toestaat. Dat wil zeggen, u heeft 2 beveiligingsgroepen: een voor de load balancer die inkomende (inbound) verbindingen vanaf overal op poorten 80 (http) en 443 (https) toestaat, en een tweede voor machines die inkomende verbindingen op willekeurige poorten van de load balancer-groep toestaat. Uitgaande (outbound) verbindingen in beide groepen moeten op het TCP-protocol voor alle poorten naar alle adressen worden geopend. U kunt poorten en adressen voor uitgaande verbindingen beperken, maar dan moet u constant controleren dat u niet probeert verbinding te maken via een gesloten poort.<\/p>\n<p><\/p>\n<p><strong>Opslag (volumes)<\/strong> \u2014 geef de schijfparameters voor de machines op. De schijfgrootte mag niet kleiner zijn dan wat er in de AMI is opgegeven, voor ECS Geoptimaliseerd \u2014 30 GiB.<\/p>\n<p><\/p>\n<p><strong>Geavanceerde details<\/strong> \u2014 geef aanvullende parameters op.<\/p>\n<p><\/p>\n<p><strong>Aankoopoptie<\/strong> \u2014 willen we spottestinstanties kopen. We willen dat, maar hier zullen we dit vinkje niet zetten, we configureren dit in de Auto Scaling Group, daar zijn meer opties.<\/p>\n<p><\/p>\n<p><strong>IAM instantieprofiel<\/strong> \u2014 geef de rol op waarmee de instanties worden gestart. Om ervoor te zorgen dat de instanties in ECS werken, hebben ze rechten nodig, die meestal in de rol zitten <em>ecsInstanceRole<\/em>. In sommige gevallen kan deze worden aangemaakt, als dat niet het geval is, dan is hier <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/instance_IAM_role.html\">handleiding<\/a><\/noindex> hoe dit te doen. Na het aanmaken geven we deze op in de sjabloon.<br \/>\nDaarna volgen er veel parameters, meestal kunnen de standaardwaarden worden behouden, maar elk van hen heeft een duidelijke beschrijving. Ik geef altijd de parameters EBS-geoptimaliseerde instantie en T2\/T3 Unlimited op, als ze worden gebruikt <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSEC2\/latest\/UserGuide\/burstable-performance-instances.html\">burstable<\/a><\/noindex> instanties.<\/p>\n<p><\/p>\n<p><strong>Gebruikersgegevens<\/strong> \u2014 geef gebruikersgegevens op. We gaan het bestand bewerken <code>\/etc\/ecs\/ecs.config<\/code>, waarin de configuratie van de ECS-agent is opgenomen.<br \/>\nEen voorbeeld van hoe de gebruikersgegevens eruit kunnen zien:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">#!\/bin\/bash\necho ECS_CLUSTER=DemoApiClusterProd &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_ENABLE_SPOT_INSTANCE_DRAINING=true &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_CONTAINER_STOP_TIMEOUT=1m &gt;&gt; \/etc\/ecs\/ecs.config\necho ECS_ENGINE_AUTH_TYPE=docker &gt;&gt; \/etc\/ecs\/ecs.config\necho &quot;ECS_ENGINE_AUTH_DATA={&quot;registry.gitlab.com&quot;:{&quot;username&quot;:&quot;username&quot;,&quot;password&quot;:&quot;password&quot;}}&quot; &gt;&gt; \/etc\/ecs\/ecs.config<\/code><\/pre>\n<p><\/p>\n<p><code>ECS_CLUSTER=DemoApiClusterProd<\/code> \u2014 de parameter geeft aan dat de instantie behoort tot een cluster met de opgegeven naam, wat betekent dat dit cluster zijn taken op deze server kan plaatsen. We hebben momenteel geen cluster aangemaakt, maar we zullen deze naam gebruiken bij het cre\u00ebren.<\/p>\n<p><\/p>\n<p><code>ECS_ENABLE_SPOT_INSTANCE_DRAINING=true<\/code> \u2014 de parameter geeft aan dat bij het ontvangen van een signaal om de spot-instantie uit te schakelen, alle taken op die instantie moeten worden overgezet naar de status Draining.<\/p>\n<p><\/p>\n<p><code>ECS_CONTAINER_STOP_TIMEOUT=1m<\/code> \u2014 de parameter geeft aan dat na het ontvangen van het SIGINT-signaal, alle taken 1 minuut de tijd hebben voordat ze worden be\u00ebindigd.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_TYPE=docker<\/code> \u2014 de parameter geeft aan dat de docker-schema als authenticatiemechanisme wordt gebruikt.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_DATA=...<\/code> \u2014 verbindingsparameters voor de priv\u00e9 container registry, waar uw Docker-images worden opgeslagen. Als het openbaar is, hoeft u niets op te geven.<\/p>\n<p><\/p>\n<p>In dit artikel zal ik een openbaar image uit Docker Hub gebruiken, dus ik hoef geen parameters op te geven. <code>ECS_ENGINE_AUTH_TYPE<\/code> en <code>ECS_ENGINE_AUTH_DATA<\/code> dat is niet nodig.<\/p>\n<p><\/p>\n<p><strong>Goed om te weten<\/strong>: het wordt aanbevolen om AMI regelmatig bij te werken, omdat in nieuwe versies de versies van Docker, Linux, ECS-agent en meer worden bijgewerkt. Om dit niet te vergeten, kunt u <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ECS-AMI-SubscribeTopic.html\">meldingen instellen<\/a><\/noindex> over nieuwe versies. U kunt e-mailmeldingen ontvangen en handmatig bijwerken, of u kunt een Lambda-functie schrijven die automatisch een nieuwe versie van de Launch Template met het bijgewerkte AMI aanmaakt.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-group\"><strong>EC2 Auto Scaling Group<\/strong><\/h3>\n<p><\/p>\n<p>De Auto Scaling Group is verantwoordelijk voor het starten en schalen van instanties. Het beheer van de groepen vindt plaats in de sectie EC2 -&gt; Auto Scaling -&gt; Auto Scaling Groups.<\/p>\n<p><\/p>\n<p><strong>Launch template<\/strong> \u2014 we kiezen de sjabloon die in de vorige stap is aangemaakt. Laat de versie standaard.<\/p>\n<p><\/p>\n<p><strong>Purchase options and instance types<\/strong> \u2014 we geven de typen instanties voor het cluster op. Adhere to launch template gebruikt het type instantie uit de Launch Template. Combine purchase options and instance types maakt flexibele configuratie van de typen instanties mogelijk. We zullen deze gebruiken.<\/p>\n<p><\/p>\n<p><strong>Optional On-Demand base<\/strong> \u2014 het aantal standaard, niet-spot instanties die altijd zullen draaien.<\/p>\n<p><\/p>\n<p><strong>On-Demand percentage above base<\/strong> \u2014 de procentuele verhouding van standaard en spot-instanties; 50-50 verdeelt gelijkmatig, 20-80 betekent dat er 4 spot-instanties worden gestart voor elke standaard instantie. In dit voorbeeld geef ik 50-50 op, maar in de praktijk doen we vaker 20-80, en in sommige gevallen 0-100.<\/p>\n<p><\/p>\n<p><strong>Instance types<\/strong> \u2014 hier kunnen extra types instanties worden opgegeven die in het cluster zullen worden gebruikt. We hebben dit nooit gebruikt, omdat ik de betekenis van dit verhaal niet echt begrijp. Misschien heeft het te maken met de limieten voor specifieke soorten instanties, maar die kunnen eenvoudig worden verhoogd via ondersteuning. Als je een toepassing kent, lees ik het graag in de reacties)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c1ee742d2059674f39a53cac6b9f2347.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Netwerk\nglobal\n   log \/dev\/log local0\n   log \/dev\/log local1 notice\n   chroot \/var\/lib\/haproxy\n   stats timeout 30s\n   user haproxy\n   group haproxy\n   daemon\n\ndefaults\n   log global\n   mode http\n   option httplog\n   option dontlognull\n   timeout connect 5000\n   timeout client 50000\n   timeout server 50000\n\nfrontend http_front\n   bind *:80\n   stats uri \/haproxy?stats\n   default_backend http_back\n\nbackend http_back\n   balance roundrobin\n   server server_name1 private_ip1:80 check\n   server server_name2 private_ip2:80 check<\/strong> \u2014 netwerkinstellingen, kies VPC en subnetten voor de machines, in de meeste gevallen is het het beste om alle beschikbare subnetten te selecteren.<\/p>\n<p><\/p>\n<p><strong>Load balancing<\/strong> \u2014 instellingen voor de load balancer, maar we zullen dit apart doen, hier raken we niets aan. <strong>Health checks<\/strong> zullen ook later worden ingesteld.<\/p>\n<p><\/p>\n<p><strong>Groepsgrootte<\/strong> \u2014 we geven limieten op voor het aantal machines in het cluster en het gewenste aantal machines bij de start. Het aantal machines in het cluster zal nooit minder worden dan het minimaal opgegeven aantal en meer dan het maximaal opgegeven aantal, zelfs als het volgens de statistieken nodig is om te schalen.<\/p>\n<p><\/p>\n<p><strong>Schaalbeleid<\/strong> \u2014 schalingparameters, maar we zullen schalen op basis van de draaiende ECS-taken, dus we zullen de schaling later instellen.<\/p>\n<p><\/p>\n<p><strong>Instance scale-in bescherming<\/strong> \u2014 bescherming van instanties tegen verwijdering bij het naar beneden schalen. We schakelen dit in zodat de ASG de machine waarop actieve taken draaien niet verwijdert. De bescherming uitschakelen voor instanties zonder taken wordt gedaan door de ECS Capacity Provider.<\/p>\n<p><\/p>\n<p><strong>Tags toevoegen<\/strong> \u2014 je kunt tags voor instanties opgeven (hiervoor moet het vakje 'Tag new instances' aangekruist zijn). Ik raad aan om de tag 'Name' op te geven, zodat alle instanties die binnen de groep worden gestart dezelfde naam hebben, wat het handig maakt om ze in de console te bekijken.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/61fa0ccb38c11f61431db0938140efb7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na het aanmaken van de groep, open deze en ga naar het gedeelte Geavanceerde configuraties, waarom niet alle opties zichtbaar zijn tijdens de creatiefase in de console.<\/p>\n<p><\/p>\n<p><strong>Beleid voor be\u00ebindiging<\/strong> \u2014 regels die in overweging worden genomen bij het verwijderen van instanties. Ze worden op volgorde toegepast. We gebruiken meestal de regels zoals op de afbeelding hieronder. Eerst worden de instanties met de oudste Launch Template verwijderd (bijvoorbeeld, als we de AMI hebben ge\u00fcpdatet, hebben we een nieuwe versie gemaakt, maar alle instanties hebben het al overgenomen). Daarna worden de instanties gekozen die het dichtst bij de volgende berekeningsuur voor de facturering liggen. En vervolgens worden de oudste opstartdatum gekozen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/8236624fe08a03f36aedc7665e18b060.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Goed om te weten<\/strong>: voor het bijwerken van alle machines in het cluster, is het handig om gebruik te maken van <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/ec2\/userguide\/asg-instance-refresh.html\">Instance Refresh<\/a><\/noindex>. Door dit te combineren met de Lambda-functie uit de vorige stap, heeft u een volledig geautomatiseerd systeem voor het bijwerken van instanties. Voordat u alle machines bijwerkt, moet u de instance scale-in bescherming voor alle instanties in de groep uitschakelen. Dit gaat niet om de instellingen in de groep, maar specifiek om de bescherming op de machines zelf, wat gedaan kan worden op het tabblad Instance management.<\/p>\n<p><\/p>\n<h3 id=\"application-load-balancer-i-ec2-target-group\">Application Load Balancer en EC2 Target Group<\/h3>\n<p><\/p>\n<p>De load balancer wordt aangemaakt in het gedeelte EC2 \u2192 Load Balancing \u2192 Load Balancers. We zullen de Application Load Balancer gebruiken, het vergelijken van verschillende soorten load balancers kan worden gelezen op <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/elasticloadbalancing\/features\/#compare\">de service pagina<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Listeners<\/strong> \u2014 het is logisch om poorten 80 en 443 te maken en een omleiding van 80 naar 443 te maken met behulp van regels van de load balancer.<\/p>\n<p><\/p>\n<p><strong>Beschikbaarheidszones<\/strong> \u2014 in de meeste gevallen kiezen we voor alle beschikbaarheidszones.<\/p>\n<p><\/p>\n<p><strong>Configureer beveiligingsinstellingen<\/strong> \u2014 hier wordt het SSL-certificaat voor de load balancer opgegeven, de meest handige optie is om <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/acm\/latest\/userguide\/gs-acm-request-public.html\">het certificaat<\/a><\/noindex> in ACM te maken. Voor meer informatie over de verschillen <strong>beveiligingsbeleid<\/strong> kan worden gelezen op <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/classic\/elb-security-policy-table.html\">de documentatie<\/a><\/noindex>, u kunt de standaardkeuze <code>ELBSecurityPolicy-2016-08<\/code>aanhouden. Na het aanmaken van de load balancer, ziet u de <strong>DNS-naam<\/strong>, waarvoor u een CNAME moet instellen voor uw domein. Dit is hoe het eruitziet in Cloudflare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/899ff0f30df4117fc0ccd91af135def3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Security Group<\/strong> \u2014 we maken of kiezen een beveiligingsgroep voor de load balancer, meer hierover is hierboven besproken in het gedeelte EC2 Launch Template \u2192 Netwerkinstellingen.<\/p>\n<p><\/p>\n<p><strong>Target group<\/strong> \u2014 we maken een groep die verantwoordelijk is voor het routeren van verzoeken van de load balancer naar de machines en hun beschikbaarheid controleert, zodat ze in geval van problemen kunnen worden vervangen. <strong>Targettype<\/strong> moet Instance zijn, <strong>Protocol<\/strong> en <strong>Poort<\/strong> en alles, als u HTTPS gebruikt voor communicatie tussen de load balancer en de instanties, moet u het certificaat op hen uploaden. In dit voorbeeld zullen we dit niet doen, we laten gewoon poort 80.<\/p>\n<p><\/p>\n<p><strong>Health checks<\/strong> \u2014 parameters voor de controle op de beschikbaarheid van de service. In de echte service moet dit een afzonderlijk verzoek zijn dat belangrijke delen van de bedrijfslogica implementeert, in dit voorbeeld laat ik de standaardinstellingen staan. Verder kunt u het verzoekinterval, time-out, codes voor succesvolle antwoorden, enz. kiezen. In ons voorbeeld geven we Success codes 200-399 op, omdat de Docker-image die wordt gebruikt, de code 304 retourneert.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/e295ab1c3bf1dfe13c76b4942a31c7ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Registreer doelen<\/strong> \u2014 hier worden de machines voor de groep geselecteerd, maar in ons geval zal ECS dit doen, dus we slaan deze stap gewoon over.<\/p>\n<p><\/p>\n<p><strong>Goed om te weten<\/strong>: op het niveau van de load balancer kunt u logboeken inschakelen die worden opgeslagen in S3 op een bepaald <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/application\/load-balancer-access-logs.html\">in het formaat<\/a><\/noindex>. Van daaruit kunnen ze worden ge\u00ebxporteerd naar externe services voor analyse, of SQL-query's kunnen direct op de gegevens in S3 worden uitgevoerd met <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/athena\/latest\/ug\/application-load-balancer-logs.html\">help van Athena<\/a><\/noindex>. Dit is handig en werkt zonder extra code. Ook raad ik aan om het verwijderen van logs uit de S3-bucket in te stellen na een bepaalde periode.<\/p>\n<p><\/p>\n<h3 id=\"ecs-task-definition\">ECS Taakdefinitie<\/h3>\n<p><\/p>\n<p>In de vorige stappen hebben we alles gecre\u00eberd dat met de infrastructuur van de service te maken heeft, nu gaan we over naar de beschrijving van de containers die we zullen starten. Dit wordt gedaan in de sectie ECS \u2192 Taakdefinities.<\/p>\n<p><\/p>\n<p><strong>Compatibiliteit van het type lancering<\/strong> \u2014 kies EC2.<\/p>\n<p><\/p>\n<p><strong>IAM-rol voor taakuitvoering<\/strong> \u2014 kiezen <code>ecsTaskExecutionRole<\/code>. Hiermee worden logs geschreven, toegang verleend tot geheime variabelen, enz.<\/p>\n<p><\/p>\n<p>In de sectie Containerdefinities klikken we op Container toevoegen.<\/p>\n<p><\/p>\n<p><strong>Afbeelding<\/strong> \u2014 link naar het beeld met de projectcode, in dit voorbeeld gebruik ik een openbaar beeld van Docker Hub <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/bitnami\/node-example\">bitnami\/node-example:0.0.1<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Geheugenlimieten<\/strong> \u2014 geheugenlimieten voor de container. <strong>Harde limiet<\/strong> \u2014 harde limiet, als de container de opgegeven waarde overschrijdt, wordt het commando docker kill uitgevoerd en de container wordt onmiddellijk be\u00ebindigd. <strong>Zachte limiet<\/strong> \u2014 zachte limiet, de container kan de opgegeven waarde overschrijden, maar tijdens het plaatsen van taken op machines wordt rekening gehouden met deze parameter. Bijvoorbeeld, als de machine 4 GiB RAM heeft en de zachte limiet van de container 2048 MiB is, kunnen er maximaal 2 taken met deze container op deze machine worden uitgevoerd. In werkelijkheid is 4 GiB RAM iets minder dan 4096 MiB, dit kan worden bekeken op het tabblad ECS-instanties in de cluster. De zachte limiet mag niet groter zijn dan de harde limiet. Het is belangrijk te begrijpen dat als er meerdere containers in \u00e9\u00e9n taak zijn, hun limieten worden opgeteld.<\/p>\n<p><\/p>\n<p><strong>Poortkoppelingen<\/strong> \u2014 tot <strong>Hostpoort<\/strong> we geven 0 op, dit betekent dat de poort dynamisch zal worden toegewezen, deze wordt gevolgd door de Target Group. <strong>Containerpoort<\/strong> \u2014 de poort waarop uw applicatie draait, vaak ingesteld in de uitvoeringsopdracht of toegewezen in de code van uw applicatie, Dockerfile, enz. Voor ons voorbeeld gebruiken we 3000, omdat dit is aangegeven in <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bitnami\/bitnami-docker-node\/blob\/master\/example\/Dockerfile\">Dockerfile<\/a><\/noindex> het gebruikte beeld.<\/p>\n<p><\/p>\n<p><strong>Health check<\/strong> \u2014 parameters voor het controleren van de werking van de container, niet te verwarren met degene die is ingesteld in de Target Group.<\/p>\n<p><\/p>\n<p><strong>Omgeving<\/strong> \u2014 omgevingsinstellingen. <strong>CPU-eenheden<\/strong> \u2014 lijkt op geheugentesten, maar dan voor de processor. Elke processor-core vertegenwoordigt 1024 eenheden, dus als de server een dual-core processor heeft en de containerwaarde is ingesteld op 512, dan kunnen er op \u00e9\u00e9n server 4 taken met deze container worden uitgevoerd. CPU-eenheden komen altijd overeen met het aantal cores; ze kunnen niet iets minder zijn zoals bij geheugen.<\/p>\n<p><\/p>\n<p><strong>Commando<\/strong> \u2014 commando om een service binnen de container te starten, alle parameters worden door komma's gescheiden. Dit kan gunicorn, npm, etc. zijn. Als dit niet is opgegeven, wordt de waarde van de CMD-directive in het Dockerfile gebruikt. We geven aan <code>npm,start<\/code>.<\/p>\n<p><\/p>\n<p><strong>Omgevingsvariabelen<\/strong> \u2014 omgevingsvariabelen van de container. Dit kunnen zowel gewone tekstgegevens zijn als geheime variabelen uit <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/specifying-sensitive-data-secrets.html\">Secrets Manager<\/a><\/noindex> of <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/specifying-sensitive-data-parameters.html\">Parameter Store<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Opslag en Logging<\/strong> \u2014 hier configureren we het loggen naar CloudWatch Logs (dienst voor logs van AWS). Het is voldoende om het vakje Auto-configure CloudWatch Logs in te schakelen. Na het maken van de Task Definition wordt er automatisch een loggroep in CloudWatch aangemaakt. Standaard worden logs hierin eeuwig bewaard; ik raad aan de Retentieperiode van Never Expire op te wijzigen naar de vereiste termijn. Dit doe je in CloudWatch Log groups, klik op de huidige periode en kies een nieuwe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c9ad7ca39dfde9343be89eb9ab1aef10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"ecs-cluster-i-ecs-capacity-provider\">ECS Cluster en ECS Capacity Provider<\/h3>\n<p><\/p>\n<p>Ga naar het gedeelte ECS \u2192 Clusters om een cluster te maken. Kies als sjabloon EC2 Linux + Networking.<\/p>\n<p><\/p>\n<p><strong>Clusternaam<\/strong> \u2014 erg belangrijk, gebruik hier dezelfde naam als opgegeven in de Launch Template onder de parameter <code>ECS_CLUSTER<\/code>, in ons geval \u2014 <code>DemoApiClusterProd<\/code>. Vink het vakje Create an empty cluster aan. Optioneel kun je Container Insights inschakelen om metrics over de services in CloudWatch te bekijken. Als je alles goed hebt gedaan, zie je in het gedeelte ECS Instances de machines die zijn aangemaakt in de Auto Scaling group.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/cd70062c9783ae359a2b27cbfc66cbe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ga naar het tabblad <strong>Capacity Providers<\/strong> en we cre\u00ebren een nieuwe. Ik herinner eraan dat deze nodig is om de creatie en het uitschakelen van machines te beheren, afhankelijk van het aantal actieve ECS-taken. Het is belangrijk op te merken dat de provider slechts aan \u00e9\u00e9n groep kan worden gekoppeld.<\/p>\n<p><\/p>\n<p><strong>Auto Scaling group<\/strong> \u2014 kies de groep die eerder is gemaakt.<\/p>\n<p><\/p>\n<p><strong>Beheerd schalen<\/strong> \u2014 schakelen we in, zodat de provider de service kan schalen.<\/p>\n<p><\/p>\n<p><strong>Doelcapaciteit %<\/strong> \u2014 welk percentage van de belasting van de machines met taken hebben we nodig. Als je 100% opgeeft, zijn alle machines altijd bezet met actieve taken. Als je 50% opgeeft, zijn de helft van de machines altijd vrij. In dat geval, als er een plotselinge piek in de belasting is, zullen nieuwe taken onmiddellijk op de beschikbare machines worden geplaatst zonder te hoeven wachten op het uitrollen van instanties.<\/p>\n<p><\/p>\n<p><strong>Beheerde be\u00ebindigingsbescherming<\/strong> \u2014 hierbij schakelen we deze parameter in, waardoor de provider de bescherming van instanties kan verwijderen. Dit gebeurt wanneer er geen actieve taken op de machine zijn en stelt het Target capacity % mogelijk.<\/p>\n<p><\/p>\n<h3 id=\"ecs-service-i-nastroyka-masshtabirovaniya\">ECS Service en schalingconfiguratie<\/h3>\n<p><\/p>\n<p>Laatste stap :) Om een service te cre\u00ebren, moet je de eerder gemaakte cluster openen en naar het tabblad Services gaan.<\/p>\n<p><\/p>\n<p><strong>Starttype<\/strong> \u2014 je moet klikken op Switch to capacity provider strategy en de eerder gemaakte provider selecteren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/9d9dfdd8e333cce24bfb048ac84097e4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Taakdefinitie<\/strong> \u2014 we kiezen de eerder gemaakte Taakdefinitie en zijn revisie.<\/p>\n<p><\/p>\n<p><strong>Dienstnaam<\/strong> \u2014 om verwarring te voorkomen, geven we altijd dezelfde op als de Taakdefinitie.<\/p>\n<p><\/p>\n<p><strong>Servicetype<\/strong> \u2014 altijd Replica.<\/p>\n<p><\/p>\n<p><strong>Aantal taken<\/strong> \u2014 het gewenste aantal actieve taken in de service. Deze parameter wordt beheerd door de schaling, maar moet nog steeds worden opgegeven.<\/p>\n<p><\/p>\n<p><strong>Minimaal gezond percentage<\/strong> en <strong>Maximaal percentage<\/strong> \u2014 bepalen het gedrag van taken tijdens de implementatie. De standaardwaarden zijn 100 en 200, wat betekent dat bij de implementatie het aantal taken wordt verdubbeld en daarna weer naar het gewenste aantal terugkeert. Als je 1 taak draait, min=0, en max=100, dan zal deze tijdens de implementatie worden be\u00ebindigd en vervolgens weer worden opgepakt, wat betekent dat er downtime is. Als er 1 taak draait, min=50, max=150, dan vindt de implementatie helemaal niet plaats, omdat je 1 taak niet in twee\u00ebn kunt splitsen of met anderhalf kunt verhogen.<\/p>\n<p><\/p>\n<p><strong>Implementatietype<\/strong> \u2014 we laten Rolling update staan.<\/p>\n<p><\/p>\n<p><strong>Plaatsingstemplates<\/strong> \u2014 regels voor het plaatsen van taken op machines. Standaard staat AZ Balanced Spread \u2014 dit betekent dat elke nieuwe taak op een nieuwe instantie wordt geplaatst totdat de machines in alle beschikbaarheidszones operationeel zijn. Gewoonlijk maken we BinPack \u2014 CPU en Spread \u2014 AZ, bij dit beleid worden taken zo dicht mogelijk bij elkaar op \u00e9\u00e9n machine op CPU geplaatst. Bij de noodzaak om een nieuwe machine te cre\u00ebren, wordt deze in een nieuwe beschikbaarheidszone aangemaakt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/6430bdf046fc5b970e0afbbf0d9ef65e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Type load balancer<\/strong> \u2014 we kiezen Application Load Balancer.<\/p>\n<p><\/p>\n<p><strong>IAM-rol voor de service<\/strong> \u2014 we kiezen <code>ecsServiceRole<\/code>.<\/p>\n<p><\/p>\n<p><strong>Naam van de load balancer<\/strong> \u2014 we kiezen de eerder gemaakte balancer.<\/p>\n<p><\/p>\n<p><strong>Gezondheidscontrole-graceperiode<\/strong> \u2014 pauze voordat de werkingcontroles na het uitrollen van een nieuwe taak worden uitgevoerd, wij zetten meestal 60 seconden.<\/p>\n<p><\/p>\n<p><strong>Container om te load balancen<\/strong> \u2014 in het veld Naam van de doelfgroep kiezen we de eerder gemaakte groep, en alles wordt automatisch ingevuld.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c067868ff73c25c3d9b65e02be64f5c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Service Auto Scaling<\/strong> \u2014 parameters voor de autoschaling van de service. We kiezen Configure Service Auto Scaling to adjust your service\u2019s desired count. We stellen het minimale en maximale aantal taken in bij het schalen.<\/p>\n<p><\/p>\n<p><strong>IAM-rol voor Service Auto Scaling<\/strong> \u2014 we kiezen <code>AWSServiceRoleForApplicationAutoScaling_ECSService<\/code>.<\/p>\n<p><\/p>\n<p><strong>Automatische taak_scalering beleidsregels<\/strong> \u2014 regels voor schaling. Er zijn 2 soorten:<\/p>\n<p><\/p>\n<ol>\n<li><strong>Doel tracking<\/strong> \u2014 het volgen van een doelmetric (gebruik van CPU\/RAM of het aantal verzoeken per taak). Bijvoorbeeld, we willen dat de gemiddelde CPU-belasting 85% is. Wanneer deze hoger wordt, zullen nieuwe taken worden toegevoegd totdat deze weer naar de doelwaarde terugkeert. Als de belasting lager is, worden taken verwijderd, tenzij er een bescherming tegen neerwaartse schaling is ingeschakeld (<strong>Schaling-in uitschakelen<\/strong>).<\/li>\n<li><strong>Stap schaling<\/strong> \u2014 reactie op willekeurige gebeurtenissen. Hier kunt u een reactie op elk evenement (CloudWatch Alarm) instellen. Wanneer dit zich voordoet, kunt u een opgegeven aantal taken toevoegen of verwijderen, of het exacte aantal taken opgeven.<\/li>\n<\/ol>\n<p><\/p>\n<p>De service kan meerdere schalingsregels hebben, wat nuttig kan zijn, maar let erop dat ze niet met elkaar in conflict komen.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Conclusie<\/h2>\n<p><\/p>\n<p>Als u de instructies heeft gevolgd en dezelfde Docker-image heeft gebruikt, zou uw service deze pagina moeten retourneren.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cre\u00ebren van een schaalbare API op spot-instance van AWS\" src=\"\/wp-content\/uploads\/2020\/07\/ac592e3194480ac8b347a3a1faf0cee0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ol>\n<li>We hebben een sjabloon gemaakt waarop alle machines in de service worden gestart. We hebben ook geleerd hoe we machines kunnen bijwerken wanneer het sjabloon verandert.<\/li>\n<li>We hebben de afhandeling van het stop-signaal van de spot-instanties ingesteld, zodat binnen een minuut na ontvangst alle actieve taken van de machine worden verwijderd en er niets verloren gaat of onderbroken wordt.<\/li>\n<li>We hebben een load balancer opgezet om de belasting gelijkmatig over de machines te verdelen.<\/li>\n<li>We hebben een service opgezet die draait op spot-instanties, wat de kosten voor de machines met ongeveer 3 keer vermindert.<\/li>\n<li>We hebben autoscaling ingesteld in beide richtingen om te kunnen omgaan met toenemende belastingen, maar tegelijkertijd niet te betalen voor inactiviteit.<\/li>\n<li>We gebruiken Capacity Provider, zodat de applicatie de infrastructuur (machines) beheert en niet andersom.<\/li>\n<li>We hebben het goed gedaan.<\/li>\n<\/ol>\n<p><\/p>\n<p>Als u voorspelbare pieken in de belasting heeft, bijvoorbeeld wanneer u grote e-mailcampagnes uitvoert, kunt u schaling instellen op <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/application\/userguide\/application-auto-scaling-scheduled-scaling.html\">schema<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>U kunt ook schaling maken op basis van gegevens uit verschillende delen van uw systeem. Bijvoorbeeld, we hebben functionaliteit voor <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.adapty.io\/promo-campaigns\">het verzenden van persoonlijke promotieaanbiedingen<\/a><\/noindex> gebruikers van de mobiele applicatie. Soms wordt de campagne naar meer dan 1M mensen gestuurd. Na zo'n campagne zien we altijd een grote stijging van verzoeken aan de API, aangezien veel gebruikers tegelijkertijd de app openen. Dus als we zien dat er in de wachtrij voor het verzenden van promo-pushmeldingen aanzienlijk meer zijn dan de standaardindicatoren, kunnen we onmiddellijk meerdere extra machines en taken starten om klaar te zijn voor de belasting.<\/p>\n<p><\/p>\n<p>Ik ben benieuwd of jullie in de comments interessante cases willen delen over het gebruik van spot-instanties en ECS, of iets over schaalvergroting.<\/p>\n<p><\/p>\n<p>Binnenkort komen er artikelen over hoe we duizenden analytische evenementen per seconde verwerken op een voornamelijk serverless stack (met geld) en hoe de deployment van services werkt met behulp van GitLab CI en Terraform Cloud.<\/p>\n<p><\/p>\n<p>Volg ons, het zal interessant zijn!<\/p>\n<p class=\"for_users_only_msg\">Alleen geregistreerde gebruikers kunnen deelnemen aan de enqu\u00eate. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Log in<\/a><\/noindex>, alstublieft.<\/p>\n<h2 class=\"default-block__polling-title\">Gebruik je spot-instanties in productie?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">22,2%<\/strong>Ja6<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">66,7%<\/strong>Nee18<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">11,1%<\/strong>Ik hoorde erover in een artikel, ik ben van plan ze te gebruiken3<\/p>\n<\/li>\n<\/ul>\n<p>    27 gebruikers hebben gestemd. 5 gebruikers hebben zich onthouden.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/509790\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 AWS, \u0438 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u043a\u0440\u0430\u0442\u0438\u043b\u0438 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 3 \u0440\u0430\u0437\u0430 \u0437\u0430 \u0441\u0447\u0451\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0437\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":87394,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-87393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e API \u043d\u0430 \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 AWS | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-07-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-07-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Cre\u00ebren van een schaalbare API op AWS spot-instanties | ProHoster","description":"Hallo allemaal! Mijn naam is Kirill, ik ben CTO bij Adapty.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e API \u043d\u0430 \u0441\u043f\u043e\u0442\u043e\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430\u0445 AWS | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041a\u0438\u0440\u0438\u043b\u043b, \u044f CTO \u0432 Adapty.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-07-07T23:42:02+00:00","article:modified_time":"2020-07-07T23:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"87393","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:44:41","updated":"2022-09-28 14:12:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/87393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=87393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/87393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/87394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=87393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=87393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=87393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}