O blog da AWS

Construindo APIs Serverless privadas com AWS Lambda e Amazon VPC Lattice

Atualização 8 de setembro de 2023: O VPC Lattice lançou uma estrutura de evento atualizada (“v2”) para grupos de destino Lambda. Especifique a versão desejada da estrutura de evento ao criar o grupo de destino ou atualizando um grupo existente. Detalhes sobre a estrutura de evento podem ser encontrados na documentação do VPC Lattice.


Esta publicação foi escrita por Josh Kahn, Tech Leader, Serverless.

Amazon VPC Lattice é um novo serviço de rede de aplicações, geralmente disponível, que simplifica a conectividade entre serviços. Os desenvolvedores podem conectar, proteger e monitorar serviços em instâncias, contêineres ou computação Serverless de maneira simplificada e consistente.

O VPC Lattice suporta funções AWS Lambda tanto como destino quanto como consumidor de serviços. Esta publicação do blog explora como incorporar o VPC Lattice em suas cargas de trabalho Serverless para simplificar o acesso privado a APIs baseadas em HTTP construídas com Lambda.

Visão geral

O VPC Lattice é um serviço de rede de aplicações que permite a descoberta e conectividade de serviços entre VPCs e contas AWS. O VPC Lattice inclui recursos que permitem aos desenvolvedores definir políticas para acesso à rede, gerenciamento de tráfego e monitoramento. Ele também suporta nomes de domínio personalizados para endpoints privados.

O VPC Lattice é composto por vários componentes principais:

  • Rede de serviços – um mecanismo de agrupamento lógico para uma coleção de serviços nos quais você pode aplicar políticas comuns. Associe uma ou mais VPCs para permitir o acesso de serviços na VPC à rede de serviços.
  • Serviço – uma unidade de software que cumpre uma tarefa ou função específica. Serviços usando VPC Lattice podem ser executados em instâncias, contêineres ou computação Serverless. Esta publicação se concentra em serviços construídos com funções Lambda.
  • Grupo de destino – em uma aplicação Serverless, uma função Lambda que executa lógica de negócios em resposta a uma solicitação. Regras de roteamento dentro do serviço encaminham solicitações para o grupo de destino apropriado.
  • Política de autenticação – uma política de recursos do AWS Identity and Access Management (IAM) que pode ser associada a uma rede de serviços e a um serviço que define o acesso a esses serviços.

O VPC Lattice permite conectividade entre limites de VPC e conta, ao mesmo tempo que alivia a complexidade da rede subjacente. Ele suporta protocolos HTTP/HTTPS e gRPC, embora o gRPC não seja atualmente aplicável para grupos de destino Lambda.

VPC Lattice e Lambda

Lambda é uma das opções para construir serviços VPC Lattice. O console AWS Lambda suporta VPC Lattice como um gatilho, semelhante aos gatilhos existentes anteriormente, como Amazon API Gateway e Amazon EventBridge. Você também pode conectar o VPC Lattice como uma fonte de evento usando infraestrutura como código, como AWS CloudFormation e Terraform.

Para configurar o VPC Lattice como um gatilho para uma função Lambda no Console, navegue até a função desejada e selecione a guia Configuration. Selecione o menu Triggers à esquerda e escolha Add trigger.

O assistente de configuração de gatilho permite que você defina um novo serviço VPC Lattice fornecido pela função Lambda ou adicione a um serviço existente. Ao adicionar a um serviço existente, o assistente permite a configuração de roteamento baseado em caminho que envia solicitações para o grupo de destino que inclui a função. Roteamento baseado em caminho e outros mecanismos de roteamento disponíveis no VPC Lattice são úteis em cenários de migração.

Este exemplo mostra a criação de um novo serviço. Forneça um nome único para o serviço e selecione a rede de serviços VPC Lattice desejada. Se você não criou uma rede de serviços, siga o link para criar uma nova rede de serviços no Console VPC (para criar uma nova rede de serviços, leia a documentação do VPC Lattice).

A configuração do listener permite que você configure o protocolo e a porta na qual o serviço está acessível. HTTPS (porta 443) é a configuração padrão, embora você também possa configurar o listener para HTTP (porta 80). Observe que configurar o listener para HTTP não altera o comportamento do Lambda: ele ainda é invocado pelo VPC Lattice através de um endpoint HTTPS, mas o endpoint do serviço está disponível como HTTP. Escolha Add para concluir a configuração.

Além de configurar o serviço VPC Lattice e o grupo de destino, o assistente do Lambda também adiciona uma política de recursos à função que permite que o grupo de destino do VPC Lattice invoque a função.

Add trigger

Integração com VPC Lattice

Quando um cliente envia uma solicitação para um serviço VPC Lattice apoiado por um grupo de destino Lambda, o VPC Lattice invoca sincronamente a função Lambda de destino. Durante uma invocação síncrona, o cliente aguarda o resultado da função e todo o tratamento de repetição é realizado pelo cliente. O VPC Lattice tem um tempo limite de inatividade de um minuto e tempo limite de conexão de dez minutos tanto para o cliente quanto para o destino.

A carga útil do evento recebida pela função Lambda quando invocada pelo VPC Lattice é semelhante ao exemplo a seguir. Observe que a codificação base64 depende do tipo de conteúdo.

{
    "body": "{ "\userId\": 1234, \"orderId\": \"5C71D3EB-3B8A-457B-961D\" }",
    "headers": {
        "accept": "application/json, text/plain, */*",
        "content-length": "156",
        "user-agent": "axios/1.3.4",
        "host": "myvpclattice-service-xxxx.xxxx.vpc-lattice-svcs.us-east-2.on.aws",
        "x-forwarded-for": "10.0.129.151"
    },
    "is_base64_encoded": false,
    "method": "PUT",
    "query_string_parameters": {
        "action": "add"
    },
    "raw_path": "/points?action=add"
}

A carga útil de resposta retornada pela função Lambda inclui um código de status, cabeçalhos, codificação base64 e um corpo opcional, conforme mostrado no exemplo a seguir. Uma carga útil de resposta que não atende à especificação necessária resulta em um erro. Para retornar conteúdo binário, você deve definir isBase64Encoded como true.

{
    "isBase64Encoded": false,
    "statusCode": 200,
    "statusDescription": "200 OK",
    "headers": {
        "Set-Cookie": "cookies",
        "Content-Type": "application/json"
    },
    "body": "Hello from Lambda (optional)"
}

Para mais detalhes sobre a integração entre VPC Lattice e Lambda, visite a documentação do Lambda.

Chamando serviços VPC Lattice a partir do Lambda

Os serviços VPC Lattice suportam conectividade através de protocolos HTTP/HTTPS e gRPC, bem como acesso aberto ou autorização usando IAM. Para chamar um serviço VPC Lattice, a função Lambda deve estar anexada a uma VPC que está associada a uma rede de serviços VPC Lattice:

Embora uma função que chama um serviço VPC Lattice deva estar associada a uma VPC apropriada, uma função Lambda que faz parte de um grupo de destino de serviço Lattice não precisa estar anexada a uma VPC. Lembre-se de que as funções Lambda são sempre invocadas através de um endpoint AWS com acesso controlado pelo AWS IAM.

Chamadas para um serviço VPC Lattice são semelhantes ao envio de uma solicitação para outros serviços HTTP/HTTPS. O VPC Lattice permite que os desenvolvedores definam uma política de autenticação opcional para impor autenticação e realizar autorização específica do contexto e implementar controles de nível de rede com grupos de segurança. Os chamadores do serviço devem atender aos requisitos de rede e autorização para acessar o serviço. O VPC Lattice bloqueia o tráfego se ele não atender explicitamente a todas as condições antes que sua função seja invocada.

Uma função Lambda que chama um serviço VPC Lattice deve ter permissão explícita para invocar esse serviço, a menos que o tipo de autenticação para o serviço seja NONE. Você fornece essa permissão através de uma política anexada à função de execução da função Lambda, por exemplo:

{
    "Action": "vpc-lattice-svcs:Invoke",
    "Resource": "arn:aws:vpc-lattice:us-east-2:123456789012:service/svc-123abc/*",
    "Effect": "Allow"
}

Se a política de autenticação associada à sua rede de serviços ou serviço exigir solicitações autenticadas, quaisquer solicitações feitas a esse serviço devem conter uma assinatura de solicitação válida computada usando Signature Version 4 (SigV4). Um exemplo de computação de uma assinatura SigV4 pode ser encontrado na documentação do VPC Lattice. O VPC Lattice não suporta assinatura de carga útil neste momento. Em TypeScript, você pode assinar uma solicitação usando o AWS SDK e a biblioteca Axios da seguinte forma:

import { SignatureV4 } from "@aws-sdk/signature-v4";
import { Sha256 } from "@aws-crypto/sha256-js";
import axios from "axios";

const endpointUrl = new URL(VPC_LATTICE_SERVICE_ENDPOINT);
const sigv4 = new SignatureV4({
    service: "vpc-lattice-svcs",
    region: process.env.AWS_REGION!,
    credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
        sessionToken: process.env.AWS_SESSION_TOKEN
    },
    sha256: Sha256
});

const signedRequest = await sigv4.sign({
    method: "PUT",
    hostname: endpointUrl.host,
    path: endpointUrl.pathname,
    protocol: endpointUrl.protocol,
    headers: {
        'Content-Type': 'application/json',
        host: endpointUrl.hostname,
        // Include following header as VPC Lattice does not support signed payloads
        "x-amz-content-sha256": "UNSIGNED-PAYLOAD"
    }
  });    
  const { data } = await axios({
    ...signedRequest,
    data: {
        // some data
    },
    url: VPC_LATTICE_SERVICE_ENDPOINT
  });

O VPC Lattice fornece várias camadas de controles de segurança, incluindo políticas de nível de rede e autenticação, que permitem (ou negam) acesso de um cliente ao seu serviço. Esses controles podem ser implementados na rede de serviços, aplicando esses controles em todos os serviços da rede.

Conectando-se a qualquer serviço VPC Lattice

O VPC Lattice suporta serviços construídos usando Amazon EKS e Amazon EC2 além do Lambda. Chamar serviços construídos usando essas outras opções de computação parece exatamente o mesmo para o chamador como no exemplo anterior. O VPC Lattice fornece um endpoint que abstrai como o serviço em si é realmente implementado.

Uma função Lambda configurada para acessar recursos em uma VPC pode potencialmente acessar serviços VPC Lattice que fazem parte da rede de serviços associada a essa VPC. Permissões IAM, a política de autenticação associada ao serviço e grupos de segurança também podem impactar se a função pode invocar o serviço (consulte a documentação do VPC Lattice para detalhes sobre como proteger seus serviços).

Serviços implantados em um cluster Amazon EKS também podem invocar funções Lambda expostas como serviços VPC Lattice usando semântica nativa do Kubernetes. Eles podem usar o nome de domínio gerado pelo VPC Lattice ou um nome de domínio personalizado configurado para invocar a função Lambda em vez do API Gateway ou de um Application Load Balancer (ALB). Consulte este post do blog no AWS Container Blog para detalhes sobre como um serviço Amazon EKS invoca um serviço VPC Lattice com controle de acesso habilitado.

Construindo APIs Serverless privadas

Com o lançamento do VPC Lattice, a AWS agora oferece várias opções para construir APIs Serverless acessíveis apenas dentro da sua VPC de cliente. Essas opções incluem API Gateway, ALB e VPC Lattice. Cada um desses serviços oferece um conjunto único de recursos e compensações que podem tornar um mais adequado para sua carga de trabalho do que outros.

APIs privadas com API Gateway fornecem um rico conjunto de recursos, incluindo limitação, cache e chaves de API. O API Gateway também oferece um rico conjunto de opções de autorização e roteamento. Conhecimento detalhado de rede e DNS pode ser necessário em ambientes complexos. Controles de nível de rede e política de recursos estão disponíveis para controlar o acesso e a especificação OpenAPI permite o compartilhamento de esquema.

O Application Load Balancer fornece flexibilidade e um rico conjunto de opções de roteamento, incluindo para uma variedade de destinos. O ALB também pode oferecer um endereço IP estático através do AWS Global Accelerator. Conhecimento detalhado de rede é necessário para configurar conectividade entre VPC/conta. O ALB depende de controles de nível de rede.

Redes de serviços no VPC Lattice simplificam o acesso a serviços em EC2, EKS e Lambda entre VPCs e contas sem exigir conhecimento detalhado de rede e DNS. O VPC Lattice fornece um meio centralizado de gerenciar controle de acesso e proteções para comunicação serviço a serviço. O VPC Lattice também suporta prontamente nomes de domínio personalizados e recursos de roteamento (caminho, método, cabeçalho) que permitem aos clientes construir APIs privadas complexas sem a complexidade de gerenciar rede. O VPC Lattice pode ser usado para fornecer comunicação entre serviços leste-oeste em combinação com API Gateway e AWS AppSync para fornecer endpoints públicos para seus serviços.

Conclusão

Estamos entusiasmados com a conectividade simplificada agora disponível com o VPC Lattice. Os desenvolvedores podem se concentrar em criar valor para o cliente e recursos diferenciados em vez de rede complexa, da mesma forma que o Lambda permite que você se concentre em escrever código. Se você está interessado em aprender mais sobre o VPC Lattice, recomendamos o Guia do Usuário do VPC Lattice.

Para aprender mais sobre Serverless, visite Serverless Land para uma ampla variedade de padrões reutilizáveis, tutoriais e materiais de aprendizado.


Este conteúdo foi traduzido do post original do blog, que pode ser encontrado aqui.

Autores

Marcia Villalba é Principal Developer Advocate na Amazon Web Services.

Tradutores

Nicolas Tarzia é Senior Technical Account Manager na AWS, com mais de 13 anos de experiência, com ampla experiência em arquitetura cloud, engenharia e design de software. Sua área de interesse são tecnologias serverless.
https://www.linkedin.com/in/nicolastarzia
Daniel Abib é Arquiteto de Soluções Sênior e Especialista em Amazon Bedrock na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e especialização em Machine Learning. Ele trabalha apoiando Startups, ajudando-os em sua jornada para a nuvem.
https://www.linkedin.com/in/danielabib/