{"id":4990,"date":"2025-02-21T10:29:12","date_gmt":"2025-02-21T13:29:12","guid":{"rendered":"https:\/\/geekblogti.wpengine.com\/?p=4990"},"modified":"2025-03-06T10:16:00","modified_gmt":"2025-03-06T13:16:00","slug":"aplicacao-serverless-com-aws-como-desenvolver-uma-do-0","status":"publish","type":"post","link":"https:\/\/www.geekhunter.com/pt/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/","title":{"rendered":"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?"},"content":{"rendered":"\r\n<p class=\"wp-block-paragraph\">Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es <strong>serverless<\/strong>, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um &#8220;YouTube&#8221; sem configurar nenhum servidor?<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No artigo de hoje, vamos aprender como desenvolver uma aplica\u00e7\u00e3o serverless do 0 utilizando servi\u00e7os da <strong>AWS<\/strong> e o <a href=\"https:\/\/serverless.com\/\"><strong>Serverless Framework<\/strong><\/a>. Com esse conhecimento, voc\u00ea ser\u00e1 capaz de come\u00e7ar o seu pr\u00f3prio projeto e tirar vantagem dessa arquitetura que tem ficado cada vez mais popular entre as principais empresas do mundo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Vamos l\u00e1?<\/p>\r\n\r\n\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">ServerlessTube: o seu &#8220;YouTube&#8221; sem servidores!<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para aprendermos na pr\u00e1tica a criar uma aplica\u00e7\u00e3o serverless do 0, vamos desenvolver um &#8220;tipo de YouTube&#8221;, onde usu\u00e1rios v\u00e3o conseguir fazer upload, assistir e remover v\u00eddeos. Tudo isso sem termos que configurar se quer um servidor.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Esse ser\u00e1 o resultado final:<\/strong><\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img fetchpriority=\"high\" decoding=\"async\" width=\"646\" height=\"458\" class=\"wp-image-4991\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/serverless-aws.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/serverless-aws.png 646w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/serverless-aws-150x106.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/serverless-aws-100x71.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/serverless-aws-600x425.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/serverless-aws-450x319.png 450w\" sizes=\"(max-width: 646px) 100vw, 646px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Vamos come\u00e7ar a colocar a m\u00e3o na massa?<\/strong><\/p>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Amazon Web Services: o nosso provedor de computa\u00e7\u00e3o em nuvem<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Apesar de n\u00e3o precisarmos configurar servidores quando desenvolvemos uma aplica\u00e7\u00e3o serverless, n\u00f3s ainda precisamos de um ambiente para executar o nosso c\u00f3digo. \u00c9 ai que entram os provedores de <em>Function-as-a-Service (FaaS)<\/em>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><em>FaaS<\/em> s\u00e3o basicamente servi\u00e7os que executam o seu c\u00f3digo sem que voc\u00ea precise se preocupar com o como ele ser\u00e1 executado. Toda a parte de configura\u00e7\u00e3o de servidores e ambientes \u00e9 abstra\u00edda, fazendo com que voc\u00ea possa focar em apenas desenvolver a sua aplica\u00e7\u00e3o.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No nosso caso, vamos utilizar o <em>FaaS<\/em> da Amazon Web Services (AWS) chamado <strong>Lambda<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A AWS \u00e9 a l\u00edder no mercado de nuvens p\u00fablicas e foi a primeira a disponibilizar um <em>FaaS<\/em> em larga escala. Desde o <strong><a href=\"https:\/\/www.youtube.com\/watch?v=9eHoyUVo-yg\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"an\u00fancio do Lambda na re:Invent de 2014 (abre numa nova aba)\">an\u00fancio do Lambda na re:Invent de 2014<\/a><\/strong>, mais e mais empresas no mundo todo est\u00e3o usando o servi\u00e7o para os mais diversos fins.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para ter acesso ao Lambda, precisamos de uma conta na AWS. Caso voc\u00ea n\u00e3o tenha uma, n\u00e3o se preocupe, voc\u00ea pode <a href=\"https:\/\/aws.amazon.com\/pt\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"criar uma conta gratuita na AWS (abre numa nova aba)\"><strong>criar uma conta gratuita na AWS<\/strong><\/a>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Uma vez que voc\u00ea tiver feito login na sua conta, n\u00f3s vamos precisar criar uma chave de acesso. Chaves de acesso s\u00e3o utilizadas para autenticar chamadas para a API da AWS, garantindo que apenas usu\u00e1rios autorizados possam fazer altera\u00e7\u00f5es na sua conta.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para criar a sua chave de acesso, voc\u00ea vai precisar acessar o servi\u00e7o <strong>Identity and Access Management<\/strong> (IAM). O IAM \u00e9 respons\u00e1vel por gerenciar os usu\u00e1rios da sua conta e decidir quem tem acesso ao que.<br \/>Caso seja a sua primeira vez utilizando a AWS, todos os servi\u00e7os podem ser acessados atrav\u00e9s da barra de pesquisa <strong>Localizar servi\u00e7os<\/strong>. Basta digitar &#8220;IAM&#8221; e o servi\u00e7o deve aparecer em primeiro na lista.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"635\" height=\"215\" class=\"wp-image-4992\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws.png 635w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws-150x51.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws-100x34.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws-600x203.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/console-de-gerenciamento-aws-450x152.png 450w\" sizes=\"(max-width: 635px) 100vw, 635px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Na AWS, toda chave de acesso \u00e9 associada a um usu\u00e1rio, ent\u00e3o vamos precisar criar um usu\u00e1rio novo para o nosso projeto. Para criar usu\u00e1rios, clique em <strong>Usu\u00e1rios<\/strong> no menu esquerdo do IAM e depois em <strong>Adicionar usu\u00e1rio<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nosso usu\u00e1rio s\u00f3 vai precisar de acesso program\u00e1tico, ent\u00e3o voc\u00ea pode selecionar apenas essa op\u00e7\u00e3o, como na imagem abaixo. Agora clique em <strong>Pr\u00f3ximo: Permiss\u00f5es<\/strong>.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img decoding=\"async\" width=\"658\" height=\"359\" class=\"wp-image-4994\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless.png 658w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless-150x82.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless-100x55.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless-600x327.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aws-aplicacao-serverless-450x246.png 450w\" sizes=\"(max-width: 658px) 100vw, 658px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Todo usu\u00e1rio na AWS possui um conjunto de permiss\u00f5es que dizem o que ele pode ou n\u00e3o fazer na plataforma. A AWS oferece uma s\u00e9rie de pol\u00edticas prontas que voc\u00ea pode utilizar, no entanto, \u00e9 sempre uma boa pr\u00e1tica limitar as permiss\u00f5es de um usu\u00e1rio para apenas aquilo que ele realmente precisa.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para criar a nossa pol\u00edtica de permiss\u00f5es, voc\u00ea pode clicar em <strong>Anexar pol\u00edticas existentes de forma direta<\/strong> e depois no bot\u00e3o <strong>Criar pol\u00edtica<\/strong>. Uma nova aba vai ser aberta no seu browser com duas op\u00e7\u00f5es: Editor visual e JSON.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Clique na op\u00e7\u00e3o <strong>JSON<\/strong> e substitua o exemplo no editor de texto pela pol\u00edtica abaixo:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"645\" height=\"395\" class=\"wp-image-4997\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/politica-aws-serverless.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aws-serverless.png 645w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aws-serverless-150x92.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aws-serverless-100x61.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aws-serverless-600x367.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aws-serverless-450x276.png 450w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/figure>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><strong>{<br \/> \u00a0\u00a0\u00a0\"Version\": \"2012-10-17\",<br \/> \u00a0\u00a0\u00a0\"Statement\": [<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Effect\": \"Allow\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Action\": [<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"apigateway:*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"cloudformation:*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:CreateRole\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:DeleteRole\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:DeleteRolePolicy\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:GetRole\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:PassRole\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"iam:PutRolePolicy\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"lambda:*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"logs:*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"s3:*\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Resource\": \"*\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0]<br \/>}<\/strong><br \/> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora clique em Revisar pol\u00edtica, d\u00ea um nome para a sua pol\u00edtica na pr\u00f3xima p\u00e1gina ( <em>serverlesstube<\/em>, por exemplo) e clique em Criar pol\u00edtica. Depois que a pol\u00edtica for criada, volte para a aba do browser onde voc\u00ea estava criando o usu\u00e1rio e clique no bot\u00e3o para atualizar a lista de pol\u00edticas dispon\u00edveis.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"622\" height=\"115\" class=\"wp-image-4998\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws.png 622w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws-150x28.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws-100x18.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws-600x111.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/politica-aplicacao-serverless-aws-450x83.png 450w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora digite o nome da pol\u00edtica no campo de busca e selecione ela como na imagem acima. Feito isso, voc\u00ea pode clicar em pr\u00f3ximo at\u00e9 ver o bot\u00e3o <strong>Criar Usu\u00e1rio<\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Uma vez que o seu usu\u00e1rio estiver criado, a AWS vai te mostrar a chave de acesso que foi criada. Ela vai ser composta por um ID e por um segredo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Copie esses dois valores em algum lugar ou baixe o arquivo .csv. Vamos precisar desses valores daqui a pouco.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"297\" class=\"wp-image-4999\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws.png 647w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws-150x69.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws-100x46.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws-600x275.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/como-criar-aplicacao-serverless-aws-450x207.png 450w\" sizes=\"(max-width: 647px) 100vw, 647px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora que voc\u00ea tem a sua chave de acesso, podemos partir para a pr\u00f3xima etapa: <strong>instalar o Serverless Framework<\/strong>.<\/p>\r\n\r\n\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Serverless Framework<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Um dos objetivos do Serverless Framework \u00e9 facilitar a cria\u00e7\u00e3o de aplica\u00e7\u00f5es utilizando o Lambda e outros servi\u00e7os da AWS. Com ele, voc\u00ea consegue construir a sua aplica\u00e7\u00e3o de forma mais r\u00e1pida e f\u00e1cil, al\u00e9m de incorporar algumas melhores pr\u00e1ticas sem nenhum esfor\u00e7o extra.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para instalar o framework, voc\u00ea vai precisar ter Node.js v6.5.0 ou mais recente instalado na sua m\u00e1quina. Caso voc\u00ea precise instalar, os pacotes de instala\u00e7\u00e3o podem ser baixados aqui: <strong><a href=\"https:\/\/nodejs.org\/en\/download\/\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Pacote de instala\u00e7\u00e3o Node.js (abre numa nova aba)\">Pacote de instala\u00e7\u00e3o Node.js<\/a><\/strong>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Quando voc\u00ea tiver com o Node.js instalado, basta executar esse comando:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <strong>npm install -g serverless<\/strong><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Assim que o processo de instala\u00e7\u00e3o terminar, \u00e9 hora de configurar sua chave de acesso para que possamos come\u00e7ar a criar recursos na AWS.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A configura\u00e7\u00e3o pode ser feita atrav\u00e9s do comando abaixo, substituindo \u200b<strong>&lt;ID_DA_CHAVE_DE_ACESSO&gt;<\/strong>\u200b e <strong>&lt;CHAVE_DE_ACESSO_SECRETA&gt;<\/strong>\u200b pelos valores que voc\u00ea copiou na se\u00e7\u00e3o anterior.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <br \/><strong>serverless config credentials --provider aws --key &lt;ID_DA_CHAVE_DE_ACESSO&gt; --secret &lt;CHAVE_DE_ACESSO_SECRETA&gt;<\/strong><br \/> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Pronto, agora que voc\u00ea est\u00e1 com o Serverless Framework configurado, \u00e9 hora de criar o c\u00f3digo do ServerlessTube!<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Hora de assistir o primeiro v\u00eddeo no seu ServerlessTube!<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Antes de come\u00e7armos a criar c\u00f3digo, \u00e9 importante entender qual \u00e9 a arquitetura do nosso projeto. A imagem abaixo mostra os servi\u00e7os da AWS envolvidos e o fluxo de dados da aplica\u00e7\u00e3o:<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"364\" class=\"wp-image-5004\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/servicos-aws.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servicos-aws.png 730w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servicos-aws-150x75.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servicos-aws-100x50.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servicos-aws-600x299.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servicos-aws-450x224.png 450w\" sizes=\"(max-width: 730px) 100vw, 730px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\"><strong>Existem tr\u00eas fluxos b\u00e1sicos:<\/strong><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li><strong>Upload de um v\u00eddeo: <\/strong>O usu\u00e1rio faz o upload pela interface web e o v\u00eddeo \u00e9 salvo diretamente no <strong>Servi\u00e7o S3<\/strong>;<\/li>\r\n<li><strong>Listar v\u00eddeos dispon\u00edveis:<\/strong> A interface web manda uma requisi\u00e7\u00e3o de listagem para o servi\u00e7o <strong>API Gateway<\/strong> e a requisi\u00e7\u00e3o \u00e9 enviada para a fun\u00e7\u00e3o <em>List <\/em>no Lambda. Essa fun\u00e7\u00e3o vai buscar todos os v\u00eddeos dispon\u00edveis no S3 e retornar uma lista;<\/li>\r\n<li><strong>Remover um v\u00eddeo:<\/strong> A interface web manda uma requisi\u00e7\u00e3o de remo\u00e7\u00e3o de um v\u00eddeo para o servi\u00e7o API Gateway e a requisi\u00e7\u00e3o \u00e9 enviada para a fun\u00e7\u00e3o <em>Delete <\/em>no Lambda. Essa fun\u00e7\u00e3o vai remover o v\u00eddeo do S3.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora que voc\u00ea tem um ideia de como a aplica\u00e7\u00e3o vai funcionar, vamos come\u00e7ar a criar o c\u00f3digo do nosso projeto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">A primeira coisa \u00e9 criar um novo diret\u00f3rio onde voc\u00ea vai salvar todos os arquivos do projeto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com o diret\u00f3rio criado, vamos come\u00e7ar criando o arquivo <strong>serverless.yml<\/strong>. Esse arquivo \u00e9 utilizado pelo Serverless Framework para saber quais recursos precisam ser criados na AWS e como esses recursos se comunicam.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No nosso caso, precisamos traduzir a arquitetura da imagem acima para o formato que o framework consegue entender. Dessa forma, n\u00e3o vamos precisar fazer nada manualmente pelo console da AWS, tudo ser\u00e1 criado de forma automatizada com apenas um comando.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O c\u00f3digo abaixo descreve todos os elementos da nossa aplica\u00e7\u00e3o. Basta salv\u00e1-lo no diret\u00f3rio do seu projeto com o nome serverless.yml, substituindo <strong>&lt;NOME_DO_SEU_BUCKET&gt;<\/strong> por algum nome \u00fanico, por exemplo, <strong>serverlesstube-COLOQUE_O_SEU_NOME_AQUI<\/strong>.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <br \/><strong>service: serverlesstube<br \/><br \/>frameworkVersion: \"&gt;=1.1.0\"<br \/><br \/>custom:<br \/> \u00a0bucket: &lt;NOME_DO_SEU_BUCKET&gt;<br \/><br \/>provider:<br \/> \u00a0name: aws<br \/> \u00a0runtime: nodejs8.10<br \/> \u00a0stage: dev<br \/> \u00a0region: us-east-1<br \/> \u00a0iamRoleStatements:<br \/> \u00a0\u00a0\u00a0- Effect: Allow<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Action:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- s3:*<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Resource:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- arn:aws:s3:::${self:custom.bucket}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0- arn:aws:s3:::${self:custom.bucket}\/*<br \/><br \/>functions:<br \/> \u00a0list:<br \/> \u00a0\u00a0\u00a0handler: serverlesstube.list<br \/> \u00a0\u00a0\u00a0events:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0- http:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0path: video<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0method: get<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cors: true<br \/> \u00a0\u00a0\u00a0environment:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0BUCKET: ${self:custom.bucket}<br \/> \u00a0delete:<br \/> \u00a0\u00a0\u00a0handler: serverlesstube.delete<br \/> \u00a0\u00a0\u00a0events:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0- http:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0path: video\/{id}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0method: delete<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cors: true<br \/> \u00a0\u00a0\u00a0environment:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0BUCKET: ${self:custom.bucket}<br \/><br \/>resources:<br \/> \u00a0Resources:<br \/> \u00a0\u00a0\u00a0s3Bucket:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Type: AWS::S3::Bucket<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Properties:<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BucketName: ${self:custom.bucket}<\/strong><br \/> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora que definimos a infraestrutura da nossa aplica\u00e7\u00e3o, precisamos criar o c\u00f3digo das fun\u00e7\u00f5es Lambda que v\u00e3o lidar com as chamadas da nossa interface web para listar e remover v\u00eddeos.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O c\u00f3digo abaixo exp\u00f5e duas fun\u00e7\u00f5es que v\u00e3o ser utilizadas pelo Lambda: <em>list<\/em> para fornecer a lista de v\u00eddeos dispon\u00edveis e <em>delete<\/em> para remover v\u00eddeos. Salve esse c\u00f3digo no diret\u00f3rio do seu projeto em um arquivo chamado <strong>serverlesstube.js.<\/strong><\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <br \/><strong>const AWS = require(\"aws-sdk\");<br \/>const s3 = new AWS.S3();<br \/><br \/>exports.list = async event =&gt; {<br \/> \u00a0var response = {<br \/> \u00a0\u00a0\u00a0statusCode: 200,<br \/> \u00a0\u00a0\u00a0headers: {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\"Access-Control-Allow-Origin\": \"*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\"Access-Control-Allow-Credentials\": true<br \/> \u00a0\u00a0\u00a0}<br \/> \u00a0};<br \/><br \/> \u00a0try {<br \/> \u00a0\u00a0\u00a0const params = {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Bucket: process.env.BUCKET<br \/> \u00a0\u00a0\u00a0};<br \/><br \/> \u00a0\u00a0\u00a0const videos = await s3.listObjects(params).promise();<br \/> \u00a0\u00a0\u00a0response.body = JSON.stringify(videos);<br \/><br \/> \u00a0\u00a0\u00a0return response;<br \/> \u00a0} catch (e) {<br \/> \u00a0\u00a0\u00a0response.statusCode = 500;<br \/> \u00a0\u00a0\u00a0response.body = JSON.stringify(e);<br \/> \u00a0\u00a0\u00a0throw new Error(response);<br \/> \u00a0}<br \/>};<br \/><br \/>exports.delete = async event =&gt; {<br \/> \u00a0var response = {<br \/> \u00a0\u00a0\u00a0statusCode: 200,<br \/> \u00a0\u00a0\u00a0headers: {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\"Access-Control-Allow-Origin\": \"*\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\"Access-Control-Allow-Credentials\": true<br \/> \u00a0\u00a0\u00a0}<br \/> \u00a0};<br \/><br \/> \u00a0try {<br \/> \u00a0\u00a0\u00a0const params = {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Bucket: process.env.BUCKET,<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0Key: event.pathParameters.id.replace(\/%20\/g, \" \")<br \/> \u00a0\u00a0\u00a0};<br \/><br \/> \u00a0\u00a0\u00a0await s3.deleteObject(params).promise();<br \/> \u00a0\u00a0\u00a0response.body = JSON.stringify(\"Video deleted successfully!\");<br \/><br \/> \u00a0\u00a0\u00a0return response;<br \/> \u00a0} catch (e) {<br \/> \u00a0\u00a0\u00a0response.statusCode = 500;<br \/> \u00a0\u00a0\u00a0response.body = JSON.stringify(e);<br \/> \u00a0\u00a0\u00a0throw new Error(response);<br \/> \u00a0}<br \/>};<\/strong><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Depois que o arquivo estiver salvo, voc\u00ea deve ter dois arquivos no diret\u00f3rio do seu projeto: <strong>serverless.yml<\/strong> e <strong>serverlesstube.js<\/strong>. Agora abra um <strong>terminal<\/strong> ou <strong>prompt de comando<\/strong> e navegue at\u00e9 o diret\u00f3rio do seu projeto.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Quando chegar l\u00e1, digite o comando abaixo para fazer o <em>deploy<\/em> da nossa aplica\u00e7\u00e3o:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><strong>sls deploy<\/strong> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Ao final do <em>deploy<\/em>, voc\u00ea deve ver um resultado parecido com esse:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <br \/><strong>Service Information<br \/>service: serverlesstube<br \/>stage: dev<br \/>region: us-east-1<br \/>stack: serverlesstube-dev<br \/>api keys:<br \/> \u00a0None<br \/>endpoints:<br \/> \u00a0GET - https:\/\/XXX.execute-api.us-east-1.amazonaws.com\/dev\/video<br \/> \u00a0DELETE - https:\/\/XXX.execute-api.us-east-1.amazonaws.com\/dev\/video\/{id}<br \/>functions:<br \/> \u00a0list: serverlesstube-dev-list<br \/> \u00a0delete: serverlesstube-dev-delete<\/strong><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nesse momento, o \u00fanico valor que importa para n\u00f3s \u00e9 o <strong>endpoint<\/strong> criado. Esse valor vai ser necess\u00e1rio para configurar a interface web de forma que ela possa se comunicar com a API criada pelo Serverless Framework.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">O <em>endpoint<\/em> deve ser algo parecido com o endere\u00e7o abaixo:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><br \/><strong>https:\/\/XXX.execute-api.us-east-1.amazonaws.com\/dev\/video<\/strong><\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Com o endere\u00e7o da sua API em m\u00e3os, salve o c\u00f3digo abaixo em um arquivo chamado <strong>index.html<\/strong>, alterando os valores das vari\u00e1veis declaradas nas linhas 5 a 8:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>&lt;ID_DA_CHAVE_DE_ACESSO&gt;: \u00e9 o <strong>ID da chave de acesso<\/strong> que criamos na AWS;<\/li>\r\n<li>&lt;CHAVE_DE_ACESSO_SECRETA&gt;: \u00e9 a <strong>chave de acesso secreta<\/strong> que criamos na AWS;<\/li>\r\n<li>&lt;NOME_DO_SEU_BUCKET&gt;: \u00e9 o nome do bucket que voc\u00ea definiu no seu arquivo <strong>serverless.yml<\/strong>;<\/li>\r\n<li>&lt;ENDERECO_DA_SUA_API&gt;: \u00e9 o <strong>endpoint<\/strong> que voc\u00ea copiou no passo anterior.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> <br \/><strong>&lt;!DOCTYPE html&gt;<br \/>&lt;html lang=\"en\"&gt;<br \/> \u00a0&lt;head&gt;<br \/> \u00a0\u00a0\u00a0&lt;script&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var ACCESS_KEY_ID = \"&lt;ID_DA_CHAVE_DE_ACESSO&gt;\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var SECRET_ACCESS_KEY = \"&lt;CHAVE_DE_ACESSO_SECRETA&gt;\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var BUCKET_NAME = \"&lt;NOME_DO_SEU_BUCKET&gt;\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var API_ADDRESS = \"&lt;ENDERECO_DA_SUA_API&gt;\";<br \/> \u00a0\u00a0\u00a0&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;meta charset=\"utf-8\" \/&gt;<br \/> \u00a0\u00a0\u00a0&lt;meta<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0name=\"viewport\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0content=\"width=device-width, initial-scale=1, shrink-to-fit=no\"<br \/> \u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0&lt;meta name=\"description\" content=\"\" \/&gt;<br \/> \u00a0\u00a0\u00a0&lt;meta name=\"author\" content=\"\" \/&gt;<br \/><br \/> \u00a0\u00a0\u00a0&lt;title&gt;ServerlessTube&lt;\/title&gt;<br \/><br \/> \u00a0\u00a0\u00a0&lt;link<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0rel=\"stylesheet\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0href=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.2.1\/css\/bootstrap.min.css\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0integrity=\"sha384-GJzZqFGwb1QTTN6wy59ffF1BuGJpLSa9DkKMp0DgiMDm4iYMj70gZWKYbI706tWS\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0crossorigin=\"anonymous\"<br \/> \u00a0\u00a0\u00a0\/&gt;<br \/><br \/> \u00a0\u00a0\u00a0&lt;style&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0body {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0overflow-x: hidden;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#sidebar-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0min-height: 100vh;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin-left: -15rem;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-webkit-transition: margin 0.25s ease-out;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-moz-transition: margin 0.25s ease-out;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-o-transition: margin 0.25s ease-out;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0transition: margin 0.25s ease-out;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#sidebar-wrapper .sidebar-heading {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0padding: 0.875rem 1.25rem;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font-size: 1.2rem;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin-left: -15px;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#sidebar-wrapper .logo img{<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin: 5px 5px;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#sidebar-wrapper .list-group {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0width: 15rem;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#page-content-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0min-width: 100vw;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0#wrapper.toggled #sidebar-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin-left: 0;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0@media (min-width: 768px) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#sidebar-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin-left: 0;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#page-content-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0min-width: 0;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0width: 100%;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#wrapper.toggled #sidebar-wrapper {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0margin-left: -15rem;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0&lt;\/style&gt;<br \/> \u00a0&lt;\/head&gt;<br \/><br \/> \u00a0&lt;body&gt;<br \/> \u00a0\u00a0\u00a0&lt;div class=\"d-flex\" id=\"wrapper\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"bg-light border-right\" id=\"sidebar-wrapper\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"row\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"logo text-right col-sm-4\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;img src=\"https:\/\/raw.githubusercontent.com\/cloudnapratica\/serverlesstube\/master\/images\/logo.png\" height=\"50px\"\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"sidebar-heading col-sm-6\" &gt;ServerlessTube&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"row\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"sidebar-heading text-center col-sm-12\"&gt;V\u00eddeos Dispon\u00edveis&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div id=\"video-list\" class=\"list-group list-group-flush\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0&lt;div id=\"page-content-wrapper\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div id=\"upload\" class=\"container-fluid\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h1 id=\"video-title\" class=\"col-ms-4\"&gt;&lt;\/h1&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;video width=\"1280\" height=\"720\" id=\"video-player\" controls&gt;&lt;\/video&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div id=\"video-controls\" class=\"row\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/br&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;h2 class=\"mt-4\"&gt;Fa\u00e7a o upload de um v\u00eddeo&lt;\/h2&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;form<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=\"upload-form\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0action=\"\/\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0method=\"post\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0enctype=\"multipart\/form-data\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"key\"&gt;T\u00edtulo do V\u00eddeo&lt;\/label&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"input\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"form-control\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=\"key\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0aria-describedby=\"T\u00edtulo do V\u00eddeo\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0placeholder=\"T\u00edtulo do V\u00eddeo\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"key\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"acl\" value=\"public-read\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"Content-Type\" value=\"video\/mp4\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"hidden\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"x-amz-meta-uuid\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"14365123651274\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"hidden\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"x-amz-server-side-encryption\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"AES256\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=\"credential\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"hidden\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"X-Amz-Credential\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"hidden\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"X-Amz-Algorithm\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"AWS4-HMAC-SHA256\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"amz-date\" type=\"hidden\" name=\"X-Amz-Date\" value=\"\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"hidden\" name=\"x-amz-meta-tag\" value=\"\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input id=\"policy\" type=\"hidden\" name=\"Policy\" value=\"\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id=\"signature\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"hidden\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"X-Amz-Signature\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;div class=\"form-group\"&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;label for=\"file\"&gt;Arquivo&lt;\/label&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input type=\"file\" class=\"form-control\" id=\"file\" name=\"file\" \/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;input<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type=\"submit\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0name=\"submit\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0value=\"Upload\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0class=\"btn btn-primary mb-2\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/form&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0&lt;\/div&gt;<br \/> \u00a0\u00a0\u00a0&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/crypto-js\/3.1.9-1\/crypto-js.min.js\"&gt;&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/crypto-js\/3.1.9-1\/hmac-sha256.min.js\"&gt;&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;script<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0src=\"http:\/\/code.jquery.com\/jquery-3.3.1.min.js\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0integrity=\"sha256-FgpCb\/KJQlLNfOu91ta32o\/NMZxltwRo8QtmkMRdAu8=\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0crossorigin=\"anonymous\"<br \/> \u00a0\u00a0\u00a0&gt;&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;script<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/popper.js\/1.14.6\/umd\/popper.min.js\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0integrity=\"sha384-wHAiFfRlMFy6i5SRaxvfOCifBUQy1xHdJ\/yoi7FRNXMRBu5WHdZYu1hA6ZOblgut\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0crossorigin=\"anonymous\"<br \/> \u00a0\u00a0\u00a0&gt;&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;script<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0src=\"https:\/\/stackpath.bootstrapcdn.com\/bootstrap\/4.2.1\/js\/bootstrap.min.js\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0integrity=\"sha384-B0UglyR+jN6CkvvICOB2joaf5I4l3gm9GU6Hc1og6Ls7i6U\/mkkaduKaBhlAXv9k\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0crossorigin=\"anonymous\"<br \/> \u00a0\u00a0\u00a0&gt;&lt;\/script&gt;<br \/> \u00a0\u00a0\u00a0&lt;script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jquery.form\/4.2.2\/jquery.form.min.js\" integrity=\"sha384-FzT3vTVGXqf7wRfy8k4BiyzvbNfeYjK+frTVqZeNDFl8woCbF0CYG6g2fMEFFo\/i\" crossorigin=\"anonymous\"&gt;&lt;\/script&gt;<br \/><br \/> \u00a0\u00a0\u00a0&lt;script&gt;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var datetime = new Date();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var date = datetime<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.toISOString()<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.split(\"T\")[0]<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.replace(\/-\/g, \"\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0datetime.setMinutes(datetime.getMinutes() + 30);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var policy = {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0expiration: datetime.toISOString(),<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0conditions: [<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ bucket: BUCKET_NAME },<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[\"starts-with\", \"$key\", \"\"],<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ acl: \"public-read\" },<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[\"starts-with\", \"$Content-Type\", \"video\/mp4\"],<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \"x-amz-meta-uuid\": \"14365123651274\" },<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \"x-amz-server-side-encryption\": \"AES256\" },<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0[\"starts-with\", \"$x-amz-meta-tag\", \"\"],<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"x-amz-credential\":<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ACCESS_KEY_ID + \"\/\" + date + \"\/us-east-1\/s3\/aws4_request\"<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0},<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \"x-amz-algorithm\": \"AWS4-HMAC-SHA256\" },<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{ \"x-amz-date\": date + \"T000000Z\" }<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0};<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var b64policy = btoa(JSON.stringify(policy));<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"policy\").value = b64policy;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var dateKey = CryptoJS.HmacSHA256(date, \"AWS4\" + SECRET_ACCESS_KEY);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var dateRegionKey = CryptoJS.HmacSHA256(\"us-east-1\", dateKey);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var dateRegionServiceKey = CryptoJS.HmacSHA256(\"s3\", dateRegionKey);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var signingKey = CryptoJS.HmacSHA256(<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"aws4_request\",<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dateRegionServiceKey<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0var signature = CryptoJS.HmacSHA256(b64policy, signingKey);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"signature\").value = signature.toString(<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0CryptoJS.enc.Hex<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"credential\").value =<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0ACCESS_KEY_ID + \"\/\" + date + \"\/us-east-1\/s3\/aws4_request\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"amz-date\").value = date + \"T000000Z\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0$.get(<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0API_ADDRESS,<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0function(data, status) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var list = document.getElementById(\"video-list\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data.Contents.forEach(function(video) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var item = document.createElement(\"a\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item.id = video.Key;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item.innerHTML = video.Key.split(\".mp4\")[0];<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item.className = \"list-group-item list-group-item-action bg-light\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item.href = \"#\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0item.addEventListener(\"click\", updateVideoSource);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0list.appendChild(item);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0$(document).ready(function() {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"upload-form\").action = \"http:\/\/\" + BUCKET_NAME + \".s3.amazonaws.com\/\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0});<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0function updateVideoSource(ev) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"video-title\").innerHTML = ev.target.id.split(\".mp4\")[0];<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var oldSource = document.getElementById(\"video-source\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (oldSource) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0oldSource.remove();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var source = document.createElement('source');<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0source.id = \"video-source\"; \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0source.setAttribute(\"src\", \"https:\/\/s3.amazonaws.com\/\" + BUCKET_NAME + \"\/\" + ev.target.id);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"video-player\").appendChild(source);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0document.getElementById(\"video-player\").load();<br \/><br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var controls = document.getElementById(\"video-controls\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var oldControl = document.getElementsByName(\"delete-video\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (oldControl[0]) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0oldControl[0].remove();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var button = document.createElement(\"a\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.name = \"delete-video\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.id = ev.target.id;<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.innerHTML = \"Remover v\u00eddeo\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.className = \"btn btn-danger\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.style = \"margin-left: 14px;\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.href = \"#\";<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0button.addEventListener(\"click\", deleteVideo);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0controls.appendChild(button);<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0function deleteVideo(ev) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0$.ajax({<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0url: API_ADDRESS + \"\/\" + ev.target.id,<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0type: 'DELETE',<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0success: function(result) {<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0location.reload();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0&lt;\/script&gt;<br \/> \u00a0&lt;\/body&gt;<br \/>&lt;\/html&gt;<\/strong><br \/> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Agora basta abrir o arquivo <strong>index.html<\/strong> no seu browser e fazer o upload de um v\u00eddeo. Caso voc\u00ea precise de um v\u00eddeo de exemplo, existem alguns <a href=\"https:\/\/github.com\/ACloudGuru\/serverless-workshop\/raw\/master\/sample-videos.zip\">aqui<\/a>.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Depois de dar um t\u00edtulo e escolher o arquivo, aguarde at\u00e9 que o upload do arquivo termine.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"339\" class=\"wp-image-5010\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless.png\" alt=\"\" srcset=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless.png 660w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless-150x77.png 150w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless-100x51.png 100w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless-600x308.png 600w, https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/servertube-aws-aplicacao-serverless-450x231.png 450w\" sizes=\"(max-width: 660px) 100vw, 660px\" \/><\/figure>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Depois que o upload do v\u00eddeo estiver completo, recarregue a p\u00e1gina. O t\u00edtulo que voc\u00ea deu ao v\u00eddeo deve aparecer na lista do lado esquerdo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Clique nele para assistir o primeiro v\u00eddeo no seu ServerlessTube!<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Limpando a sua conta da AWS<\/h3>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Quando voc\u00ea decidir remover o projeto da sua conta, primeiro remova todos os v\u00eddeos pela interface web, caso contr\u00e1rio voc\u00ea vai ver um erro quando tentar executar o comando abaixo.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Depois que voc\u00ea tiver removido todos os v\u00eddeos, basta executar o comando abaixo em um terminal ou<strong><em> prompt<\/em><\/strong> de comando no diret\u00f3rio do seu projeto:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><strong>sls remove<\/strong> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">No final da remo\u00e7\u00e3o, voc\u00ea ver\u00e1 um resultado como o abaixo, mostrando que todos os recursos foram removidos com sucesso:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"><br \/><strong>Serverless: Getting all objects in S3 bucket...<br \/>Serverless: Removing objects in S3 bucket...<br \/>Serverless: Removing Stack...<br \/>Serverless: Checking Stack removal progress...<br \/>....................................<br \/>Serverless: Stack removal finished...<\/strong><br \/> <\/pre>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Para proteger a sua conta da AWS, remova tamb\u00e9m o usu\u00e1rio que criamos para o projeto. Basta acessar o servi\u00e7o IAM novamente, ir para a lista de usu\u00e1rios, selecionar o usu\u00e1rio e clicar em <strong>Excluir usu\u00e1rio<\/strong>.<\/p>\r\n\r\n\r\n\r\n<figure class=\"wp-block-image\"><a href=\"http:\/\/bit.ly\/2JMVbrX\" target=\"_blank\" rel=\"noreferrer noopener\"><img decoding=\"async\" class=\"wp-image-6384\" src=\"https:\/\/geekblogti.wpengine.com\/wp-content\/uploads\/2019\/07\/CTA-Rodap\u00e9-Vagas-AWS-1024x134.png\" alt=\"\" \/><\/a><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos Passos<\/h2>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Nesse artigo voc\u00ea aprendeu como criar uma aplica\u00e7\u00e3o serverless do 0 utilizando a AWS e o Serverless Framework. \u00c9 claro que existem muitas coisas que n\u00e3o conseguimos cobrir aqui, como autentica\u00e7\u00e3o, testes, diferentes ambientes (dev, uat, prod), hospedagem da interface web, etc.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Qual aspecto de aplica\u00e7\u00f5es serverless voc\u00ea tem mais interesse em aprender? Entre em contato, terei o maior prazer em te ajudar!<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Caso voc\u00ea precise, o <strong><a href=\"https:\/\/github.com\/cloudnapratica\/serverlesstube\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"c\u00f3digo fonte do ServerlessTube (abre numa nova aba)\">c\u00f3digo fonte do ServerlessTube<\/a><\/strong> tamb\u00e9m est\u00e1 dispon\u00edvel neste reposit\u00f3rio.<\/p>\r\n\r\n\r\n\r\n<p class=\"wp-block-paragraph\">Obrigado e at\u00e9 o pr\u00f3ximo post!<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um &#8220;YouTube&#8221; sem configurar nenhum servidor? No artigo de hoje, vamos aprender como desenvolver uma aplica\u00e7\u00e3o serverless do 0 utilizando servi\u00e7os da AWS e o Serverless Framework. Com esse conhecimento, voc\u00ea ser\u00e1 capaz de come\u00e7ar o [&hellip;]<\/p>\n","protected":false},"author":167,"featured_media":5020,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[18],"tags":[],"class_list":["post-4990","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimiento-de-software"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.3 (Yoast SEO v28.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Como desenvolver uma aplica\u00e7\u00e3o serverless do 0<\/title>\n<meta name=\"description\" content=\"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um \u201cYouTube\u201d sem configurar nenhum servidor?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?\" \/>\n<meta property=\"og:description\" content=\"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um &quot;YouTube&quot; sem configurar nenhum\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog Geekhunter\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geekhunterbr\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-21T13:29:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-03-06T13:16:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Geekhunter\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:site\" content=\"@geekhunterbr\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Geekhunter\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/\"},\"author\":{\"name\":\"Geekhunter\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\"},\"headline\":\"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?\",\"datePublished\":\"2025-02-21T13:29:12+00:00\",\"dateModified\":\"2025-03-06T13:16:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/\"},\"wordCount\":1937,\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg\",\"articleSection\":[\"Desenvolvimiento de software\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/\",\"name\":\"Como desenvolver uma aplica\u00e7\u00e3o serverless do 0\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg\",\"datePublished\":\"2025-02-21T13:29:12+00:00\",\"dateModified\":\"2025-03-06T13:16:00+00:00\",\"description\":\"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um \u201cYouTube\u201d sem configurar nenhum servidor?\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2019\\\/04\\\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mundo TI\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Desenvolvimiento de software\",\"item\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/category\\\/mundo-ti\\\/desenvolvimiento-de-software\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"name\":\"Blog de TI\",\"description\":\"Dicas para o RH e profissionais da \u00e1rea TI\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#organization\",\"name\":\"GeekHunter\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"contentUrl\":\"https:\\\/\\\/www.geekhunter.com/pt/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/icon-1.png\",\"width\":300,\"height\":300,\"caption\":\"GeekHunter\"},\"image\":{\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/x.com\\\/geekhunterbr\",\"https:\\\/\\\/www.instagram.com\\\/geekhunterbr\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geekhunter-brasil\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@GeekHunterOfficial\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/#\\\/schema\\\/person\\\/9f62b173345139f7bbdaf55312c3d400\",\"name\":\"Geekhunter\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g\",\"caption\":\"Geekhunter\"},\"url\":\"https:\\\/\\\/www.geekhunter.com\\\/pt\\\/blog\\\/author\\\/matias\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Como desenvolver uma aplica\u00e7\u00e3o serverless do 0","description":"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um \u201cYouTube\u201d sem configurar nenhum servidor?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?","og_description":"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um \"YouTube\" sem configurar nenhum","og_url":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/","og_site_name":"Blog Geekhunter","article_publisher":"https:\/\/www.facebook.com\/geekhunterbr\/","article_published_time":"2025-02-21T13:29:12+00:00","article_modified_time":"2025-03-06T13:16:00+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg","type":"image\/jpeg"}],"author":"Geekhunter","twitter_card":"summary_large_image","twitter_creator":"@geekhunterbr","twitter_site":"@geekhunterbr","twitter_misc":{"Escrito por":"Geekhunter","Est. tempo de leitura":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#article","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/"},"author":{"name":"Geekhunter","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400"},"headline":"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?","datePublished":"2025-02-21T13:29:12+00:00","dateModified":"2025-03-06T13:16:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/"},"wordCount":1937,"publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg","articleSection":["Desenvolvimiento de software"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/","name":"Como desenvolver uma aplica\u00e7\u00e3o serverless do 0","isPartOf":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#primaryimage"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#primaryimage"},"thumbnailUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg","datePublished":"2025-02-21T13:29:12+00:00","dateModified":"2025-03-06T13:16:00+00:00","description":"Voc\u00ea j\u00e1 ouviu falar de aplica\u00e7\u00f5es serverless, mas n\u00e3o sabe por onde come\u00e7ar? Que tal aprender enquanto voc\u00ea cria um \u201cYouTube\u201d sem configurar nenhum servidor?","breadcrumb":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.geekhunter.com/pt/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#primaryimage","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2019\/04\/aplicacao-serverless-com-AWS-como-desenvolver-uma-do-0-min.jpg","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/aplicacao-serverless-com-aws-como-desenvolver-uma-do-0\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.geekhunter.com/pt/blog\/"},{"@type":"ListItem","position":2,"name":"Mundo TI","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/"},{"@type":"ListItem","position":3,"name":"Desenvolvimiento de software","item":"https:\/\/www.geekhunter.com/pt/blog\/category\/mundo-ti\/desenvolvimiento-de-software\/"},{"@type":"ListItem","position":4,"name":"Aplica\u00e7\u00e3o serverless com AWS: como desenvolver uma do 0?"}]},{"@type":"WebSite","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#website","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","name":"Blog de TI","description":"Dicas para o RH e profissionais da \u00e1rea TI","publisher":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.geekhunter.com/pt/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#organization","name":"GeekHunter","url":"https:\/\/www.geekhunter.com\/pt\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.geekhunter.com\/pt\/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","contentUrl":"https:\/\/www.geekhunter.com/pt/blog\/wp-content\/uploads\/2024\/10\/icon-1.png","width":300,"height":300,"caption":"GeekHunter"},"image":{"@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geekhunterbr\/","https:\/\/x.com\/geekhunterbr","https:\/\/www.instagram.com\/geekhunterbr\/","https:\/\/www.linkedin.com\/company\/geekhunter-brasil\/","https:\/\/www.youtube.com\/@GeekHunterOfficial"]},{"@type":"Person","@id":"https:\/\/www.geekhunter.com\/pt\/blog\/#\/schema\/person\/9f62b173345139f7bbdaf55312c3d400","name":"Geekhunter","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/09a0f76de8cf1fa3621f8b73417ce43344b42e1324a07a9af24f57c5eef49840?s=96&d=mm&r=g","caption":"Geekhunter"},"url":"https:\/\/www.geekhunter.com\/pt\/blog\/author\/matias\/"}]}},"_links":{"self":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/4990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/users\/167"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/comments?post=4990"}],"version-history":[{"count":0,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/posts\/4990\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media\/5020"}],"wp:attachment":[{"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/media?parent=4990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/categories?post=4990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.geekhunter.com/pt/blog\/wp-json\/wp\/v2\/tags?post=4990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}