Adicionando domínio customizado a uma Lambda com o API Gateway
Tags: lambda, apigateway, aws, webdev
Published: 2024-03-27 23:43:27

Já tem tempos que eu não escrevo então me desculpa porque perdi um pouco o jeito, mas hoje eu vou compartilhar algo super simples que eu nunca tinha feito: adicionar um domínio customizado pra uma AWS Lambda.

Se você nunca criou uma lambda, te recomendo [esse post aqui](https://dev.to/ricmello/como-criar-um-backend-pro-seu-frontend-com-aws-lambdas-5fk9) que eu acabei de criar.

Agora, nós vamos adicionar um domínio customizado pra ela.

## Mas por que usar um domínio customizado?

E por que não usar? Parece que um gato sobe no teclado sempre que a gente gera um link de uma lambda. Links como  https://dz4y7rvv2az4iopdqzvgneefhy0jdfii.lambda-url.us-east-1.on.aws ou https://lh4j4sdpmljdcrcr34gqc6ddni0qvugg.lambda-url.us-east-1.on.aws são gerados e ficam beeem feios quando usados no frontend.

Plus, se você precisar apontar o seu link pra qualquer outro lugar (outra lambda, uma API, outra cloud...) será muito mais tranquilo e você não vai ter que atualizar a url da lambda em milhares de lugares onde ela pode estar sendo utilizada.

## API Gateway

Pra atingir o nosso objetivo, vamos usar o API Gateway. Esse cara consegue organizar todas as nossas lambdas e criar mapeamentos pra elas definindo paths específicos. Isso te permite usar a lambda `nomesuperultragigante.lambda-url.us-east-1.on.aws` como um endpoint comum `api.meuwebsite.com/v1/lambda`.

## Criando a API no API Gateway
Pra começar, vamos criar a API que vai mapear a lambda em um endpoint no api gateway. Para isso, ainda na tela do API Gateway, vá em **APIs > Create API > REST API**. Eu vou usar o nome `faker-api` pra esse tutorial:

![Screenshot da tela de criação de API](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/h2pfbn70f5z39ci3as37.png)

Com a API criada, você deve ver essa tela:

![Screenshot da tela de edição/configuração da API](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tl2r79ju0uoiclpel9vn.png)


### Resources

No API Gateway você pode realmente brincar de criação de API. Em create resources você pode ir definindo os paths por exemplo `/v1`, depois `/v1/domain` até chegar em `/v1/domain/endpoint`. É uma ferramenta muito poderosa que te permite mapear todas as rotas e integrar com lambdas, apis, ou qualquer outro serviço.

No nosso caso, eu vou tentar manter mais simples e criar um único resource chamado `persons`. Para isso, vá em **Create Resource**, dê o nome `persons` pra ele, selecione a opção de CORS e clique em **Create Resource**.


![Screenshot da criação de Resource](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t0cywlyok86hh88brzgs.png)
 
Com o endpoint persons selecionado, vá em **Create method** e preencha as seguintes infos:
- Method type: GET
- Integration type: Lambda function
- Em lambda function: Selecione a nossa lambda de teste

![Screenshot da criação de api pra lambda](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fa1z5zmypa86vpoiqmwk.png)

Depois de clicar em Create method, o resultado deve ser esse aqui:

![Screenshot da página com o método de persons criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swmoyv2uwixhwe064x0v.png)

Clique em **Deploy API** e crie um stage chamado `development`:

![Screenshot da tela de criação de stage](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ivz65kkze1ulzzxjxlm.png)

Você deve ser redirecionado pra essa tela com o stage criado, e mais uma URL gigante:

![Screenshot da página de stage development](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kh5wgjf4f6e4z2o23g2n.png)

## Criando o domínio

Pra criar o nosso domínio, vamos no painel do **API Gateway ->  Custom domain names -> Create**.

![Create custom domain](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gpu5vqgu2hnu3ensm4dz.png)

Antes de começar, na configuração do endpoint, você vai precisar adicionar um certificado pro domínio que você deseja criar. Clique em **Create a new ACM certificate** e uma nova aba se abrirá.

Na tela do Certificate Manager, clique em **Request a certificate -> Request a public certificate**.

Na tela que vai se abrir, insira o domínio que você vai usar pra solicitar o certificado. No meu caso é o `faker-api.ricmello.com`, mas você pode adicionar mais de um domínio ou um wildcard como `*.ricmello.com` pra não precisar criar um certificado pra cada subdomínio.

O método de validação recomendado pela própria AWS é o de DNS.

![Screenshot da tela de requisição de certificado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oa1e7npu46tzk3obd4xx.png)

Clique em **request** e depois **view certificate**.

Caso você já use o Route53, basta clicar em **Create records in Route 53** e os registros serão criados automaticamente pra validação do domínio. Ou caso você use outro serviço é só criar um novo registro do tipo CNAME e colar os valores que vão aparecer pra você como no print abaixo.

![Screenshot da página com o CNAME a ser criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31ev7azh4gvd47qvzcsi.png)

Depois de configurar o DNS, o seu certificado vai estar disponível, mas isso pode demorar um pouco. Você pode usar a ferramenta [whatsmydns](https://www.whatsmydns.net) pra ver se a sua configuração tá certa e aguardar até o certificado ser emitido como esse aqui:

![Screenshot da tela de certificado com o status emitido](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6oc04mseahf1u8rkb2pe.png)

Agora podemos voltar na criação do domínio no API Gateway e selecionar o certificado criado. No nome do domínio eu preenchi o mesmo `faker-api.ricmello.com` que eu usei pro certificado:

![Screenshot da tela de criação do API Gateway com o certificado selecionado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8f24pjpvpcki0xenwofx.png)

Clique em **Create domain name** para salvar e volte pra tela de configuração de domínio. Você deve criar um CNAME apontando o seu domínio pro API Gateway domain name, que no meu exemplo é o `d-4ip5ycuy62.execute-api.us-east-1.amazonaws.com`.


![Screenshot da configuração do nome de domínio customizado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zypfr1238oim0pw05wkf.png)


## Associando o domínio
Na tela de Custom domain names, vá em **API mappings > Configure API mappings > Add new mapping**, e configure um mapeamento selecionando a sua API e o stage criado.


![Screenshot da tela de configuração de API com a lambda e o stage development selecionados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/732fxmm8avafm4ajxl0n.png)

Feito! O seu domínio vai apontar pro api gateway e você vai conseguir utilizar a lambda pelo mapeamento como na imagem abaixo.

![Imagem da resposta da lambda utilizando o domínio criado](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bhcglap2lze07jkii2bq.png)

---

E aí, curtiu? Tem alguma dúvida? Se tiver qualquer coisa que eu possa fazer pra tornar esse artigo melhor, pode reclamar, elogiar ou sugerir outro artigo. Manda ver nos comentários porque feedbacks são sempre super bem vindos.