Consolide a geração de URL pré-assinada e os downloads de objetos do Amazon S3 usando um endpoint associado a endereços IP estáticos - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Consolide a geração de URL pré-assinada e os downloads de objetos do Amazon S3 usando um endpoint associado a endereços IP estáticos

Song Jin, Eunhye Jo e Jun Soung Lee, da Amazon Web Services

Resumo

Esse padrão simplifica o acesso ao Amazon Simple Storage Service (Amazon S3) criando um padrão seguro e personalizado para downloads de objetos. URLs A solução fornece um único endpoint com um domínio exclusivo e endereços IP estáticos. Ele é feito sob medida para clientes que precisam da consolidação da API e dos endpoints do Amazon S3 em um domínio unificado com endereços IP estáticos. O caso de uso envolve usuários seguindo uma política de firewall de IP e lista de permissões de domínio, limitando o acesso à API a domínios e endereços IP específicos.

A arquitetura emprega chaves Serviços da AWS, incluindo AWS Global Accelerator Amazon API Gateway AWS Lambda, Application Load Balancer AWS PrivateLink e Amazon S3. Esse design centraliza a API para gerar o endpoint pré-assinado URLs e o Amazon S3 em um único domínio, vinculado a um acelerador com dois endereços IP estáticos. Consequentemente, os usuários podem facilmente solicitar objetos pré-assinados do Amazon S3 URLs e baixá-los por meio de um endpoint de domínio unificado com endereços IP estáticos.

Essa arquitetura é especialmente benéfica para clientes com políticas rígidas ou requisitos de conformidade, como os dos setores público, médico e financeiro.

Pré-requisitos e limitações

Pré-requisitos

  • Um ativo Conta da AWS

  • Uma zona pública hospedada para seu nome de domínio personalizado

  • Um domínio importado em AWS Certificate Manager (ACM) no Região da AWS de sua escolha

Limitações

  • O nome do bucket do Amazon S3 deve corresponder ao nome de domínio do endpoint. Esse requisito é garantir que o endpoint do Amazon S3 possa ser servido por meio de um único endpoint de API.

  • O nome de domínio personalizado usado no API Gateway deve estar alinhado com o nome de domínio do único endpoint da API.

  • Alguns Serviços da AWS não estão disponíveis em todos Regiões da AWS. Para saber a disponibilidade da região, consulte AWS Serviços por região. Para endpoints específicos, consulte Endpoints e cotas de serviço e escolha o link para o serviço.

Arquitetura

O diagrama a seguir mostra a arquitetura de destino e o fluxo de trabalho desse padrão.

Componentes e fluxo de trabalho para geração de URL pré-assinada e download de objetos.

O diagrama ilustra o seguinte conceito e fluxo de trabalho:

  1. Um usuário inicia uma solicitação para gerar um URL pré-assinado usando o endpoint personalizado servido por meio do AWS Global Accelerator nome de domínio personalizado e os endereços IP associados.

  2. Uma função Lambda gera o URL pré-assinado, apontando para o endpoint personalizado. Ele responde com um redirecionamento 301 que contém o URL pré-assinado gerado. Por meio do URL pré-assinado redirecionado, o usuário baixa o objeto automaticamente usando o endpoint personalizado servido pelo Global Accelerator.

Os componentes da arquitetura geral para geração de URL pré-assinada e fluxo de trabalho de download de objetos são os seguintes:

  • Provisionamento de endereços IP estáticos pelo Global Accelerator.

  • Registro do alias do acelerador como um registro A na zona hospedada pública do Amazon Route 53 com o nome de domínio personalizado.

  • Criação de um bucket do Amazon S3 com um nome de bucket que corresponda ao nome de domínio personalizado registrado.

  • Criação de endpoints VPC para o API Gateway e o serviço Amazon S3.

  • Configuração de um Application Load Balancer interno para se conectar ao Global Accelerator.

  • Atribuição de um nome de domínio personalizado para o API Gateway com um certificado ACM anexado.

  • Implantação de um API Gateway privado integrado a uma função Lambda.

  • A função Lambda é equipada com uma função AWS Identity and Access Management (IAM) anexada (com GetObjectpermissões).

Ferramentas

Serviços da AWS

  • O Amazon API Gateway ajuda você a criar, publicar, manter, monitorar e proteger REST, HTTP e WebSocket APIs em qualquer escala.

  • Os Application Load Balancers distribuem o tráfego de entrada do aplicativo em vários destinos, como instâncias do Amazon Elastic Compute Cloud (Amazon EC2), em várias zonas de disponibilidade.

  • AWS Certificate Manager (ACM) ajuda você a criar, armazenar e renovar certificados e chaves SSL/TLS X.509 públicos e privados que protegem seus AWS sites e aplicativos.

  • AWS Cloud Development Kit (AWS CDK)é uma estrutura de desenvolvimento de software que ajuda você a definir e provisionar Nuvem AWS infraestrutura em código.

  • AWS Global Acceleratoré um serviço global que oferece suporte a vários Regiões da AWS endpoints. Você pode criar aceleradores que direcionam o tráfego para endpoints ideais na rede AWS global. Isso melhora a disponibilidade e o desempenho de seus aplicativos da Internet que são usados por um público global.

  • AWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.

  • O AWS Lambda é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

  • AWS PrivateLinkajuda você a criar conexões unidirecionais e privadas de suas nuvens privadas virtuais (VPCs) para serviços fora da VPC.

  • O Amazon Route 53 é um serviço web de DNS altamente disponível e escalável.

  • O Amazon Simple Storage Service (Amazon S3) é um serviço de armazenamento de objetos baseado na nuvem que ajuda você a armazenar, proteger e recuperar qualquer quantidade de dados.

Outras ferramentas

  • O Terraform é uma ferramenta de infraestrutura como código (IaC) HashiCorp que ajuda você a criar e gerenciar recursos na nuvem e no local.

Repositório de código

Você pode implantar esse padrão usando o AWS CDK ou o Terraform de acordo com sua preferência. A seção Epics contém instruções para os dois métodos de implantação. O código desse padrão está disponível nos seguintes GitHub repositórios:

Práticas recomendadas

Épicos

TarefaDescriçãoHabilidades necessárias

Escolha um nome de domínio.

Escolha um nome de domínio público para o endpoint unificado do Amazon S3. O nome de domínio também é usado como o nome do bucket do Amazon S3.

Administrador da AWS, administrador de rede

Crie uma zona hospedada pública.

Crie uma zona hospedada pública no Amazon Route 53. Seu nome de domínio deve corresponder ao nome de domínio usado no API Gateway.

Administrador da AWS, administrador de rede

Prepare um certificado SSL.

Use AWS Certificate Manager (ACM) para solicitar ou importar um certificado SSL para o domínio do seu aplicativo web.

Administrador da AWS, administrador de rede
TarefaDescriçãoHabilidades necessárias

Configure o ambiente de desenvolvimento do Terraform.

Para configurar o ambiente de desenvolvimento, faça o seguinte:

  1. Instale o Terraform versão 1.0 ou posterior.

  2. Clone o repositório GitHub s3- presignedurl-staticips-endpoint-with -terraform executando o seguinte comando em uma janela de terminal:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-terraform.git

Administrador da AWS, administrador de nuvem

Modifique .tfvars os provider.tfarquivos e.

  1. Crie os .tfvars arquivos necessários Crie apg.tfvars arquivos nos 2.apigw_s3_lambda diretórios 1.vpc_alb_ga e. Esses arquivos conterão os valores das variáveis específicas do seu ambiente.

    • Para1.vpc_alb_ga/apg.tfvars, crie um arquivo com o seguinte modelo:

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • Para2.apigw_s3_lambda/apg.tfvars, crie um arquivo com o modelo a seguir (você precisará atualizá-lo vpc_id depois de concluir a etapa 1):

      hcl vpc_id = "vpc-xxxxxxxxx" # Update this with the VPC ID output from step 1 environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
  2. Modifique os provider.tf arquivos Nas 2.apigw_s3_lambda pastas 1.vpc_alb_ga e, edite os provider.tf arquivos para que correspondam à sua AWS configuração local:

    hcl provider "aws" { region = "ap-northeast-2" # Change to your preferred region profile = "apg" # Change to your AWS profile name }

Observe o seguinte:

  • Substitua os valores do espaço reservado nos .tfvars arquivos pelos valores reais.

  • Depois de concluir a primeira implantação do Terraform (1.vpc_alb_ga), atualize o vpc_id valor 2.apigw_s3_lambda/apg.tfvars com o ID da VPC da saída.

  • Certifique-se de que o nome AWS do seu perfil no provider.tf arquivo corresponda a um perfil existente no seu ~/.aws/credentials arquivo.

  • O valor do domínio deve corresponder ao seu domínio da zona hospedada do Route 53.

  • O domínio s3_bucket_prefix combinado com formará seu nome de bucket do Amazon S3 (por exemplo,your-bucket-prefix.your-domain.com).

  • Se você mudaraws_region, talvez também precise atualizar as zonas de disponibilidade codificadas nos main.tf arquivos para que correspondam à sua escolha. Região da AWS

Administrador da AWS, administrador de nuvem

Provisionar recursos de rede.

Para provisionar recursos de rede, execute os seguintes comandos:

cd ./2.vpc_alb_ga terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars

Durante a execução do apply comando, digite yes quando solicitado.

Administrador da AWS, administrador de nuvem

Provisione o API Gateway, Amazon S3 e Lambda.

Para provisionar recursos de rede, use os seguintes comandos:

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
Administrador da AWS, administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Configure o ambiente AWS CDK de desenvolvimento.

Para configurar o ambiente de desenvolvimento, faça o seguinte:

  1. Instale AWS CDK o.

  2. Clone o repositório GitHub s3- presignedurl-staticips-endpoint-with -cdk executando o seguinte comando em uma janela de terminal:

    git clone https://github.com/aws-samples/s3-presignedurl-staticips-endpoint-with-cdk.git

Administrador da AWS, administrador de nuvem

Defina as configurações do domínio no config/index.ts arquivo.

Para editar as opções da variável constante, use os seguintes comandos:

export const options = { certificateArn: '{arn of the acm which created before}', dnsAttr: { zoneName: '{public hosted zone name}', hostedZoneId: 'hosted zone Id', }, domainNamePrefix: '{Prefix for the domain}', presignPath: 'presign', objectsPath: 'objects', };

Nos comandos, substitua cada espaço reservado por suas próprias informações:

  • '{arn of the acm which created before}'Substitua pelo seu certificado ACM Amazon Resource Name (ARN).

  • '{public hosted zone name}'Substitua pelo seu nome de domínio.

  • 'hosted zone Id'Substitua pelo ID da zona hospedada do Route 53.

  • '{Prefix for the domain}'Substitua pelo prefixo de domínio que você deseja usar.

  • Opcionalmente, modifique 'presign' os 'objects' caminhos, se necessário, para seu caso de uso específico.

Administrador da AWS, administrador de nuvem

Implante as pilhas.

Para implantar duas pilhas, uma para a nuvem privada virtual (VPC) e outra para o aplicativo, use o seguinte comando:

$ npm install $ cdk synth $ cdk deploy --all
Administrador da AWS, administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Verifique os endereços IP do endpoint.

Para verificar se o domínio desse padrão tem endereços IP estáticos, use o seguinte comando:

nslookup ${s3-bucket-prefix}.${domain}
Administrador de rede

Faça upload de um arquivo de teste que você possa baixar posteriormente.

Faça o upload do arquivo de teste para a '/objects' pasta no bucket do Amazon S3.

Administrador da AWS, administrador de nuvem

Invoque a API para gerar um URL pré-assinado.

Para gerar uma URL pré-assinada, chame a URL de um navegador ou cliente de API (por exemplo, Postman) usando o seguinte formato:

https://${s3-bucket-prefix}.${domain}/presign/objects/${uploaded-filename}

Substitua os valores do espaço reservado em ${s3-bucket-prefix} e ${domain} pelos valores que você definiu nas etapas anteriores.

Proprietário do App

Confira o resultado.

O resultado esperado é que você receba um código de status de redirecionamento 301 (movido permanentemente). Essa resposta conterá o URL pré-assinado, que deve iniciar automaticamente o download do seu arquivo de teste.

Engenheiro de testes
TarefaDescriçãoHabilidades necessárias

Destrua os recursos do API Gateway, Amazon S3 e Lambda.

Para excluir recursos, use os seguintes comandos:

cd ./2.apigw_s3_lambda terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
Administrador da AWS, administrador de nuvem

Destrua os recursos da rede.

Para excluir recursos de rede, use os seguintes comandos:

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
Administrador da AWS, administrador de nuvem
TarefaDescriçãoHabilidades necessárias

Destrua as pilhas.

Para destruir as pilhas de VPC e de aplicativos, use o seguinte comando:

$ cdk destroy --all
Administrador da AWS, administrador de nuvem

Esvazie e exclua os buckets do Amazon S3.

Esvazie e exclua o objeto Amazon S3 bucket e os logs do Amazon S3 bucket que não são excluídos por padrão.

Os nomes dos buckets do Amazon S3 são e. ${s3-bucket-prefix}.${domain} ${s3-bucket-prefix}.${domain}-logs

Se você preferir usar o AWS Command Line Interface (AWS CLI) para excluir os buckets, use os seguintes comandos:

$ aws s3 rm s3://${s3-bucket-prefix}.${domain} --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain} --force $ aws s3 rm s3://${s3-bucket-prefix}.${domain}-logs --recursive $ aws s3 rb s3://${s3-bucket-prefix}.${domain}-logs --force

Substitua ${s3-bucket-prefix} e ${domain} pelos valores que você definiu nas etapas anteriores. , /p>

Administrador da AWS, administrador de nuvem

Recursos relacionados

AWS Blogs