{"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\/pt\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","title":{"rendered":"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1 a todos! Meu nome \u00e9 Kirill, sou o CTO da Adapty. A maior parte da nossa arquitetura est\u00e1 na AWS, e hoje vou falar sobre como reduzimos os custos com servidores em 3 vezes usando inst\u00e2ncias spot em nosso ambiente de produ\u00e7\u00e3o, bem como sobre como configurar a escalabilidade autom\u00e1tica. Primeiro, haver\u00e1 uma vis\u00e3o geral de como isso funciona, seguida de um guia detalhado de como implementar.<\/p>\n<p><\/p>\n<h2 id=\"chto-takoe-spotovye-instansy\">O que s\u00e3o inst\u00e2ncias spot?<\/h2>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/ru\/ec2\/spot\/\">Spot<\/a><\/noindex> inst\u00e2ncias s\u00e3o servidores de outros usu\u00e1rios da AWS que est\u00e3o ociosos no momento, e eles os vendem com um grande desconto (a Amazon menciona at\u00e9 90%, mas com base na nossa experi\u00eancia \u00e9 cerca de 3x, variando de acordo com a regi\u00e3o, AZ e tipo de inst\u00e2ncia). A principal diferen\u00e7a em rela\u00e7\u00e3o \u00e0s inst\u00e2ncias normais \u00e9 que elas podem ser desligadas a qualquer momento. Por muito tempo, acreditamos que era aceit\u00e1vel us\u00e1-las para ambientes de desenvolvimento ou para tarefas que requerem c\u00e1lculos, salvando resultados intermedi\u00e1rios no S3 ou em um banco de dados, mas n\u00e3o para produ\u00e7\u00e3o. Existem solu\u00e7\u00f5es de terceiros que permitem usar spot em produ\u00e7\u00e3o, mas no nosso caso, elas t\u00eam muitas limita\u00e7\u00f5es, portanto n\u00e3o as implementamos. O m\u00e9todo descrito neste artigo funciona totalmente dentro das funcionalidades padr\u00e3o da AWS, sem scripts adicionais, cron jobs, etc.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>A seguir, apresento algumas capturas de tela que mostram a hist\u00f3ria dos pre\u00e7os das inst\u00e2ncias spot.<\/p>\n<p><\/p>\n<p>m5.large na regi\u00e3o eu-west-1 (Irlanda). O pre\u00e7o \u00e9 predominantemente est\u00e1vel ao longo de 3 meses, atualmente com uma economia de 2.9x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/901a259955c386493557280489f582fe.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>m5.large na regi\u00e3o us-east-1 (N. Virginia). O pre\u00e7o varia constantemente ao longo de 3 meses, atualmente com uma economia de 2.3x a 2.8x dependendo da zona de disponibilidade.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/49c89430f03b2c7025355562d2873b6b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>t3.small na regi\u00e3o us-east-1 (N. Virginia). O pre\u00e7o \u00e9 est\u00e1vel ao longo de 3 meses, atualmente com uma economia de 3.4x.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/2e139dcc6d44bd37caf9d75eb6ec4835.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h2 id=\"arhitektura-servisa\">Arquitetura do servi\u00e7o<\/h2>\n<p><\/p>\n<p>A arquitetura b\u00e1sica do servi\u00e7o que iremos discutir neste artigo est\u00e1 representada no diagrama abaixo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da 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>O Application Load Balancer (ALB) \u00e9 usado como balanceador, que direciona as requisi\u00e7\u00f5es para o EC2 Target Group (TG). O TG \u00e9 respons\u00e1vel por abrir portas nas inst\u00e2ncias para o ALB e vincul\u00e1-las \u00e0s portas dos cont\u00eaineres do Elastic Container Service (ECS). O ECS \u00e9 an\u00e1logo ao Kubernetes na AWS, que gerencia cont\u00eaineres Docker.<\/p>\n<p><\/p>\n<p>Em uma inst\u00e2ncia, pode haver v\u00e1rios cont\u00eaineres em execu\u00e7\u00e3o com as mesmas portas, portanto, n\u00e3o podemos defini-las de forma fixa. O ECS informa ao TG que est\u00e1 iniciando uma nova tarefa (o que na terminologia do Kubernetes \u00e9 chamado de pod), e ele verifica as portas dispon\u00edveis na inst\u00e2ncia e designa uma delas para a tarefa a ser iniciada. Al\u00e9m disso, o TG verifica regularmente se a inst\u00e2ncia e a API nela est\u00e3o funcionando por meio de checagens de sa\u00fade e, se notar algum problema, para de redirecionar solicita\u00e7\u00f5es para l\u00e1.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-groups--ecs-capacity-providers\">Grupos de Auto Scaling do EC2 + Provedores de Capacidade do ECS<\/h3>\n<p><\/p>\n<p>O servi\u00e7o Grupos de Auto Scaling do EC2 (ASG) n\u00e3o est\u00e1 mostrado no diagrama acima. Pelo nome, pode-se entender que ele \u00e9 respons\u00e1vel pela escalabilidade das inst\u00e2ncias. At\u00e9 recentemente, a AWS n\u00e3o tinha um recurso integrado para gerenciar o n\u00famero de m\u00e1quinas em execu\u00e7\u00e3o a partir do ECS. O ECS permitia escalar o n\u00famero de tarefas, por exemplo, com base no uso de CPU, RAM ou no n\u00famero de solicita\u00e7\u00f5es. Mas se as tarefas ocupassem todas as inst\u00e2ncias dispon\u00edveis, novas m\u00e1quinas n\u00e3o seriam automaticamente iniciadas.<\/p>\n<p><\/p>\n<p>Isso mudou com a introdu\u00e7\u00e3o dos Provedores de Capacidade do ECS (ECS CP). Agora, cada servi\u00e7o no ECS pode ser vinculado a um ASG, e se as tarefas n\u00e3o cabem nas inst\u00e2ncias em execu\u00e7\u00e3o, novas ser\u00e3o iniciadas (mas dentro dos limites estabelecidos do ASG). Isso tamb\u00e9m funciona ao contr\u00e1rio; se o ECS CP identificar inst\u00e2ncias ociosas sem tarefas, ele dar\u00e1 a ordem ao ASG para deslig\u00e1-las. O ECS CP tem a capacidade de especificar uma porcentagem de utiliza\u00e7\u00e3o alvo das inst\u00e2ncias, de modo que um certo n\u00famero de m\u00e1quinas esteja sempre dispon\u00edvel para uma r\u00e1pida escalabilidade das tarefas, falarei sobre isso um pouco mais tarde.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-templates\">Modelos de Lan\u00e7amento do EC2<\/h3>\n<p><\/p>\n<p>O \u00faltimo servi\u00e7o que irei apresentar, antes de passar \u00e0 descri\u00e7\u00e3o detalhada da cria\u00e7\u00e3o desta infraestrutura, s\u00e3o os Modelos de Lan\u00e7amento do EC2. Ele permite criar um modelo pelo qual todas as m\u00e1quinas ser\u00e3o iniciadas, para n\u00e3o ter que repetir isso do zero a cada vez. Aqui voc\u00ea pode escolher o tipo de m\u00e1quina a ser iniciada, grupo de seguran\u00e7a, imagem de disco e muitos outros par\u00e2metros. Tamb\u00e9m \u00e9 poss\u00edvel especificar dados personalizados que ser\u00e3o carregados em todas as inst\u00e2ncias iniciadas. Nos dados personalizados, voc\u00ea pode executar scripts, por exemplo, pode editar o conte\u00fado do arquivo <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">de configura\u00e7\u00e3o do agente do ECS<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Um dos par\u00e2metros de configura\u00e7\u00e3o mais importantes neste artigo \u00e9 <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. Se este par\u00e2metro estiver ativado, assim que o ECS receber o sinal de que a inst\u00e2ncia spot est\u00e1 sendo removida, ele muda o status de todas as tarefas que est\u00e3o sendo executadas nela para Draining. Nenhuma nova tarefa ser\u00e1 designada para esta inst\u00e2ncia; se houver tarefas que desejam ser implantadas nela, elas ser\u00e3o canceladas. As solicita\u00e7\u00f5es do balanceador de carga tamb\u00e9m deixar\u00e3o de chegar. A notifica\u00e7\u00e3o de remo\u00e7\u00e3o da inst\u00e2ncia chega 2 minutos antes do evento real. Portanto, se seu servi\u00e7o n\u00e3o executar tarefas por mais de 2 minutos e n\u00e3o salvar nada no disco, voc\u00ea pode usar inst\u00e2ncias spot sem perda de dados.<\/p>\n<p><\/p>\n<p>Quanto ao disco \u2014 a AWS recentemente <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.\">tornou<\/a><\/noindex> poss\u00edvel o uso do Elastic File System (EFS) junto com o ECS, com esse esquema nem mesmo o disco \u00e9 um obst\u00e1culo, mas n\u00e3o tentamos isso, j\u00e1 que, em princ\u00edpio, n\u00e3o precisamos de um disco para armazenar estado. Por padr\u00e3o, ap\u00f3s receber SIGINT (enviado no momento em que a tarefa muda para o status Draining), todas as tarefas em execu\u00e7\u00e3o ser\u00e3o paradas em 30 segundos, mesmo que n\u00e3o tenham sido conclu\u00eddas; esse tempo pode ser alterado usando o par\u00e2metro <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-agent-config.html\">ECS_CONTAINER_STOP_TIMEOUT<\/a><\/noindex>. O importante \u00e9 n\u00e3o definir mais que 2 minutos para m\u00e1quinas spot.<\/p>\n<p><\/p>\n<h2 id=\"sozdanie-servisa\">Cria\u00e7\u00e3o de servi\u00e7o<\/h2>\n<p><\/p>\n<p>Vamos passar diretamente \u00e0 cria\u00e7\u00e3o do servi\u00e7o descrito. No processo, descreverei alguns pontos adicionais \u00fateis que n\u00e3o foram mencionados acima. Em geral, esta \u00e9 uma instru\u00e7\u00e3o passo a passo, mas algumas situa\u00e7\u00f5es muito b\u00e1sicas ou, pelo contr\u00e1rio, muito espec\u00edficas n\u00e3o ser\u00e3o abordadas. Todas as a\u00e7\u00f5es s\u00e3o realizadas no console visual da AWS, mas podem ser reproduzidas programaticamente usando CloudFormation ou Terraform. Na Adapty usamos Terraform.<\/p>\n<p><\/p>\n<h3 id=\"ec2-launch-template\"><strong>Modelo de Inicializa\u00e7\u00e3o EC2<\/strong><\/h3>\n<p><\/p>\n<p>Neste servi\u00e7o, \u00e9 criada uma configura\u00e7\u00e3o de m\u00e1quinas que ser\u00e3o utilizadas. A gest\u00e3o dos modelos \u00e9 feita na se\u00e7\u00e3o EC2 -&gt; Instances -&gt; Launch templates.<\/p>\n<p><\/p>\n<p><strong>Imagem de m\u00e1quina da Amazon (AMI)<\/strong> \u2014 especificamos a imagem do disco com a qual todas as inst\u00e2ncias ser\u00e3o iniciadas. Para o ECS, na maioria dos casos, deve-se usar a imagem otimizada da Amazon. Ela \u00e9 atualizada regularmente e cont\u00e9m tudo o que \u00e9 necess\u00e1rio para o funcionamento do ECS. Para saber o ID atual da imagem, vamos \u00e0 p\u00e1gina <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ecs-optimized_AMI.html\">Amazon ECS-optimized AMIs<\/a><\/noindex>, escolhemos a regi\u00e3o utilizada e copiamos o ID da AMI para ela. Por exemplo, para a regi\u00e3o us-east-1, o ID atual no momento da reda\u00e7\u00e3o deste artigo \u00e9 <em>ami-00c7c1cf5bdc913ed<\/em>. Este ID deve ser inserido no item Especificar um valor personalizado.<\/p>\n<p><\/p>\n<p><strong>Tipo de inst\u00e2ncia<\/strong> \u2014 indicamos o tipo de inst\u00e2ncia. Escolha aquele que melhor se adapta \u00e0 sua tarefa.<\/p>\n<p><\/p>\n<p><strong>Par de chaves (login)<\/strong> \u2014 indicamos o certificado que permite a conex\u00e3o com a inst\u00e2ncia via SSH, se necess\u00e1rio.<\/p>\n<p><\/p>\n<p><strong>Configura\u00e7\u00f5es de rede<\/strong> \u2014 indicamos os par\u00e2metros da rede. <strong>Plataforma de rede<\/strong> na maioria dos casos deve ser a Virtual Private Cloud (VPC). <strong>Grupos de seguran\u00e7a<\/strong> \u2014 grupos de seguran\u00e7a para suas inst\u00e2ncias. Como iremos usar um balanceador na frente das inst\u00e2ncias, recomendo indicar aqui um grupo que permita conex\u00f5es de entrada apenas do balanceador. Ou seja, voc\u00ea ter\u00e1 2 grupos de seguran\u00e7a, um para o balanceador, que permite conex\u00f5es de entrada (inbound) de qualquer lugar nas portas 80 (http) e 443 (https), e o segundo para as m\u00e1quinas, que permite conex\u00f5es de entrada em quaisquer portas do grupo do balanceador. Conex\u00f5es de sa\u00edda (outbound) em ambos os grupos devem ser liberadas via protocolo TCP em todas as portas para todos os endere\u00e7os. \u00c9 poss\u00edvel restringir as portas e endere\u00e7os para conex\u00f5es de sa\u00edda, mas isso requer monitoramento constante para garantir que voc\u00ea n\u00e3o esteja tentando acessar uma porta fechada.<\/p>\n<p><\/p>\n<p><strong>Armazenamento (volumes)<\/strong> \u2014 indicamos os par\u00e2metros dos discos para as m\u00e1quinas. O volume do disco n\u00e3o pode ser menor do que o especificado na AMI, para ECS Optimized \u2014 30 GiB.<\/p>\n<p><\/p>\n<p><strong>Detalhes avan\u00e7ados<\/strong> \u2014 indicamos par\u00e2metros adicionais.<\/p>\n<p><\/p>\n<p><strong>Op\u00e7\u00e3o de compra<\/strong> \u2014 se queremos comprar inst\u00e2ncias spot. Queremos, mas n\u00e3o marcaremos esta op\u00e7\u00e3o aqui, configuraremos isso no Auto Scaling Group, onde h\u00e1 mais op\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p><strong>Perfil de inst\u00e2ncia IAM<\/strong> \u2014 indicamos a fun\u00e7\u00e3o com a qual as inst\u00e2ncias ser\u00e3o iniciadas. Para que as inst\u00e2ncias funcionem no ECS, elas precisam de permiss\u00f5es que normalmente est\u00e3o na fun\u00e7\u00e3o <em>ecsInstanceRole<\/em>. Em alguns casos, ela pode ser criada; se n\u00e3o, veja aqui <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/instance_IAM_role.html\">um guia<\/a><\/noindex> como fazer isso. Ap\u00f3s a cria\u00e7\u00e3o, indicamos isso no template.<br \/>\nEm seguida, existem muitos par\u00e2metros, na maioria das vezes, pode-se deixar os valores padr\u00e3o, mas cada um deles tem uma descri\u00e7\u00e3o clara. Eu sempre incluo os par\u00e2metros de inst\u00e2ncia EBS-optimized e T2\/T3 Unlimited, se forem utilizados <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AWSEC2\/latest\/UserGuide\/burstable-performance-instances.html\">burstable<\/a><\/noindex> inst\u00e2ncias.<\/p>\n<p><\/p>\n<p><strong>Dados do usu\u00e1rio<\/strong> \u2014 indicamos os dados do usu\u00e1rio. Iremos editar o arquivo <code>\/etc\/ecs\/ecs.config<\/code>, que cont\u00e9m a configura\u00e7\u00e3o do agente ECS.<br \/>\nExemplo de como os dados do usu\u00e1rio podem parecer:<\/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 o par\u00e2metro indica que a inst\u00e2ncia pertence a um cluster com o nome especificado, ou seja, esse cluster poder\u00e1 alocar suas tarefas neste servidor. Ainda n\u00e3o criamos um cluster, mas ao cri\u00e1-lo, usaremos este nome.<\/p>\n<p><\/p>\n<p><code>ECS_ENABLE_SPOT_INSTANCE_DRAINING=true<\/code> \u2014 o par\u00e2metro indica que, ao receber um sinal de desligamento de uma inst\u00e2ncia spot, todas as tarefas nela devem ser transferidas para o estado Draining.<\/p>\n<p><\/p>\n<p><code>ECS_CONTAINER_STOP_TIMEOUT=1m<\/code> \u2014 o par\u00e2metro indica que, ap\u00f3s receber o sinal SIGINT, todas as tarefas t\u00eam 1 minuto antes de serem encerradas.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_TYPE=docker<\/code> \u2014 o par\u00e2metro indica que o esquema de autoriza\u00e7\u00e3o utilizado \u00e9 o docker.<\/p>\n<p><\/p>\n<p><code>ECS_ENGINE_AUTH_DATA=...<\/code> \u2014 par\u00e2metros de conex\u00e3o para um registro de containers privado, onde suas imagens Docker s\u00e3o armazenadas. Se for p\u00fablico, n\u00e3o \u00e9 necess\u00e1rio especificar nada.<\/p>\n<p><\/p>\n<p>Neste artigo, utilizarei uma imagem p\u00fablica do Docker Hub, portanto, n\u00e3o \u00e9 necess\u00e1rio especificar par\u00e2metros. <code>ECS_ENGINE_AUTH_TYPE<\/code> e <code>ECS_ENGINE_AUTH_DATA<\/code> n\u00e3o \u00e9 necess\u00e1rio.<\/p>\n<p><\/p>\n<p><strong>\u00c9 \u00fatil saber<\/strong>: \u00e9 recomend\u00e1vel atualizar regularmente a AMI, pois, em novas vers\u00f5es, as vers\u00f5es do Docker, Linux, agente ECS, etc., s\u00e3o atualizadas. Para n\u00e3o esquecer disso, voc\u00ea pode <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/ECS-AMI-SubscribeTopic.html\">configurar notifica\u00e7\u00f5es<\/a><\/noindex> sobre o lan\u00e7amento de novas vers\u00f5es. Voc\u00ea pode receber notifica\u00e7\u00f5es por e-mail e atualizar manualmente, ou pode escrever uma fun\u00e7\u00e3o Lambda que criar\u00e1 automaticamente uma nova vers\u00e3o do Launch Template com a AMI atualizada.<\/p>\n<p><\/p>\n<h3 id=\"ec2-auto-scaling-group\"><strong>Grupo de Auto Scaling EC2<\/strong><\/h3>\n<p><\/p>\n<p>O grupo de Auto Scaling \u00e9 respons\u00e1vel por iniciar e dimensionar inst\u00e2ncias. O gerenciamento dos grupos \u00e9 feito na se\u00e7\u00e3o EC2 -&gt; Auto Scaling -&gt; Grupos de Auto Scaling.<\/p>\n<p><\/p>\n<p><strong>Template de Lan\u00e7amento<\/strong> \u2014 selecionamos o template criado na etapa anterior. Mantemos a vers\u00e3o padr\u00e3o.<\/p>\n<p><\/p>\n<p><strong>Op\u00e7\u00f5es de compra e tipos de inst\u00e2ncia<\/strong> \u2014 especificamos os tipos de inst\u00e2ncias para o cluster. Aderir ao template de lan\u00e7amento usa o tipo de inst\u00e2ncia do Launch Template. Combinar op\u00e7\u00f5es de compra e tipos de inst\u00e2ncia permite configurar os tipos de inst\u00e2ncias de forma flex\u00edvel. Usaremos esta op\u00e7\u00e3o.<\/p>\n<p><\/p>\n<p><strong>Base On-Demand Opcional<\/strong> \u2014 o n\u00famero de inst\u00e2ncias normais, n\u00e3o spot, que sempre estar\u00e3o em funcionamento.<\/p>\n<p><\/p>\n<p><strong>Percentual On-Demand acima da base<\/strong> \u2014 a propor\u00e7\u00e3o percentual de inst\u00e2ncias normais para inst\u00e2ncias spot, 50-50 distribuir\u00e1 igualmente, 20-80 far\u00e1 com que, para cada inst\u00e2ncia normal, sejam levantadas 4 inst\u00e2ncias spot. Neste exemplo, indicarei 50-50, mas na realidade frequentemente utilizamos 20-80, em alguns casos 0-100.<\/p>\n<p><\/p>\n<p><strong>Tipos de inst\u00e2ncia<\/strong> \u2014 aqui voc\u00ea pode especificar tipos adicionais de inst\u00e2ncias que ser\u00e3o utilizadas no cluster. Nunca utilizamos isso, pois n\u00e3o entendo muito o sentido dessa hist\u00f3ria. Talvez esteja relacionado a limites em tipos espec\u00edficos de inst\u00e2ncias, mas eles s\u00e3o aumentados facilmente pelo suporte. Se voc\u00ea sabe como isso se aplica, ficarei feliz em ler nos coment\u00e1rios)<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c1ee742d2059674f39a53cac6b9f2347.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Rede<\/strong> \u2014 configura\u00e7\u00f5es de rede, voc\u00ea escolhe o VPC e as sub-redes para as m\u00e1quinas; na maioria das vezes, \u00e9 melhor selecionar todas as sub-redes dispon\u00edveis.<\/p>\n<p><\/p>\n<p><strong>Balanceamento de carga<\/strong> \u2014 configura\u00e7\u00f5es do balanceador, mas faremos isso separadamente, aqui n\u00e3o alteramos nada. <strong>Verifica\u00e7\u00f5es de sa\u00fade<\/strong> tamb\u00e9m ser\u00e3o configuradas mais tarde.<\/p>\n<p><\/p>\n<p><strong>Tamanho do grupo<\/strong> \u2014 especificamos limites para o n\u00famero de m\u00e1quinas no cluster e o n\u00famero desejado de m\u00e1quinas na inicializa\u00e7\u00e3o. O n\u00famero de m\u00e1quinas no cluster nunca ser\u00e1 menor do que o m\u00ednimo especificado e maior do que o m\u00e1ximo, mesmo que as m\u00e9tricas sinalizem que a escalabilidade deve ocorrer.<\/p>\n<p><\/p>\n<p><strong>Pol\u00edticas de escalonamento<\/strong> \u2014 par\u00e2metros de escalonamento, mas iremos escalar com base nas tarefas ECS em execu\u00e7\u00e3o, ent\u00e3o configuraremos o escalonamento mais tarde.<\/p>\n<p><\/p>\n<p><strong>Prote\u00e7\u00e3o de escala de inst\u00e2ncias<\/strong> \u2014 prote\u00e7\u00e3o contra exclus\u00e3o de inst\u00e2ncias durante o escalonamento para baixo. Ativamos isso para que o ASG n\u00e3o remova a m\u00e1quina que est\u00e1 executando tarefas. Desativar a prote\u00e7\u00e3o para inst\u00e2ncias sem tarefas ser\u00e1 feito pelo ECS Capacity Provider.<\/p>\n<p><\/p>\n<p><strong>Adicionar tags<\/strong> \u2014 voc\u00ea pode especificar tags para inst\u00e2ncias (para isso, a op\u00e7\u00e3o Tag new instances deve estar marcada). Recomendo usar a tag Name, assim todas as inst\u00e2ncias que s\u00e3o iniciadas dentro do grupo ter\u00e3o o mesmo nome, facilitando a visualiza\u00e7\u00e3o no console.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/61fa0ccb38c11f61431db0938140efb7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ap\u00f3s criar o grupo, abra-o e acesse a se\u00e7\u00e3o Configura\u00e7\u00f5es Avan\u00e7adas, pois na fase de cria\u00e7\u00e3o nem todas as op\u00e7\u00f5es est\u00e3o vis\u00edveis no console.<\/p>\n<p><\/p>\n<p><strong>Pol\u00edticas de termina\u00e7\u00e3o<\/strong> \u2014 regras consideradas ao remover inst\u00e2ncias. Elas s\u00e3o aplicadas em ordem. Geralmente, usamos aquelas mostradas na imagem abaixo. Primeiro, removemos inst\u00e2ncias com o Launch Template mais antigo (por exemplo, se atualizarmos o AMI, uma nova vers\u00e3o ser\u00e1 criada, mas todas as inst\u00e2ncias j\u00e1 ter\u00e3o mudado para ela). Depois, escolhemos as inst\u00e2ncias que est\u00e3o mais pr\u00f3ximas do pr\u00f3ximo hor\u00e1rio de c\u00e1lculo fatur\u00e1vel. Em seguida, selecionamos as mais antigas pela data de lan\u00e7amento.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/8236624fe08a03f36aedc7665e18b060.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>\u00c9 \u00fatil saber<\/strong>: para atualizar todas as m\u00e1quinas no cluster, \u00e9 conveniente usar <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/ec2\/userguide\/asg-instance-refresh.html\">Atualiza\u00e7\u00e3o de inst\u00e2ncia<\/a><\/noindex>. Se voc\u00ea combinar isso com a fun\u00e7\u00e3o Lambda da etapa anterior, ter\u00e1 um sistema de atualiza\u00e7\u00e3o de inst\u00e2ncias completamente automatizado. Antes de atualizar todas as m\u00e1quinas, \u00e9 necess\u00e1rio desativar a prote\u00e7\u00e3o de escala de inst\u00e2ncia para todas as inst\u00e2ncias no grupo. N\u00e3o a configura\u00e7\u00e3o no grupo, mas sim a prote\u00e7\u00e3o das pr\u00f3prias m\u00e1quinas, isso \u00e9 feito na aba de gerenciamento de inst\u00e2ncias.<\/p>\n<p><\/p>\n<h3 id=\"application-load-balancer-i-ec2-target-group\">Application Load Balancer e EC2 Target Group<\/h3>\n<p><\/p>\n<p>O balanceador \u00e9 criado na se\u00e7\u00e3o EC2 \u2192 Load Balancing \u2192 Load Balancers. Usaremos o Application Load Balancer; uma compara\u00e7\u00e3o dos diferentes tipos de balanceadores pode ser lida na <noindex><a rel=\"nofollow\" href=\"https:\/\/aws.amazon.com\/elasticloadbalancing\/features\/#compare\">p\u00e1gina do servi\u00e7o<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p><strong>Listeners<\/strong> \u2014 faz sentido criar as portas 80 e 443 e fazer o redirecionamento de 80 para 443 mais tarde, usando regras do balanceador.<\/p>\n<p><\/p>\n<p><strong>Availability Zones<\/strong> \u2014 na maioria dos casos, escolhemos todas as zonas de disponibilidade.<\/p>\n<p><\/p>\n<p><strong>Configure Security Settings<\/strong> \u2014 aqui \u00e9 indicado o certificado SSL para o balanceador, a op\u00e7\u00e3o mais conveniente \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/acm\/latest\/userguide\/gs-acm-request-public.html\">criar um certificado<\/a><\/noindex> no ACM. As diferen\u00e7as <strong>Security Policy<\/strong> podem ser lidas em <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/classic\/elb-security-policy-table.html\">documenta\u00e7\u00e3o<\/a><\/noindex>, pode-se deixar o selecionado por padr\u00e3o <code>ELBSecurityPolicy-2016-08<\/code>. Ap\u00f3s criar o balanceador, voc\u00ea ver\u00e1 seu <strong>DNS name<\/strong>, para o qual \u00e9 necess\u00e1rio configurar um CNAME para seu dom\u00ednio. Por exemplo, assim \u00e9 como aparece no Cloudflare.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da 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 criamos ou escolhemos um grupo de seguran\u00e7a para o balanceador; mais detalhes sobre isso foram escritos um pouco acima na se\u00e7\u00e3o EC2 Launch Template \u2192 Configura\u00e7\u00f5es de rede.<\/p>\n<p><\/p>\n<p><strong>Target group<\/strong> \u2014 criamos um grupo que \u00e9 respons\u00e1vel pelo roteamento de solicita\u00e7\u00f5es do balanceador para as m\u00e1quinas e verifica sua disponibilidade, para substitu\u00ed-las em caso de problemas. <strong>Target type<\/strong> deve ser Instance, <strong>Protocol<\/strong> e <strong>Porta<\/strong> qualquer um, se voc\u00ea estiver usando HTTPS para a comunica\u00e7\u00e3o entre o balanceador e as inst\u00e2ncias, ent\u00e3o dever\u00e1 carregar o certificado nelas. Neste exemplo, n\u00e3o faremos isso, apenas deixaremos a porta 80.<\/p>\n<p><\/p>\n<p><strong>Verifica\u00e7\u00f5es de sa\u00fade<\/strong> \u2014 par\u00e2metros de verifica\u00e7\u00e3o de integridade do servi\u00e7o. No servi\u00e7o real, isso deve ser uma solicita\u00e7\u00e3o separada, que implementa partes importantes da l\u00f3gica de neg\u00f3cios; neste exemplo, deixarei as configura\u00e7\u00f5es padr\u00e3o. Em seguida, pode-se escolher o intervalo de solicita\u00e7\u00f5es, o tempo de espera, c\u00f3digos de resposta bem-sucedidos, etc. No nosso exemplo, indicaremos c\u00f3digos de sucesso de 200-399, porque a imagem do Docker que ser\u00e1 utilizada retorna o c\u00f3digo 304.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/e295ab1c3bf1dfe13c76b4942a31c7ee.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Register Targets<\/strong> \u2014 aqui s\u00e3o escolhidas as m\u00e1quinas para o grupo, mas neste caso isso ser\u00e1 gerenciado pelo ECS, portanto, apenas pulamos esta etapa.<\/p>\n<p><\/p>\n<p><strong>\u00c9 \u00fatil saber<\/strong>: no n\u00edvel do balanceador, voc\u00ea pode ativar logs que ser\u00e3o salvos no S3 em um determinado <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/elasticloadbalancing\/latest\/application\/load-balancer-access-logs.html\">formato<\/a><\/noindex>. A partir da\u00ed, voc\u00ea pode export\u00e1-los para servi\u00e7os externos de an\u00e1lise ou fazer consultas SQL diretamente nos dados no S3 com <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/athena\/latest\/ug\/application-load-balancer-logs.html\">o Athena<\/a><\/noindex>. Isso \u00e9 conveniente e funciona sem nenhum c\u00f3digo adicional. Tamb\u00e9m recomendo configurar a exclus\u00e3o de logs do bucket S3 ap\u00f3s um per\u00edodo de tempo definido.<\/p>\n<p><\/p>\n<h3 id=\"ecs-task-definition\">Defini\u00e7\u00e3o de Tarefa ECS<\/h3>\n<p><\/p>\n<p>Nas etapas anteriores, criamos tudo o que est\u00e1 relacionado \u00e0 infraestrutura do servi\u00e7o, agora passamos para a descri\u00e7\u00e3o dos cont\u00eaineres que iremos executar. Isso \u00e9 feito na se\u00e7\u00e3o ECS \u2192 Defini\u00e7\u00f5es de Tarefa.<\/p>\n<p><\/p>\n<p><strong>Compatibilidade do tipo de inicializa\u00e7\u00e3o<\/strong> \u2014 escolhemos EC2.<\/p>\n<p><\/p>\n<p><strong>Fun\u00e7\u00e3o IAM de execu\u00e7\u00e3o da tarefa<\/strong> \u2014 selecionamos <code>ecsTaskExecutionRole<\/code>. Com ela, os logs s\u00e3o escritos, o acesso a vari\u00e1veis secretas \u00e9 concedido, entre outros.<\/p>\n<p><\/p>\n<p>Na se\u00e7\u00e3o Defini\u00e7\u00f5es de Cont\u00eainer, clique em Adicionar Cont\u00eainer.<\/p>\n<p><\/p>\n<p><strong>Imagem<\/strong> \u2014 o link para a imagem com o c\u00f3digo do projeto, neste exemplo, usarei uma imagem p\u00fablica do 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>Limites de Mem\u00f3ria<\/strong> \u2014 limites de mem\u00f3ria para o cont\u00eainer. <strong>Limite Rigoroso<\/strong> \u2014 limite rigoroso, se o cont\u00eainer ultrapassar o valor especificado, o comando docker kill ser\u00e1 executado, o cont\u00eainer morrer\u00e1 imediatamente. <strong>Limite Suave<\/strong> \u2014 limite suave, o cont\u00eainer pode ultrapassar o valor especificado, mas ao alocar tarefas para as m\u00e1quinas, esse par\u00e2metro ser\u00e1 considerado. Por exemplo, se a m\u00e1quina tem 4 GiB de mem\u00f3ria RAM e o limite suave do cont\u00eainer \u00e9 2048 MiB, ent\u00e3o no m\u00e1ximo 2 tarefas podem ser executadas nessa m\u00e1quina com esse cont\u00eainer. Na realidade, 4 GiB de RAM \u00e9 um pouco menos que 4096 MiB, isso pode ser verificado na aba Inst\u00e2ncias ECS no cluster. O limite suave n\u00e3o pode ser maior que o limite rigoroso. \u00c9 importante entender que se uma tarefa tiver v\u00e1rios cont\u00eaineres, seus limites s\u00e3o somados.<\/p>\n<p><\/p>\n<p><strong>Mapeamentos de Porta<\/strong> \u2014 em <strong>Porta do Host<\/strong> definimos 0, isso significa que a porta ser\u00e1 designada dinamicamente, ela ser\u00e1 monitorada pelo Target Group. <strong>Porta do Cont\u00eainer<\/strong> \u2014 a porta na qual seu aplicativo est\u00e1 executando, frequentemente definida no comando de execu\u00e7\u00e3o ou designada no c\u00f3digo do seu aplicativo, Dockerfile etc. Para o nosso exemplo, usaremos 3000, pois est\u00e1 especificado no <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bitnami\/bitnami-docker-node\/blob\/master\/example\/Dockerfile\">Dockerfile<\/a><\/noindex> imagem utilizada.<\/p>\n<p><\/p>\n<p><strong>Verifica\u00e7\u00e3o de integridade<\/strong> \u2014 par\u00e2metros para verificar a operabilidade do cont\u00eainer, n\u00e3o confundir com a configura\u00e7\u00e3o no Target Group.<\/p>\n<p><\/p>\n<p><strong>Ambiente<\/strong> \u2014 configura\u00e7\u00f5es do ambiente. <strong>unidades de CPU<\/strong> \u2014 semelhante aos limites de mem\u00f3ria, mas sobre o processador. Cada n\u00facleo do processador representa 1024 unidades, ent\u00e3o se o servidor tiver um processador de dois n\u00facleos e o cont\u00eainer tiver um valor de 512, ser\u00e1 poss\u00edvel executar 4 tarefas com esse cont\u00eainer em um \u00fanico servidor. As unidades de CPU sempre correspondem ao n\u00famero de n\u00facleos, n\u00e3o pode haver um n\u00famero ligeiramente menor, como acontece com a mem\u00f3ria.<\/p>\n<p><\/p>\n<p><strong>Comando<\/strong> \u2014 comando para iniciar o servi\u00e7o dentro do cont\u00eainer, todos os par\u00e2metros s\u00e3o especificados por v\u00edrgula. Isso pode ser gunicorn, npm, etc. Se n\u00e3o for especificado, o valor da diretiva CMD do Dockerfile ser\u00e1 utilizado. Especificamos <code>npm,start<\/code>.<\/p>\n<p><\/p>\n<p><strong>Vari\u00e1veis de ambiente<\/strong> \u2014 vari\u00e1veis de ambiente do cont\u00eainer. Podem ser tanto dados de texto simples, quanto vari\u00e1veis secretas do <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/AmazonECS\/latest\/developerguide\/specifying-sensitive-data-secrets.html\">Secrets Manager<\/a><\/noindex> ou <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>Armazenamento e Registro<\/strong> \u2014 aqui configuraremos o registro no CloudWatch Logs (servi\u00e7o de logs da AWS). Para isso, basta marcar a op\u00e7\u00e3o Auto-configure CloudWatch Logs. Ap\u00f3s criar a Task Definition, um grupo de logs ser\u00e1 criado automaticamente no CloudWatch. Por padr\u00e3o, os logs s\u00e3o armazenados indefinidamente, recomendo alterar o Retention period de Never Expire para o per\u00edodo desejado. Isso pode ser feito em CloudWatch Log groups, clicando no per\u00edodo atual e escolhendo um novo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da 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 e ECS Capacity Provider<\/h3>\n<p><\/p>\n<p>Vamos para a se\u00e7\u00e3o ECS \u2192 Clusters para criar um cluster. Como modelo, escolhemos EC2 Linux + Networking.<\/p>\n<p><\/p>\n<p><strong>Nome do cluster<\/strong> \u2014 \u00e9 muito importante, aqui fazemos o mesmo nome que est\u00e1 indicado no Launch Template na par\u00e1metro <code>ECS_CLUSTER<\/code>, no nosso caso \u2014 <code>DemoApiClusterProd<\/code>. Marque a op\u00e7\u00e3o Create an empty cluster. Opcionalmente, voc\u00ea pode habilitar o Container Insights para visualizar m\u00e9tricas dos servi\u00e7os no CloudWatch. Se tudo foi feito corretamente, na se\u00e7\u00e3o ECS Instances, voc\u00ea ver\u00e1 as m\u00e1quinas que foram criadas no Auto Scaling group.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/cd70062c9783ae359a2b27cbfc66cbe3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos para a guia <strong>Capacity Providers<\/strong> e criamos um novo. Lembro que ele \u00e9 necess\u00e1rio para gerenciar a cria\u00e7\u00e3o e desligamento de m\u00e1quinas, dependendo do n\u00famero de tarefas ECS em execu\u00e7\u00e3o. \u00c9 importante notar que o provedor pode estar vinculado apenas a um \u00fanico grupo.<\/p>\n<p><\/p>\n<p><strong>Auto Scaling group<\/strong> \u2014 escolhemos o grupo criado anteriormente.<\/p>\n<p><\/p>\n<p><strong>Escalonamento gerenciado<\/strong> \u2014 habilitamos para que o provedor possa escalar o servi\u00e7o.<\/p>\n<p><\/p>\n<p><strong>Capacidade alvo %<\/strong> \u2014 qual porcentagem de carga das m\u00e1quinas precisamos para as tarefas. Se especificar 100%, todas as m\u00e1quinas estar\u00e3o sempre ocupadas com tarefas em execu\u00e7\u00e3o. Se especificar 50%, metade das m\u00e1quinas estar\u00e1 sempre livre. Nesse caso, se ocorrer um pico repentino na carga, novos t\u00e1xis ser\u00e3o imediata e automaticamente alocados nas m\u00e1quinas livres, sem necessidade de aguardar a implanta\u00e7\u00e3o de inst\u00e2ncias.<\/p>\n<p><\/p>\n<p><strong>Prote\u00e7\u00e3o de termina\u00e7\u00e3o gerenciada<\/strong> \u2014 ativamos, este par\u00e2metro permite que o provedor remova a prote\u00e7\u00e3o das inst\u00e2ncias contra a exclus\u00e3o. Isso acontece quando n\u00e3o h\u00e1 tarefas ativas na m\u00e1quina e permite a capacidade alvo %.<\/p>\n<p><\/p>\n<h3 id=\"ecs-service-i-nastroyka-masshtabirovaniya\">Servi\u00e7o ECS e configura\u00e7\u00e3o de escalonamento<\/h3>\n<p><\/p>\n<p>\u00daltima etapa :) Para criar um servi\u00e7o, \u00e9 necess\u00e1rio acessar o cluster criado anteriormente na aba Servi\u00e7os.<\/p>\n<p><\/p>\n<p><strong>Tipo de lan\u00e7amento<\/strong> \u2014 \u00e9 necess\u00e1rio clicar em Alternar para a estrat\u00e9gia de provedor de capacidade e escolher o provedor criado anteriormente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/9d9dfdd8e333cce24bfb048ac84097e4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Defini\u00e7\u00e3o de tarefa<\/strong> \u2014 selecionamos a Defini\u00e7\u00e3o de Tarefa criada anteriormente e sua revis\u00e3o.<\/p>\n<p><\/p>\n<p><strong>Nome do servi\u00e7o<\/strong> \u2014 para n\u00e3o confundir, sempre indicamos o mesmo que a Defini\u00e7\u00e3o de Tarefa.<\/p>\n<p><\/p>\n<p><strong>Tipo de servi\u00e7o<\/strong> \u2014 sempre Replica.<\/p>\n<p><\/p>\n<p><strong>N\u00famero de tarefas<\/strong> \u2014 n\u00famero desejado de tarefas ativas no servi\u00e7o. Este par\u00e2metro \u00e9 gerenciado pelo escalonamento, mas ainda precisa ser especificado.<\/p>\n<p><\/p>\n<p><strong>Porcentagem m\u00ednima saud\u00e1vel<\/strong> e <strong>Porcentagem m\u00e1xima<\/strong> \u2014 determinam o comportamento das tarefas durante a implanta\u00e7\u00e3o. Os valores padr\u00e3o 100 e 200 indicam que no momento da implanta\u00e7\u00e3o, o n\u00famero de tarefas aumentar\u00e1 duas vezes, e depois retornar\u00e1 ao desejado. Se voc\u00ea tiver 1 tarefa, min=0 e max=100, ela ser\u00e1 encerrada durante a implanta\u00e7\u00e3o e, em seguida, uma nova ser\u00e1 iniciada, o que resultar\u00e1 em inatividade. Se tiver 1 tarefa, min=50 e max=150, a implanta\u00e7\u00e3o n\u00e3o acontecer\u00e1, pois n\u00e3o \u00e9 poss\u00edvel dividir 1 tarefa ao meio ou aumentar em 1,5 vezes.<\/p>\n<p><\/p>\n<p><strong>Tipo de implanta\u00e7\u00e3o<\/strong> \u2014 deixamos Atualiza\u00e7\u00e3o progressiva.<\/p>\n<p><\/p>\n<p><strong>Templates de aloca\u00e7\u00e3o<\/strong> \u2014 regras para aloca\u00e7\u00e3o de tarefas nas m\u00e1quinas. O padr\u00e3o \u00e9 AZ Balanced Spread \u2014 isso significa que cada nova tarefa ser\u00e1 colocada em uma nova inst\u00e2ncia at\u00e9 que as m\u00e1quinas sejam iniciadas em todas as zonas de disponibilidade. Normalmente, fazemos BinPack \u2014 CPU e Spread \u2014 AZ; com essa pol\u00edtica, as tarefas s\u00e3o alocadas o mais compactamente poss\u00edvel em uma m\u00e1quina em termos de CPU. Se for necess\u00e1rio criar uma nova m\u00e1quina, ela ser\u00e1 criada em uma nova zona de disponibilidade.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/6430bdf046fc5b970e0afbbf0d9ef65e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Tipo de balanceador de carga<\/strong> \u2014 escolhemos Application Load Balancer.<\/p>\n<p><\/p>\n<p><strong>Fun\u00e7\u00e3o IAM do servi\u00e7o<\/strong> \u2014 escolhemos <code>ecsServiceRole<\/code>.<\/p>\n<p><\/p>\n<p><strong>Nome do balanceador de carga<\/strong> \u2014 escolhemos o balanceador criado anteriormente.<\/p>\n<p><\/p>\n<p><strong>Per\u00edodo de gra\u00e7a da verifica\u00e7\u00e3o de sa\u00fade<\/strong> \u2014 pausa antes de realizar as verifica\u00e7\u00f5es de funcionalidade ap\u00f3s a implanta\u00e7\u00e3o de uma nova tarefa, costumamos definir 60 segundos.<\/p>\n<p><\/p>\n<p><strong>Container para balanceamento de carga<\/strong> \u2014 na op\u00e7\u00e3o Nome do grupo-alvo, selecionamos o grupo criado anteriormente e tudo ser\u00e1 preenchido automaticamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/c067868ff73c25c3d9b65e02be64f5c9.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><strong>Escalonamento Autom\u00e1tico de Servi\u00e7os<\/strong> \u2014 par\u00e2metros de escalonamento do servi\u00e7o. Selecionamos Configurar Escalonamento Autom\u00e1tico de Servi\u00e7os para ajustar a contagem desejada do seu servi\u00e7o. Definimos a quantidade m\u00ednima e m\u00e1xima de tarefas durante o escalonamento.<\/p>\n<p><\/p>\n<p><strong>Fun\u00e7\u00e3o IAM para Escalonamento Autom\u00e1tico de Servi\u00e7os<\/strong> \u2014 escolhemos <code>AWSServiceRoleForApplicationAutoScaling_ECSService<\/code>.<\/p>\n<p><\/p>\n<p><strong>Pol\u00edticas de escalonamento autom\u00e1tico de tarefas<\/strong> \u2014 regras para escalonamento. Existem 2 tipos:<\/p>\n<p><\/p>\n<ol>\n<li><strong>Rastreamento de meta<\/strong> \u2014 rastreamento de m\u00e9tricas-alvo (uso de CPU\/RAM ou n\u00famero de solicita\u00e7\u00f5es por tarefa). Por exemplo, queremos que a carga m\u00e9dia do processador esteja em 85%; quando ela exceder, novas tarefas ser\u00e3o adicionadas at\u00e9 que atinja o valor alvo. Se a carga estiver abaixo, as tarefas ser\u00e3o removidas, a menos que a prote\u00e7\u00e3o contra escalonamento para baixo esteja ativada (<strong>Desativar escalonamento para baixo<\/strong>).<\/li>\n<li><strong>Escalonamento em etapas<\/strong> \u2014 rea\u00e7\u00e3o a um evento arbitr\u00e1rio. Aqui podemos configurar a rea\u00e7\u00e3o a qualquer evento (Alarme CloudWatch); quando ocorrer, podemos adicionar ou remover uma quantidade espec\u00edfica de tarefas ou indicar um n\u00famero exato de tarefas.<\/li>\n<\/ol>\n<p><\/p>\n<p>O servi\u00e7o pode ter v\u00e1rias regras de escalonamento, o que pode ser \u00fatil, desde que n\u00e3o entrem em conflito uns com os outros.<\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Conclus\u00e3o<\/h2>\n<p><\/p>\n<p>Se voc\u00ea seguiu as instru\u00e7\u00f5es e usou a mesma imagem do Docker, seu servi\u00e7o deve retornar essa p\u00e1gina.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS\" src=\"\/wp-content\/uploads\/2020\/07\/ac592e3194480ac8b347a3a1faf0cee0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<ol>\n<li>Criamos um modelo pelo qual todas as m\u00e1quinas no servi\u00e7o s\u00e3o iniciadas. Tamb\u00e9m aprendemos a atualizar as m\u00e1quinas ao alterar o modelo.<\/li>\n<li>Configuramos o tratamento do sinal de parada da inst\u00e2ncia spot, para que dentro de um minuto ap\u00f3s receb\u00ea-lo, todas as tarefas em execu\u00e7\u00e3o sejam removidas da m\u00e1quina, garantindo que nada seja perdido ou interrompido.<\/li>\n<li>Subimos um balanceador para distribuir uniformemente a carga entre as m\u00e1quinas.<\/li>\n<li>Criamos um servi\u00e7o que opera em inst\u00e2ncias spot, reduzindo assim os custos com m\u00e1quinas em cerca de 3 vezes.<\/li>\n<li>Configuramos o escalonamento autom\u00e1tico em ambas as dire\u00e7\u00f5es para lidar com aumentos de carga, mas ao mesmo tempo n\u00e3o pagar por inatividade.<\/li>\n<li>Usamos um Provedor de Capacidade para que o aplicativo gerencie a infraestrutura (m\u00e1quinas), e n\u00e3o o contr\u00e1rio.<\/li>\n<li>Estamos indo muito bem.<\/li>\n<\/ol>\n<p><\/p>\n<p>Se voc\u00ea tem picos de carga previs\u00edveis, por exemplo, ao fazer uma grande campanha de e-mail, pode configurar o escalonamento de acordo com <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.aws.amazon.com\/autoscaling\/application\/userguide\/application-auto-scaling-scheduled-scaling.html\">um cronograma<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Al\u00e9m disso, \u00e9 poss\u00edvel fazer escalonamento com base em dados de diferentes partes do seu sistema. Por exemplo, temos a funcionalidade <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.adapty.io\/promo-campaigns\">de envio de ofertas promocionais individuais<\/a><\/noindex> para usu\u00e1rios do aplicativo m\u00f3vel. \u00c0s vezes, a campanha \u00e9 enviada para mais de 1 milh\u00e3o de pessoas. Ap\u00f3s tal envio, sempre h\u00e1 um grande aumento nas solicita\u00e7\u00f5es ao API, pois muitos usu\u00e1rios acessam o aplicativo ao mesmo tempo. Portanto, se percebemos que h\u00e1 uma quantidade significativamente maior de promo\u00e7\u00f5es programadas para envio do que o padr\u00e3o, podemos rapidamente iniciar v\u00e1rias m\u00e1quinas e tarefas adicionais para nos prepararmos para a carga.<\/p>\n<p><\/p>\n<p>Ficarei feliz se voc\u00eas compartilharem casos interessantes de uso de inst\u00e2ncias spot e ECS ou alguma dica sobre escalonamento nos coment\u00e1rios.<\/p>\n<p><\/p>\n<p>Em breve, publicaremos artigos sobre como processamos milhares de eventos anal\u00edticos por segundo em uma pilha predominantemente serverless (com custos) e sobre como \u00e9 feito o deploy de servi\u00e7os com GitLab CI e Terraform Cloud.<\/p>\n<p><\/p>\n<p>Siga-nos, vai ser interessante!<\/p>\n<p class=\"for_users_only_msg\">Apenas usu\u00e1rios registrados podem participar da pesquisa. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Entre<\/a><\/noindex>, por favor.<\/p>\n<h2 class=\"default-block__polling-title\">Voc\u00ea utiliza inst\u00e2ncias spot em produ\u00e7\u00e3o?<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">22,2%<\/strong>Sim6<\/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>N\u00e3o18<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">11,1%<\/strong>Descobri sobre elas atrav\u00e9s de um artigo, e pretendo usar.<\/p>\n<\/li>\n<\/ul>\n<p>    Votaram 27 usu\u00e1rios. 5 usu\u00e1rios se abstiveram.<br \/>\n<br \/>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47 Cria\u00e7\u00e3o de uma API escal\u00e1vel em inst\u00e2ncias spot da AWS | ProHoster","description":"Ol\u00e1 a todos! Meu nome \u00e9 Kirill, sou CTO na Adapty.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/sozdanie-masshtabiruemogo-api-na-spotovyh-instansah-aws","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/87393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=87393"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/87393\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/87394"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=87393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=87393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=87393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}