O blog da AWS
Integrando com Amazon S3 de forma transparente em uma arquitetura multi-região
Por Luiz Yanai, Arquiteto de Soluções na AWS
Introdução e casos de uso
Existem diferentes cenários e casos de uso que demandam o uso de recursos dispersos globalmente para se compor uma solução. Um deles é a necessidade de se levarem recursos para regiões mais próximas dos consumidores de forma a diminuir a latência de acesso aos mesmos. Em cenários de recuperação de desastres, manter uma cópia dos seus recursos/dados em outras regiões permite um retorno mais rápido das aplicações em casos de falhas locais diminuindo o Recovery Point Objective (RPO) e o Recovery Time Objective (RTO).
As capacidades da nuvem AWS oferecem formas de se implementar facilmente uma arquitetura globalmente distribuída suportando os cenários mencionados. Contudo, é interessante que a complexidade da infraestrutura não se traduza para uma maior complexidade na parte de código de implementação.
Quando falamos de recursos, um tipo bastante crítico em qualquer arquitetura são os dados. Dados podem ser armazenados de diferentes formas e formatos e em diferentes serviços: bancos de dados, armazenamento em bloco, armazenamento de objetos entre outros. Um serviço chave que acaba sendo um alicerce para replicação de dados multi-região é o Amazon S3.
Em Setembro de 2021, uma nova feature foi lançada oferecendo um endpoint global para que os consumidores acessem buckets únicos ou replicados em múltiplas regiões usando rotas com menor latência, chamada Amazon S3 Multi-region Access Point.
Feature de Multi-Region Access Point do Amazon S3
Amazon S3 Multi-Region Access Points fornece um endpoint global que as aplicações podem usar para submeter suas requisições para buckets do S3 localizados em múltiplas regiões da AWS. Você pode usar os Multi-Region Access Points para construir aplicações multi-região com a mesma arquitetura simples usada em uma única região, e então rodar suas aplicações em qualquer lugar do mundo. Ao invés de enviar requisições através de uma internet pública congestionada, os Multi-Region Access Points fornecem resiliência de rede incorporada com aceleração das requisições para o Amazon S3. Requisições de aplicação feitas para um endpoint global do Multi-Region Access Point usa o AWS Global Accelerator para rotear automaticamente através da rede global da AWS até o bucket do S3 com a menor latência de rede.
Quando você cria um Multi-Region Access Point, você especifica uma lista de regiões onde você quer armazenar os seus dados para serem servidos através do mesmo. Você pode usar o S3 Cross-Region Replication (CRR) para sincronizar dados entre buckets nestas regiões. São suportadas tanto leituras como escritas de dados através do endpoint. O Amazon S3 automaticamente serve a requisições com o dataset replicado que está disponível na região com menor latência. Um ponto importante é que os Multi-Region Access Points estão também disponíveis para serem acessados por aplicações executando em Amazon virtual private clouds (VPCs), incluindo aquelas que usam o AWS PrivateLink para o Amazon S3.
Acessando buckets em múltiplas regiões
Antes do lançamento desta nova feature, na implementação das chamadas para o Amazon S3 era necessário definir o endpoint regional do serviço para realizar o acesso (ou usar o valor padrão de acordo com as configurações locais). O Amazon S3 disponibiliza diferentes SDKs (Node.js, Python, .NET, Java, etc…) para realizar este acesso e que podem ter comportamento diferentes com relação a tratativa no caso de não encontrar o recurso na região configurada no endpoint.
Para alguns SDKs, a mensagem “The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.” é retornada quando o bucket/objeto não existe na região definida.
Para abstrair este tipo de comportamento e até para suportar cenários com replicação de buckets multi-região, recomenda-se utilizar o alias do multi-region access point nas chamadas sem necessidade de indicar nenhuma informação da região.
Para ficar claro a arquitetura sugerida, veja o exemplo a seguir:
Neste cenário, temos três buckets disponíveis em três regiões distintas (bucket A em São Paulo, bucket B em Oregon e bucket C em North Virginia) e uma série de microserviços dentro de uma VPC na região de São Paulo. Os buckets A e B possuem os mesmos objetos (arquivos) e fazem uso da feature de Cross Region Replication (CRR) do Amazon S3 para manter a sincronia dos objetos.
Os microserviços precisam acessar dados dos três buckets de acordo com necessidades específicas e deseja-se evitar que a informação de região esteja definida na implementação das chamadas. Para isto, são criados dois Multi-region access points: um para o bucket C em Virgínia e outro para acessar os objetos replicados nos buckets A e B.
Já pensando em um cenário de acesso mais seguro, ao invés de acessar os endpoints dos Multi-region access points via internet pública, vamos acessá-los via VPC endpoint configurado na VPC e subnet privada(s) onde rodam os serviços que consomem os buckets do S3.
Existe um tipo de Interface Endpoint específico para este recurso (com.amazonaws.s3-global.accesspoint) que é diferente do VPC endpoint para acesso privado ao S3 (com.amazonaws.<region>.s3). Por ser um endpoint do tipo Interface são criadas ENIs (interfaces de rede elásticas) nas subnets privadas com um DNS privado para acesso, nenhuma regra de roteamento específica é necessária.
A parte de configuração dos multi-regions access point é bem simples. Para o caso de criar um alias para apenas um bucket (bucket C no exemplo), basta adicionar o bucket na configuração. O multi-region access point suporta também o cenário de cadastro de mais de um bucket associado ao alias (buckets A e B) e neste caso, o acesso feito pela aplicação cliente (service A, …, N) localiza o bucket que oferece a menor latência de acesso dentro os incluídos na configuração.
Um exemplo de código fazendo uso do alias é o seguinte:
Código de exemplo para chamada usando SDK Node.js.
const { S3Client, ListObjectsCommand } = require("@aws-sdk/client-s3"); async function start() { const client = new S3Client({ region: "us-east-1" }); const bucketParams = { Bucket: "arn:aws:s3::012345678910:accesspoint/<generatedalias>.mrap" }; const command = new ListObjectsCommand(bucketParams); const response = await client.send(command); console.log(response.Contents); } start();
Notem que o client do S3 foi configurado com uma região específica (North Virginia = us-east-1). Contudo, o acesso ao bucket não se dará pelo endpoint regional de Virgínia mas por um endpoint global dado que nos parâmetros da consulta do bucket foi passado o alias do Multi-region access point.
O que muda na implementação é somente o apontamento para o alias (ARN) do multi-region access point ao invés do nome do bucket. O SDK identifica que se trata de um MRAP (multi-region access point) e utiliza o endpoint global para acessar o bucket. Pode-se apontar qualquer região para o cliente do S3 que não é retornada nenhuma mensagem de erro relacionada a endpoint.
Esta forma de chamada funciona tanto para roteamento direto pela internet ou via VPC endpoint.
Os passos de configuração via console do Multi-Region Access point e do Interface endpoint na VPC são listados a seguir:
Configuração
Para criar um Multi-Region Access Point
- Faça sign in no console de gerenciamento da AWS e abra o console do Amazon S3 em https://console.aws.amazon.com/s3/.
- No painel de navegacão, escolha Multi-Region Access Points.
- No campo Multi-Region Access Point name, dê um nome para o Multi-Region Access Point.
- Para selecionar os buckets que serão associados com este Multi-Region Access Point, escolha Add buckets .
Para criar um novo bucket, escolha Create bucket. Depois de criar o bucket, escolha Add buckets para adicionar o bucket ao Multi-Region Access Point. - Sob Block Public Access settings for this Multi-Region Access Point, selecione as configurações de Bloqueio de Acesso público que deseja aplicar ao Multi-Region Access Point. Por padrão, todas as configurações de Block Public Access são habilitadas para um novo Multi-Region Access Points. Recomendamos que deixe todas as configurações habilitadas a menos que você saiba que exista uma necessidade específica para desabilitar alguma delas.
- Escolha Create Multi-Region Access Point.
Um alias e ARN são gerados para o Multi-Region Access Point que será posteriormente utilizado para acessar o conteúdo e operações de gerenciamento do bucket.
Para criar um interface endpoint para o Multi-Region Access Point usando o console
- Abra o console do Amazon VPC em https://console.aws.amazon.com/vpc/.
- No painel de navegação, escolha Endpoints, Create Endpoint.
- Em Service category, assegure que esteja selecionado AWS services.
- Em Service Name, escolha o serviço correspondente ao Multi-Region Access Point:
com.amazonaws.s3-global.accesspoint. - Complete com as seguintes informações e então clique em Create endpoint.
- Para VPC, selecione a VPC na qual será criado o endpoint.
- Para Subnets, selecione as subnets (Availability Zones) nas quais as interfaces de rede serão criadas para o endpoint.
- Para Security group, selecione os security groups para associar com as interface de rede do endpoint.
- Defina a política de acesso ao recurso do Interface Endpoint. Escolha Full access para liberar o acesso ao endpoint por qualquer usuário ou serviço. Alternativamente, defina um política customizada limitando o acesso.
Observação: O security group associado as interfaces de rede do endpoint devem permitir que a aplicação consumidora acesse a porta 443 para invocar a api do Amazon S3.
Conclusão
Neste blog post vimos como o recurso do Multi-Region Access Point (MRAP) do Amazon S3 permite que criemos soluções multi-região de forma simples abstraindo a complexidade de acesso a recursos regionais. Além de facilitar a lógica de implementação da aplicação cliente, o MRAP oferece melhor performance ao fazer uso do AWS Global Accelerator e também oferece segurança ao suportar uso de VPC Endpoints para acesso privado aos buckets do Amazon S3.
Ainda sobre a questão de segurança, com o uso de access points fica mais fácil a gestão de políticas de acessos IAM para os buckets e pode-se inclusive incluir regras validando origem das requisições somente vindas da VPC dos serviços, evitando acesso direto e externo. Esta última configuração é feita no VPC endpoint.
Segue um blog post que discute este controle e que pode ser aplicado também nesta arquitetura de exemplo:
Sobre o autor
Luiz Yanai é arquiteto de soluções na AWS e especialista em tecnologias Serverless e Data Analytics, atua auxiliando clientes de diversos segmentos em suas jornadas para a nuvem. Possui mais de 15 anos de experiência em arquitetura e desenvolvimento de soluções envolvendo sistemas empresariais e de missão crítica.