Olá pessoal tudo bem? Bem vindos de volta a nossa jornada cloud. Hoje nós vamos falar sobre um dos serviços mais utilizados da AWS para exposição de aplicações. Bom, até o presente momento nós TCS com Fargate, TCS com C2, máquina TCS, Bastion Rose, SNS, SQS, S3, Lambda. Nós fizemos aí vários modelos, fizemos algumas formas de comunicação, gatilhos dentro das nossas Lambdas. Mas se parar para pensar, todos os serviços que a gente operou até agora foram serviços assíncronos. Ainda aquela POC que a gente fez ali mostrando o deploy de aplicações usando o ECR com o ECS, para task definitions e tudo mais, mas ainda não tivemos uma aplicabilidade prática para a exposição de aplicações ali das nossas APIs dentro da AWS. Então, hoje nós vamos falar sobre um dos serviços que nos garante muita flexibilidade e nos dá ali uma oportunidade de exposição das nossas aplicações dentro da AWS. Falando aqui do Amazon API Gateway esse aqui é um dos recursos mais usados da AWS e também mais incríveis de se usar porque ele é muito fácil de configurar e ele tem integração nativa com uma camada enorme de serviços da AWS. Bom, o que eu posso fazer aqui com o API Gateway? Eu posso expor desde APIs RESTful até APIs WebSocket. Então, ele tem a capacidade de, a partir de alguns cliques de configuração, expor para a gente as nossas aplicações na internet ou na nossa rede privada da forma como a gente mais requisitar tá bom vai depender aí muito do uso mas ele tem um grande suporte ele tem resiliência ele tem suporte a cache forma nativa inclusive tá bom então a nossa o o nosso apg ele é de fácil implantação ele é de fácil monitoração eu posso trabalhar de forma muito granular a partir da api eles tem aqui três tipos de apg que a gente pode usar tá são o websocket api regated no modelo a PayGate no modelo REST e a PayGate no modelo HTTP. Aí você vai falar, poxa, mas REST já não é HTTP? Sim, a AWS cobra mais barato pelo modelo HTTP, porque esse modelo tem menos recursos provisionados dentro do nosso gateway. Ele é mais manual, vamos dizer assim, para a gente se usar, tá? Para a gente fazer uso. Então, quando eu estou falando de API REST, é o API HTTP com mais recursos. Quando eu estou falando de API Gateway HTTP, é ele com a implementação do protocolo, mas com menos recursos ali, ou melhor dizendo, com recursos manualmente mais configuráveis, tá? Então é um pouquinho mais chato de chegar lá. E a gente vai expor ali, a gente consegue atrelar nosso DNS, eu posso atrelar isso na minha VPC, distribuir para os meus balanceadores, eu posso fazer várias formas de uso com o nosso API Gateway. E aí você está falando, poxa, isso talvez seja caro, né? Bom, não é na verdade nada caro. Então, lá no API Gateway, como a gente tem visto quase tudo na AWS, eu pago por milhão de requisições. na AWS eu pago por milhão de requisições e se você criou sua conta agora se você está aí usando o Free Tier né o as chamadas gratuitas o seu primeiro um milhão de chamadas aí ainda são de graça você não vai pagar nada pelo seu primeiro 1 milhão de chamada. Então, vamos pensar o seguinte. Primeiro os 300 milhões por mês, vamos falar um pouco de custo, a PHTTP. Um dólar por milhão, gente, é muito barato. Mais de 300 milhões de requisições chamadas de API, isso aqui é o preço de Norte Virginia. 90 centavos de dólar para cada milhão acima de 300 milhões então a peça aqui pra pei http quando vou lá na pele e criou a pri os primeiros 333 milhões preço por milhão três dólares e 50 porque ele é um pouquinho mais caro? porque ele tem mais recursos, posso só criar uma API HTTP ou eu posso vir aqui e criar uma API REST dentro do API Gateway e ele vai ter bem mais recursos para que a gente possa validar também pago pelo cache, se eu habilitar o armazenamento em cash, eu pago por giga, então meio giga, dois centavos de dólar por meio giga. 1,6, 0,38, 0,38 centavos de dólar. E assim vai vai indo aqui tem uma tabela de preço bem legal a pay web socket ele paga por milhão aqui primeiro um bilhão ele vai pagar um dólar por cada milhão de requisições mais de um milhão e oitenta centavos de dólar tá bom minutos de conexão vou pagar 25 centavos de dólar por milhão de minutos de conexão. Então é uma forma muito simples de estar expondo aplicações, mas vamos focar nesse API REST aqui. Ele tem mais recursos de integração. Então, vou dar um exemplo. A gente tem aqui um API GATING que se comunica com um NLB. A gente ainda vai falar um pouco dos balanceadores em algum momento. E ele se comunica, esse NLB ele distribui para uma aplicação no ECS que está exposta numa máquina do EC2. Claro que o custo nesse caso, ele vai ter uma cobrança adicional, não pelo gate, e o gate continua com o preço dele, mas eu estou provisionando outros recursos atrás do gate, então eu estou passando ali o API gate e recebendo a requisição na internet, ele vai direcionar para um NLB, esse NLB vai distribuir para uma TESC no ICS, então eu vou pagar o NLB, vou pagar a TESC lá no ICS, que é a cobrança dos outros serviços que eu estou usando. Então, ele acaba encadinhando um pouco o custo, mas como no Gateway eu pago por milhão, lá eu vou pagar por máquina. Eu posso fazer também diretamente numa Lambda, tá? E o balanceamento dessa carga acaba ficando a caso da própria AWS. Então, quando eu pego meu API Gateway e jogo pra uma Lambda, a Lambda eu pago por milhão de requisições e por uso de memória, assim como o API Gateway eu pago por milhão de requisição, né? Lá dentro, caso eu estiver usando o cache também, o uso de armazenamento em cache. Então, ele tem ali uma integração, e se eu passar desse um milhão de requisições, eu vou pagar aqui o próximo milhão dentro do API Gateway, e também vou pagar ali aquele próximo milhão dentro do Lambda, que ele vai estar executando para mim. Então, mesmo que eu use, porque tem duas formas de uso aqui do API Gateway, eu posso usar o API Gateway no modelo regional, exposto na internet, exponho ele numa região, ele tem que me dar um link pra que eu possa consumir, ou eu tenho a capacidade de usando outros serviços da AWS, tá? C, criar um DNS meu e atrelar ali o meu gateway, o meu DNS, tá bom? Ou eu posso usar ele como privado, ou seja, ele só existe ali dentro da minha conta, dentro do meu contexto operacional eu não pago por requisições da privada tá bom objetivamente mas eu pago ali por coisas que ela usa como vpc endpoint coisas ali dentro que trafegam esses dados dentro da aws tá então Então, vamos entrar aqui no nosso DrawIO e vamos fazer um diagraminha aqui de um teste, tá bom? Para a gente começar a brincar. Eu quero fazer o seguinte, eu quero criar um API Gateway. api gateway eu vou criar aqui um api gateway ae amazon api gateway e eu vou criar uma lambda vou criar aqui uma lambda eu criar aqui uma lambda eu quero que meu gateway se comunique com a minha lambda em uma interface http e ele devolva pra mim a requisição então nosso desenho vai ficar mais ou menos isso aqui. Deixa eu ver se eu tenho aqui um símbolo de web, vou colocar aqui um navegadorzinho. Então, o que eu vou fazer? Eu vou vir via internet no navegador, no meu gateway, vou chamar a minha lambda e vou ter a minha aquisição devolvida aqui com um response no modelo http. Então, nosso desenho inicial é esse no API Gaten e aqui a primeira coisa é qual que é o tipo de API que eu vou criar lembrando eu posso criar http, eu tenho os mesmos as mesmas interfaces aqui, eu posso falar com lambda, backends, http, tá bom? API WebSoft, API REST, tá? E API REST privada, tá bom? Então, eu posso colocar isso aqui, por exemplo, dentro de uma VPC. Então, o que eu vou fazer aqui agora eu vou criar uma penrest então você clica aqui em compilar eu poderia importar openipi eu poderia pegar ali um contrato pré-definido importar aqui dentro pra mim mas eu vou compilar a gente vai criar na mão tá bom existem outras formas de criar com a WSLi, com o próprio CloudFormation, tá bom? Que a gente poderia estar provisionando já os contratos, as rotas aqui dentro. Mas isso eu acho que é um assunto um pouco mais elevado e a gente vai estar tratando em um segundo momento, tá bom? Hoje a gente vai criar aqui via console, porque eu acho que é o caminho mais simples, porque criando via console, fica fácil você saber o que você teria que fazer se você tivesse usando um template do terraform por tá então vou criar aqui uma função vou criar do zero vou chamar de testgator vou usar aqui o python pra essa função arquitetura x vou colocar aqui usar a minha função aquela função existente lambda test role vou jogar aqui dentro vou criar a função está aqui, criei a minha função, ele diferente do java, como faz mais levinho, é mais um texto, mais textual, vamos dizer, eu posso já editar por aqui mesmo, então vou colocar que eu já tenho vou fazer o deploy do meu código aqui atualizado e é isso, já tenho a minha função criada, pode notar não tem nenhum gatilho, não tem nada então já criei a minha função vamos voltar aqui para o nosso gateway agora clique em testgator não vou colocar aqui nenhuma descrição, mas eu poderia e aí eu posso colocar aqui como regional privado, vou usar como regional porque eu quero que isso receba requisições da internet criei minha API bem simples, API criada já tenho aqui um caminho que é a raiz só que esse gate ainda não está publicado primeira coisa que eu vou fazer aqui então vou criar um recurso aqui tem um recurso é uma rota. Vou chamar aqui de custo. Porque depois nós vamos fazer alguns cadastros, vamos fazer algum reuso com outros temas aqui dentro. Vou criar aqui o recurso custo. Criei o recurso. Uma vez que eu cheguei aqui no meu recurso, eu clico nele e eu venho aqui para criar o método. É basicamente qual verbo ele vai estar atendendo. Eu vou falar que ele é um GET, então o verbo GET. Pode olhar aqui, eu tenho várias integrações que eu posso estar fazendo. Posso fazer integração da TTP, posso mocar alguma coisa, posso escolher serviços da AWS, isso aqui é muito interessante. Então, por exemplo, se você não tem necessidade de um contraporte e você quer uma resposta muito assíncrona e mais padronizada, você pode fazer isso também. Você, em vez de pegar com a requisição e apontar para uma lambda onde você vai fazer um processamento e você depende de um movimento mais síncrono para devolver essa resposta, você poderia vir aqui e clicar em serviços AWS e você poderia pôr o seu SQS aqui dentro. Então ele receberia da internet uma requisição, pegaria aquele payload, colocaria dentro do SQS como objeto em fila, já responderia um OK, e você seguiria o teu processamento todo assíncrono por trás. Então, eu posso fazer isso no SQS, eu posso fazer isso com o SNS, então eu posso integrar meu APGate com vários serviços da AWS, tá? E eu vou pagar exatamente o mesmo preço. Se eu estiver integrando com o HTTP, com o endpoint, lá num balanceador, num malandro, num serviço AWS, por parte do Gateway, eu pago o mesmo milhão de requisição, ele é me cobrando por milhão de requisição, a integração ela é contida nisso, ele não está me cobrando por integração, claro que o item da integração, dependendo do que foi provisionado, ele vai me cobrar lá por causa do item que eu provisionei, mas não por causa da integração em si, então eu poderia me servir aqui de vários serviços. Eu vou até dar um exemplo para vocês. Eu escolheria aqui a região. E qual serviço? Olha só, eu poderia jogar aqui no Amazon MQ, poderia jogar em tantos serviços da AWS, tá vendo? E ele já estaria bem pronto para mim, tá? Então, eu posso jogar de forma muito simples, posso usar ele como proxy para redirecionar para uma outra aplicação, então é bem interessante, é bem explorável isso aqui para o serviço AWS. Vamos de função Lambda. Qual que é a minha função? Test Gateway. Aqui. Eu posso colocar um tempo limite, ou seja, o meu timeout. Padrão é 29 segundos, não vou mexer. Mas, gente, 29 segundos não é um tempo seguro para aplicações web, tá bom? Então, quando eu estou falando de aplicações síncronas, que tem ali a dependência de resposta, quanto mais rápido eu responder, melhor, eu deixo aquela conexão fechada, eu estou menos aberto a ataques, tá? Então, eu vou manter aqui o padrão, mas dentro dos objetivos da sua empresa, entre os requisitos, quando você for fazer o uso aqui, consequentemente, fechando também o tempo de execução para determinados ataques. Eu poderia, na solicitação, eu poderia colocar um autorizador, então vamos pensar que você está em um modelo STS, a gente não vai fazer isso aqui agora, mas vamos imaginar que você tem uma Lambda, uma outra aplicação, tem que validar os tokens da sua aplicação, aqui dentro é o que você colocaria ali a sua autorização, você poderia fazer consulta, poderia fazer várias coisas ali dentro, você estaria configurando o autorizador, então poderia usar aqui um Lambda Authorizer, tem formas da gente configurar vários modelos de autorização. Não precisa, se você quiser configurar depois. Quando você está criando um método, aqui você pode até não encontrar todas as opções, tá? Ou não se encontrar direito, mas fica tranquilo, porque quando você cria o método, ele é editável. Então, eu posso editar o meu método, incluir coisas, tirar coisas ali um pouco à vontade. Parâmetros de string, vou colocar uma carry de string aqui. Vou colocar aqui um name, que é o que eu quero pesquisar lá dentro. Eu posso determinar ele como obrigatório ou não, então o gateway também tem uma determinada validação, tá, pra mim. E eu posso determinar se eu quero cache disso ou não, tá bom? Cabeçalhos eu posso adicionar meus headers, posso adicionar um modelo de body, tá bom? Para o meu método eu não vou fazer nada disso neste momento. Vou simplesmente criar o meu método. Tá bom? Pode olhar aqui. Método criado, tá vendo? Solicitação de integração aqui, ó. Já apareceu a integração com o Lambda. Não é obrigatório. Não tenho campos obrigatórios. Não estou validando o HTTP. Ele é bem simples. Está aqui a Lambda. Parâmetro mapeado. Tudo certinho. Integração do proxy Lambda. Tempo limite. Resposta de integração. Eu posso colocar aqui várias outras coisas resposta do método posso testar inclusive já posso estar ali a minha integração bom inclusive testar vou jogar aqui o parâmetro teste vamos ver se eu consigo chegar lá. Opa! Olha só. Vamos ver se está certinho essa resposta. Se veio da minha lambda. Vamos olhar nosso código. Está aqui. Se ele não vem do proxy. Olha só. Essa função deve ser chamada via proxy do OpenGateway. Olha aqui. Proxy. Certinho. O que é isso? O que é o proxy, pessoal? Ele pode repassar tanto a sua requisição na íntegra, tá bom? E ele simplesmente vai pegar da internet, que está vindo jogar dentro do seu Lambda, como ele pode também colocar ali dentro um proxy, encapsular isso para você, dentro de um modelo onde ele vai colocar os objetos ali, qual é o verbo é esse, qual é o contexto é esse, quais são as fair strings, são essas, para você ter isso tudo dentro de um objeto serializável dentro da sua aplicação de da sua lâmpada, tá bom? E como que eu faço isso? Como que eu edito para que a minha integração possa ir via proxy para a minha lâmpada? Bom, você pega aqui no seu recurso que você criou, você vem aqui, ó, solicitação de integração, vem no editar, tá bom? Então, o que você vai fazer aqui dentro disso? É só clicar aqui dentro, ó, aqui, essa flezinha, integração do proxy Lambda, tá bom? Não muda nada, poderia colocar aqui cache, não adicionar, não vou mudar nada do que eu tenho ali, tá bom? colocar aqui cache, não adicionar não vou mudar nada do que eu tenho ali, tá bom? salvei, ó, já está via proxy, vamos testar deixa eu colocar aqui agora é igual a teste teste opa! olha o corpo da resposta aqui, olá teste, vamos ver se é isso que ele deveria então vamos lá. Passou do código do proxy. Pega o carry string. Se for aqui dentro do getCustomer. Olá, name. É isso que ele vai me devolver como body, tá bom? Então, exatamente isso que ele deveria devolver para mim neste momento, de forma bem simples. Aí você vai falar, poxa, e essa aplicação já está publicada? Já conseguiria, por exemplo, chamar na internet? Não, não conseguiria ainda. Por quê? Porque tudo que eu criei, toda essa integração, tudo que a gente testou aqui neste momento, ainda está dentro da AWS, não está nada exposto. Para eu poder pegar um gateway e colocar na internet, eu preciso implantar. Então, criei minhas rotas, criei meus recursos, eu poderia aqui, por exemplo, colocar autorizadores, falar que os autorizadores do método estão todos lá, todos aqui. Como a gente não vai trabalhar um pouco esse pedaço, vou já implantar a minha API. Primeira coisa que eu vou definir é o meu estágio, tá bom? Então, eu vou criar um novo estágio. O que é isso aqui? É um path dentro da minha url para que eu possa separação semântica é bom vamos imaginar que sua corporação uma empresa pequena ela não tem aí três contas da wf é um pouco arriscado da pessoa precisa de um que eu falo que precisaria de uma separação semântica muito grande vamos dizer que ela tem ali só uma conta onde ela roda os ambientes segregados em vpc ou de alguma forma o subnet da viola um pronte então se eu quisesse testar em deve ter um estágio de deve se eu quisesse colocar em uma logação que o canhão estágio de dev, se eu quisesse colocar em homologação, eu colocaria tudo em um estágio de homologação, se eu quisesse colocar essa aplicação num stage de produção, eu mandaria pra produção. Então, ele separaria semanticamente ali, por path dentro do meu gateway, tá bom? Ele coloca um pathzinho antes da sua aplicação, poderia inclusive versionar depois, poderia ajustar o estágio por versão, mas aí seria uma separação lógica, inclusive não é algo controlado pela AWS, é controlado por você, cliente. Bom, é isso, o ideal seria que tivesse contas apartadas, mas a AWS te garante que caso você esteja na mesma conta você consiga servir de tudo que você tem necessidade ali dentro inclusive publicações em estágios diferentes poderia fazer uma alteração no gateway e publicar em dev mas não publicar em homologação e produção para poder testar vou chamar de dev o meu estágio aqui. Vou implantar. Agora eu tenho essa aplicação na internet. Aqui você vai ver o estágio, você vai abrindo aqui, ele tem o recurso. Esse recurso ele já tem uma URL, tá vendo? Vamos pegar essa URL. Vou chamar do próprio navegador. Para ver se a gente colocou. Então vou colocar aqui. Nem. Teste. Navegador. Vamos ver se ele chega lá. Olha aqui. Olá.á teste navegador vamos colocar aqui um outro nome só para ver se ele está batendo lá mesmo olá Minadab bateu você notou que aqui em questão de minutos de forma muito rápida eu criei uma Lambda HTTP que iria receber as minhas requisições, eu criei um API Gateway, eu fiz uma integração para o meu API Gateway com essa Lambda e eu já estou exposto na internet, tá bom? Um recurso interessante que a gente tem na AWS, que eu poderia também fazer uso dentro disso, é o Route 53. Tá bom? Então, vamos dizer que agora você tem teu gating, mas você não quer usar aqui o DNS da AWS. Você não quer usar isso aqui. você pode vir aqui e você criar o seu domínio, registrar o seu domínio, tá bom? E falar se esse domínio vai apontar para o seu gate, ele vai fazer um execute API lá dentro, tá? Se você notar aqui, você está requisitando uma API da AWS Que é na sua região Execute a API na região Amazon Aqui e aqui com o resto da tua URL Mas o interessante é isso aqui Se você notar, ele forma uma URL Com o ID do seu gateway Seu gateway Todo gateway que você criar Ele vai ter um ID único Por isso que é muito importante Que dentro do teu ecossistema você preste atenção nisso. Olha o seu ID aqui, tá vendo o que ele gera? Ele está visitando, ó, ID, Execute API e o resto da rota aqui dentro de determinada região. Então, ele está buscando dessa forma. Se você quiser criar um DNS, você pode atrelar esse gate e chamar também via internet lembrando que para isso o route53 você pode criar dns internos inclusive tá bom mas você vai pagar tá bom o recurso que você vai pagar é por zona hospedada 50 centavos por zona hospedada por mês nas primeiras 25 zonas hospedadas depois 10 centavos por zona hospedada consulta e roteamento ele tem um custo também ele vai ter um custo aí pra você poder registrar o seu domínio, que é o preço do domínio. Então, você pode fazer isso. Você não precisa usar o DNS que a AWS devolveu para você no seu gateway regional. Até porque você poderia até não entregar isso para um cliente. até não entregar isso para um cliente, o ideal seria que o teu DNS representasse a sua marca e não a marca da AWS. Aquele dele não representa nada para a minha API. Ela representa para a AWS. Então, eu poderia fazer, ou poderia importar também os meus domínios. Apenas para você entender que tudo que você precisar de domínios, de solicitaçõesções estão aqui. No Alt 53 você pode solicitar, você pode registrar domínios, você pode hospedar aqui as suas zonas, você pode criar domínios internos para você chamar, inclusive na internet também. Então é muito disso, use o seu APIg e faça bastante testes com ele é lembrando que se eu fizer aqui dentro de recurso criar um novo recurso eu não publicar não implantar esse não vai estar visível ainda mas a partir do momento que eu implanto esse recurso tá bom ele já vai estar automaticamente disponível na internet para o pessoal então esse é o api é uma coisa que vai usar durante muito tempo você vai fazer um uso muito grande disso dentro das suas aplicações porque é uma ferramenta barata, é uma ferramenta escalável. Em comunicação com Lambda, eu estou pagando diferente de quando eu coloco lá, como eu disse, se eu coloco lá numa máquina C2, que eu pago por segundo a máquina, se eu coloco ali no Fargate, que eu pago por segundo de uso, a partir de uso de memória inclusive também, pelo que eu estou provisionando aqui, se eu fizer com o Lambda, eu estou pagando por milhões de requisições. Bom, mas um andado importante para que você não caia em algumas armadilhas disso. Se você estiver usando no modelo VPC, atrelando sua Lambda subnet, se você estiver atrelando sua Lambda, sua rede privada, lembrando que cada vez que a execução concorrente da Lambda, ela vai estar fazendo recursos de rede, tá bom? Então, se eu tiver uma requisição muito grande dentro disso aqui, eu posso acabar tendo problema de disponibilidade. Então, vai ser com parcimônio, vai ser muito do modelo de uso. Se você está publicando isso em um AVPC, se não, se você está usando um IP da AWS, um da sua AVPC. está usando um IP da AWS ou da sua VPC, tá bom? Então, dependendo do uso aí, você ter muita execução concorrente pode começar a dar problema de trocling nesse modelo que a gente desenhou aqui, ok? Então, pessoal, é isso. Por enquanto é isso do API Gateway. Nós vamos fazer outros testes, vamos explorar outras formas de uso para isso e já já a gente traz um pouco mais de novidades para vocês. Por enquanto é isso, obrigado e boa sorte.