---
title: "Amazon API Gateway + Route 53"
menutitle: "Amazon API Gateway + Route 53"
weight: 1
pre: ""
hidden: true
---
#### Acesse o AWS CloudShell
1. Acesse o AWS CloudShell, na barra superior do AWS Console, clique no botão ao lado direito da barra de busca.

#### Crie os recursos usando o AWS CloudFormation
1. Crie uma **Key Pair** para cada região (caso não exista). Será utilizada para acessar as instâncias EC2.
2. Criar VPC. **Observação**: Antes de executar o AWS CloudFormation, para cada região utilizada.
| Região: São Paulo (sa-east-1)| Região: N. California (us-west-1) |
|-------------------|-------------------|
|[](https://console.aws.amazon.com/cloudformation/home?region=sa-east-1#/stacks/quickcreate?templateUrl=https%3A%2F%2Fdr-on-aws-workshop.s3.us-east-2.amazonaws.com%2Fapigw-api-cfn-template.yaml&stackName=api-vpc) |[](https://console.aws.amazon.com/cloudformation/home?region=us-west-1#/stacks/quickcreate?templateUrl=https%3A%2F%2Fdr-on-aws-workshop.s3.us-east-2.amazonaws.com%2Fapigw-api-cfn-template.yaml&stackName=api-vpc) |
2b. Obter os ids das VPCs, subnets privadas e security groups criados nas duas regiões:
aws cloudformation describe-stacks --stack-name api-vpc --region sa-east-1 | jq -r .Stacks[0].Outputs[0].OutputValue
aws cloudformation describe-stacks --stack-name api-vpc --region sa-east-1 | jq -r .Stacks[0].Outputs[1].OutputValue
aws cloudformation describe-stacks --stack-name api-vpc --region sa-east-1 | jq -r .Stacks[0].Outputs[2].OutputValue
aws cloudformation describe-stacks --stack-name api-vpc --region us-west-1 | jq -r .Stacks[0].Outputs[0].OutputValue
aws cloudformation describe-stacks --stack-name api-vpc --region us-west-1 | jq -r .Stacks[0].Outputs[1].OutputValue
aws cloudformation describe-stacks --stack-name api-vpc --region us-west-1 | jq -r .Stacks[0].Outputs[2].OutputValue
#### Crie a conectividade para os recursos
1. Criar VPC endpoints nas VPCs criadas no passo anterior.
```
aws ec2 create-vpc-endpoint \
--vpc-id \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.sa-east-1.execute-api \
--subnet-id \
--security-group-id \
--region sa-east-1
aws ec2 create-vpc-endpoint \
--vpc-id \
--vpc-endpoint-type Interface \
--service-name com.amazonaws.us-west-1.execute-api \
--subnet-id \
--security-group-id \
--region us-west-1
```
2. Criar uma API privada de exemplo em cada região usando o VPC Endpoint correspondente.
- Acessar o menu do **Amazon API Gateway**
- Na lista de tipos, selecionar **REST API Private** e clicar em **Import**.
- Clicar em **OK**.
- Selecionar a opção **Example API** e clicar em **Import.**
- Na tela de edição da API, clicar em **Settings** abaixo de **Documentation**.
- Clicar sobre a caixa de texto de **VPC Endpoints** e selecionar o endpoint criado anteriormente, clicar em **Save Changes**.
- Clicar em **Resource Policy** e clicar no botão de Exemplo para **Source VPC Allowlist**, ajustar a política incluindo o Id do Endpoint da VPC conforme abaixo e clicar em **Save**:
```
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*",
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "vpce-0f8bb1576e7b08d8a"
}
}
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "execute-api:/*"
}
]
}
```
- Fazer o deploy da API criando um novo stage chamado **prod**.
3. Criar um certificado no ACM em cada região
```
aws acm-pca create-certificate-authority \
--certificate-authority-configuration file://ca_config.txt \
--certificate-authority-type "ROOT" \
--idempotency-token 98256344 \
--region sa-east-1
aws acm-pca create-certificate-authority \
--certificate-authority-configuration file://ca_config.txt \
--certificate-authority-type "ROOT" \
--idempotency-token 98256344 \
--region us-west-1
```
3a. Instalar um certificado para o CA criado no passo anterior.
- Entrar no console AWS, acessar **Certificate Manager**.
- Em **Private CAs**, selecionar a CA criada anteriormente e selecionar o menu **Actions -> Install CA certificate**.
- Clicar em **Next**.
- Clicar em **Confirm and Install**.
3b. Requisitar um certificado privado para o domínio da API privada.
- Entrar no console AWS, acessar **Certificate Manager**
- Em **Certificate Manager**, cliar em **Getting Started**, selecionar **Request a private certificate** e clicar em **Request a certificate**.
- Selecionar a CA criada anteriormente no combobox (example.com), clicar em **Acknowledge** e depois em **Next**.
- Preencher com ***.example.com** em **Domain name** e clicar em **Next**.
- Clicar em **Review and request**.
- Clicar em **Confirm and request**.
- Copiar o ARN nos detalhes do certificado criado para usar no passo seguinte.
4. Criar um custom domain no API Gateway
- Acessar o serviço do **Amazon API Gateway** via console AWS
- Clicar em **Custom domain names** no menu esquerdo
- Em **Domain name**, inclui o nome do domínio a ser utilizado pela api, no caso **api.example.com**.
- Em **ACM certificate**, selecionar o certificado criado anteriormente.
- Clicar em **Create domain name**.
4a. Adicionar um mapeamento do custom domain para as apis disponíveis.
- Selecionando o custom domain recém-criado, selecionar a aba **API mappings** e clicar em **Configure API mappings**.
- Clicar no botão **Add new mapping**, e selecionar:
- O nome da API de exemplo (**PetStore**)
- O stage onde a API foi publicada (**prod**)
- Clicar em **Save**.
5. Criar NLB apontando para os VPC endpoints em cada região. Repetir os comandos abaixo trocando sa-east-1 por us-west-1 e respectivos recursos.
```
aws elbv2 create-load-balancer --name api-nlb --type network --scheme internal --subnet-mappings SubnetId= --region sa-east-1
aws elbv2 create-target-group \
--name tg-api-private \
--protocol TLS \
--port 443 \
--target-type ip \
--vpc-id \
--region sa-east-1
aws elbv2 register-targets \
--target-group-arn \
--targets Id= \
--region sa-east-1
aws elbv2 create-listener \
--load-balancer-arn \
--protocol TLS --port 443 --certificates CertificateArn= \
--ssl-policy ELBSecurityPolicy-2016-08 \
--default-actions Type=forward,TargetGroupArn= \
--region sa-east-1
```
6. Criar um VPC peering entre as duas VPCs de diferentes regiões
aws ec2 create-vpc-peering-connection --vpc-id --peer-vpc-id --peer-region us-west-1 --region sa-east-1
aws ec2 accept-vpc-peering-connection --vpc-peering-connection-id --region us-west-1
7.b. Criar entradas nas tabelas de roteamento das subnets públicas e privadas das duas VPCs apontando para o VPC peering.
| Subnet |Região: sa-east-1 | Região: us-west-1 |
|--------|------------------|-------------------|
| publica/privada | Destination: 172.16.0.0/16, Target: pcx-XXXXX | Destination: 10.0.0.0/16, Target: pcx-YYYYY|
7. Criar um Private Hosted Zone para o domínio interno example.com associando a VPC em sa-east-1
```
aws route53 create-hosted-zone --name example.com --caller-reference 2021-03-15-22:28 --hosted-zone-config PrivateZone=true --vpc VPCRegion=sa-east-1,VPCId=
```
8. Associar a VPC de us-west-1 com o Private Hosted Zone para compartilhar os registro de DNS
```
aws route53 associate-vpc-with-hosted-zone --hosted-zone-id --vpc VPCRegion=us-west-1,VPCId=
```
#### Configure o Health Check
1. Criar um health check baseado em alarme do CloudWatch para o Route 53 identificar se o endpoint está saudável. Executar o seguinte template de CloudFormation com o nome de stack hc-confiabilidade e seguintes valores:
- Abrir o serviço **CloudWatch** no console AWS.
- Clicar no menu **Synthetics** -> **Canaries**
- Clicar em **Create canary**.
- Selecionar o Blueprint **Heartbeat monitoring**.
- Inserir um nome para o canário. P.ex: canario-api-sp
- Em **Application endpoint URL**, inserir o endpoint default da API na região.
- Desmarcar a opção **Take screenshots**.
- Em **Schedule**, selecionar **Run continuously**.
- Definir a execução a cada 1 minuto e marcar a opção **Start immediately after creation**.
- Expandir a seção CloudWatch alarms e clicar no botão Add new alarm.
- Entrar com os valores:
- Metric name: **Failed**
- Alarm condition: **Greater/Equal**
- Threshold: 1
- Average over period: **1 minute**
- Expandir **VPC Settings** e selecionar a VPC, Subnet privada e Security Group da região sa-east-1.
- Clicar em **Create canary**.
2. Criar health check do Route53 apontando para o alarme criado pelo canário do passo anterior.
- Abrir o serviço **Route 53** no console AWS.
- Expandir menu lateral e selecionar opção **Health checks**.
- Clicar no botão **Create health check**.
- Nomear o health check. P.ex.: hc-api
- Selecionar **State of CloudWatch alarm** em **What to monitor**.
- Selecionar a região primária. P.ex. sa-east-1
- Selecionar o alarme criado pelo canário.
- Clicar em **Next**.
- Clicar em **Create health check**.
- Copiar o ID do health check para ser utilizado na política de tráfego do Route 53.
3. Definir a política de roteamento criando um arquivo politica.json com o seguinte conteúdo:
```
{
"AWSPolicyFormatVersion":"2015-10-01",
"RecordType":"A",
"StartRule":"site_switch",
"Endpoints":{
"my_ec2":{
"Type":"value",
"Value":""
},
"my_bkp_ec2":{
"Type":"value",
"Value":""
}
},
"Rules":{
"site_switch":{
"RuleType":"failover",
"Primary":{
"EndpointReference":"my_ec2",
"HealthCheck": ""
},
"Secondary":{
"EndpointReference":"my_bkp_ec2"
}
}
}
}
```

```
aws route53 create-traffic-policy --name minha_politica --document file://politica.json
```
```
aws route53 create-traffic-policy-instance --hosted-zone-id --name api.example.com --ttl 60 --traffic-policy-id --traffic-policy-version 1
```
#### Testando o roteamento entre as regiões
1. Uma vez configuradas as entradas de DNS que utiliza a política de failover entre os recursos em diferentes regiões, basta disparar o alarme que indica a falha no health check do ambiente primário que podemos ver que a entrada DNS para o endpoint api.example.com será chaveado para a outra região.
#### Apagando os recursos
1. Acesse a Console do CloudFormation na região **São Paulo**
2. Selecione a **Stack** criada.
3. Clique no botão acima **Delete**
4. Confime no botão **Delete stack**
5. Repita os passos 1 ao 4 para a região **N. California** para apagar a segunda **Stack**.