Consolide la generación de URL prefirmadas y las descargas de objetos de Amazon S3 mediante un punto de conexión asociado a direcciones IP estáticas - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Consolide la generación de URL prefirmadas y las descargas de objetos de Amazon S3 mediante un punto de conexión asociado a direcciones IP estáticas

Song Jin, Eunhye Jo y Jun Soung Lee, Amazon Web Services

Resumen

Este patrón simplifica el acceso a Amazon Simple Storage Service (Amazon S3) al crear descargas de objetos seguras y URLs prefirmadas personalizadas. La solución proporciona un único punto final con un dominio único y direcciones IP estáticas. Está diseñado para los clientes que requieren la consolidación de la API y los puntos de enlace de Amazon S3 en un dominio unificado con direcciones IP estáticas. El caso de uso implica que los usuarios sigan una política de firewall de listas de direcciones IP y dominios permitidos, lo que limita el acceso de la API a dominios y direcciones IP específicos.

La arquitectura emplea claves Servicios de AWS AWS Global Accelerator, como Amazon API Gateway AWS Lambda, Application Load Balancer y Amazon S3. AWS PrivateLink Este diseño centraliza la API para generar el punto final prefirmado URLs y el punto final de Amazon S3 en un único dominio, vinculado a un acelerador con dos direcciones IP estáticas. En consecuencia, los usuarios pueden solicitar URLs y descargar objetos de Amazon S3 prefirmados sin esfuerzo a través de un punto de enlace de dominio unificado con direcciones IP estáticas.

Esta arquitectura es especialmente beneficiosa para los clientes con políticas o requisitos de conformidad estrictos, como los de los sectores público, médico y financiero.

Requisitos previos y limitaciones

Requisitos previos 

  • Un activo Cuenta de AWS

  • Una zona alojada pública para tu nombre de dominio personalizado

  • Un dominio importado en AWS Certificate Manager (ACM) según Región de AWS su elección

Limitaciones

  • El nombre del bucket de Amazon S3 debe coincidir con el nombre de dominio del punto final. Este requisito es para garantizar que el punto de enlace Amazon S3 se pueda atender a través del punto de enlace de API único.

  • El nombre de dominio personalizado utilizado en API Gateway debe coincidir con el nombre de dominio del único punto final de la API.

  • Algunos Servicios de AWS no están disponibles en todos Regiones de AWS. Para ver la disponibilidad regional, consulta AWS Servicios por región. Para conocer puntos de enlace específicos, consulte Puntos de enlace y cuotas del servicio y elija el enlace para el servicio.

Arquitectura

El siguiente diagrama muestra la arquitectura y el flujo de trabajo de destino para este patrón.

Componentes y flujo de trabajo para la generación de URL prefirmadas y la descarga de objetos.

El diagrama ilustra el siguiente concepto y flujo de trabajo:

  1. Un usuario inicia una solicitud para generar una URL prefirmada mediante el punto de enlace personalizado a través del cual se sirve AWS Global Accelerator, utilizando el nombre de dominio personalizado y las direcciones IP asociadas.

  2. Una función Lambda genera la URL prefirmada y apunta al punto final personalizado. Responde con una redirección 301 que contiene la URL prefirmada generada. A través de la URL prefirmada redirigida, el usuario descarga el objeto automáticamente mediante el punto final personalizado ofrecido a través de Global Accelerator.

Los componentes de la arquitectura general para la generación de URL prefirmadas y el flujo de trabajo de descarga de objetos son los siguientes:

  • Aprovisionamiento de direcciones IP estáticas por parte de Global Accelerator.

  • Registro del alias del acelerador como registro A en la zona alojada pública de Amazon Route 53 con el nombre de dominio personalizado.

  • Creación de un bucket de Amazon S3 con un nombre de bucket que coincida con el nombre de dominio personalizado registrado.

  • Creación de puntos de enlace de VPC para API Gateway y el servicio Amazon S3.

  • Configuración de un Application Load Balancer interno para conectarse a Global Accelerator.

  • Asignación de un nombre de dominio personalizado para API Gateway con un certificado ACM adjunto.

  • Despliegue de una API Gateway privada integrada con una función Lambda.

  • La función Lambda está equipada con un rol AWS Identity and Access Management (IAM) adjunto (con GetObjectpermisos).

Herramientas

Servicios de AWS

  • Amazon API Gateway le ayuda a crear, publicar, mantener, supervisar y proteger REST, HTTP y WebSocket APIs a cualquier escala.

  • Los balanceadores de carga de aplicaciones distribuyen el tráfico de aplicaciones entrante entre varios destinos, como las instancias de Amazon Elastic Compute Cloud (Amazon EC2), en varias zonas de disponibilidad.

  • AWS Certificate Manager (ACM) le ayuda a crear, almacenar y renovar claves y certificados SSL/TLS X.509 públicos y privados que protegen sus AWS sitios web y aplicaciones.

  • AWS Cloud Development Kit (AWS CDK)es un marco de desarrollo de software que le ayuda a definir y aprovisionar la Nube de AWS infraestructura en código.

  • AWS Global Acceleratores un servicio global que admite varios Regiones de AWS puntos finales. Puede crear aceleradores que dirijan el tráfico a puntos finales óptimos a través de la AWS red global. De este modo, se mejora la disponibilidad y el rendimiento de las aplicaciones de Internet destinadas al público general.

  • AWS Identity and Access Management (IAM) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.

  • AWS Lambda es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

  • AWS PrivateLinkle ayuda a crear conexiones unidireccionales y privadas desde sus nubes privadas virtuales (VPCs) a servicios externos a la VPC.

  • Amazon Route 53 es un servicio web de sistema de nombres de dominio (DNS) escalable y de alta disponibilidad.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.

Otras herramientas

  • Terraform es una herramienta de infraestructura como código (IaC) HashiCorp que le ayuda a crear y administrar recursos locales y en la nube.

Repositorio de código

Puede implementar este patrón utilizando Terraform AWS CDK o Terraform según sus preferencias. La sección Epics contiene instrucciones para ambos métodos de despliegue. El código de este patrón está disponible en los siguientes GitHub repositorios:

Prácticas recomendadas

  • Para mejorar la seguridad en el entorno de producción, es crucial implementar mecanismos de autorización, como Amazon Cognito, para restringir el acceso a la API de PresignedUrl generación.

  • Siga el principio del mínimo privilegio y conceda los permisos mínimos necesarios para realizar una tarea. Para obtener más información, consulte Otorgar privilegio mínimo y Prácticas recomendadas de seguridad en la documentación de IAM.

Epics

TareaDescripciónHabilidades requeridas

Elige un nombre de dominio.

Elija un nombre de dominio público para el punto de conexión unificado de Amazon S3. El nombre de dominio también se utiliza como nombre del bucket de Amazon S3.

Administrador de AWS, administrador de red

Creación de una zona alojada pública.

Cree una zona alojada pública en Amazon Route 53. Su nombre de dominio debe coincidir con el nombre de dominio que se usa en API Gateway.

Administrador de AWS, administrador de red

Prepare un certificado SSL.

Utilice AWS Certificate Manager (ACM) para solicitar o importar un certificado SSL para el dominio de su aplicación web.

Administrador de AWS, administrador de red
TareaDescripciónHabilidades requeridas

Configure el entorno de desarrollo de Terraform.

Para configurar el entorno de desarrollo, haga lo siguiente:

  1. Instale Terraform versión 1.0 o posterior.

  2. Clone el repositorio GitHub s3- presignedurl-staticips-endpoint-with -terraform ejecutando el siguiente comando en una ventana de terminal:

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

Administrador de la nube, administrador de AWS

Modifique los archivos .tfvars y. provider.tf

  1. Crear los .tfvars archivos necesarios: cree apg.tfvars archivos en los 2.apigw_s3_lambda directorios 1.vpc_alb_ga y. Estos archivos contendrán los valores de las variables específicos de su entorno.

    • Para ello1.vpc_alb_ga/apg.tfvars, cree un archivo con la siguiente plantilla:

      hcl environment_name = "test" domain = "your-domain.com" s3_bucket_prefix = "your-bucket-prefix" aws_region = "ap-northeast-2" # Change to your preferred region
    • Para 2.apigw_s3_lambda/apg.tfvars ello, cree un archivo con la siguiente plantilla (tendrá que actualizarla vpc_id después de completar el paso 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 los provider.tf archivos: tanto en la 1.vpc_alb_ga carpeta como en la 2.apigw_s3_lambda carpeta, edite los provider.tf archivos para que coincidan con su AWS configuración local:

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

Tenga en cuenta lo siguiente:

  • Sustituya los valores de los marcadores de posición de los .tfvars archivos por sus valores reales.

  • Tras completar el primer despliegue de Terraform (1.vpc_alb_ga), actualiza el vpc_id valor 2.apigw_s3_lambda/apg.tfvars con el ID de VPC del resultado.

  • Asegúrese de que el nombre AWS de su perfil en el provider.tf archivo coincida con un perfil existente en el archivo~/.aws/credentials.

  • El valor del dominio debe coincidir con el dominio de la zona alojada de Route 53.

  • La s3_bucket_prefix combinación con el dominio formará el nombre de su bucket de Amazon S3 (por ejemplo,your-bucket-prefix.your-domain.com).

  • Si cambiasaws_region, es posible que también tengas que actualizar las zonas de disponibilidad codificadas de los main.tf archivos para que coincidan con las que has elegido Región de AWS.

Administrador de la nube, administrador de AWS

Aprovisione los recursos de la red.

Para aprovisionar recursos de red, ejecute los siguientes comandos:

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

Durante la ejecución del apply comando, escriba cuando se le pida.

Administrador de la nube, administrador de AWS

Aprovisione API Gateway, Amazon S3 y Lambda.

Para aprovisionar recursos de red, utilice los siguientes comandos:

cd ./2.apigw_s3_lambda terraform init terraform plan --var-file=apg.tfvars terraform apply --var-file=apg.tfvars
Administrador de la nube, administrador de AWS
TareaDescripciónHabilidades requeridas

Configure el entorno AWS CDK de desarrollo.

Para configurar el entorno de desarrollo, haga lo siguiente:

  1. Instale el AWS CDK.

  2. Clone el repositorio GitHub s3- presignedurl-staticips-endpoint-with -cdk ejecutando el siguiente comando en una ventana de terminal:

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

Administrador de la nube, administrador de AWS

Configure los ajustes del dominio en el config/index.ts archivo.

Para editar las opciones de la variable constante, utilice los siguientes 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', };

En los comandos, sustituya cada marcador de posición por su propia información:

  • '{arn of the acm which created before}'Sustitúyalo por su certificado ACM Amazon Resource Name (ARN).

  • '{public hosted zone name}'Sustitúyalo por tu nombre de dominio.

  • 'hosted zone Id'Sustitúyalo por tu ID de zona alojada de Route 53.

  • '{Prefix for the domain}'Sustitúyalo por el prefijo de dominio que quieras usar.

  • Si lo desea, 'presign' modifique 'objects' las rutas si es necesario para su caso de uso específico.

Administrador de la nube, administrador de AWS

Despliegue las pilas.

Para implementar dos pilas, una para la nube privada virtual (VPC) y otra para la aplicación, utilice el siguiente comando:

$ npm install $ cdk synth $ cdk deploy --all
Administrador de la nube, administrador de AWS
TareaDescripciónHabilidades requeridas

Compruebe las direcciones IP del punto final.

Para comprobar que el dominio de este patrón tiene direcciones IP estáticas, utilice el siguiente comando:

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

Cargue un archivo de prueba que pueda descargar más adelante.

Cargue el archivo de prueba en la '/objects' carpeta del bucket de Amazon S3.

Administrador de la nube, administrador de AWS

Invoque la API para generar una URL prefirmada.

Para generar una URL prefirmada, llama a la URL desde un navegador o un cliente de API (por ejemplo, Postman) con el siguiente formato:

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

Sustituya los valores de los marcadores de posición por ${s3-bucket-prefix} y por ${domain} los valores que configuró en los pasos anteriores.

Propietario de la aplicación

Comprueba el resultado.

El resultado esperado es que recibas un código de estado de redireccionamiento 301 (desplazado permanentemente). Esta respuesta contendrá la URL prefirmada, que debería iniciar automáticamente la descarga del archivo de prueba.

Ingeniero de pruebas
TareaDescripciónHabilidades requeridas

Destruya los recursos de API Gateway, Amazon S3 y Lambda.

Para eliminar recursos, utilice los siguientes comandos:

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

Destruya los recursos de la red.

Para eliminar los recursos de la red, utilice los siguientes comandos:

cd ./1.vpc_alb_ga terraform init terraform plan --destroy --var-file=apg.tfvars terraform destroy --var-file=apg.tfvars
Administrador de la nube, administrador de AWS
TareaDescripciónHabilidades requeridas

Destruye las pilas.

Para destruir las pilas de aplicaciones y de la VPC, utilice el siguiente comando:

$ cdk destroy --all
Administrador de la nube, administrador de AWS

Vacíe y elimine los depósitos de Amazon S3.

Vacíe y elimine el objeto (bucket de Amazon S3) y los registros (bucket Amazon S3) que no se eliminen de forma predeterminada.

Los nombres de los buckets de Amazon S3 son ${s3-bucket-prefix}.${domain} y${s3-bucket-prefix}.${domain}-logs.

Si prefiere usar el AWS Command Line Interface (AWS CLI) para eliminar los buckets, utilice los siguientes 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

Sustituya ${s3-bucket-prefix} y por ${domain} los valores que configuró en los pasos anteriores. , /p>

Administrador de la nube, administrador de AWS

Recursos relacionados

AWS Blogs