View a markdown version of this page

Consolidación de 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.

Consolidación de 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 de conexión 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 conexión 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 de su dominio personalizado

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

Limitaciones

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

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

  • Algunos Servicios de AWS no están disponibles en todos Regiones de AWS. Para obtener información sobre la disponibilidad en regiones, consulte AWS Services by Region. Para ver los puntos de conexión específicos, consulte Service endpoints and quotas y elija el enlace del servicio.

Arquitectura

En el siguiente diagrama se muestran los componentes de la arquitectura de destino y el flujo de trabajo de 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 de Lambda genera la URL prefirmada y apunta al punto de conexión 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 de conexión 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 equilibrador de carga de aplicación interno para conectarse a Global Accelerator.

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

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

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

Tools (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 Accelerator es un servicio global que admite puntos de conexión en varias Regiones de AWS. Puede crear aceleradores que dirijan el tráfico a puntos finales óptimos a través de la red AWS 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 lo 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 implementación. 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 generación PresignedUrl.

  • Siga el principio de privilegio mínimo y conceda los permisos mínimos necesarios para llevar a cabo 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

Decida un nombre de dominio.

Elija un nombre de dominio público para el punto de conexión unificado de Amazon S3. El nombre del dominio también se usa como el 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. Cree los archivos .tfvars necesarios: cree archivos apg.tfvars en los directorios 1.vpc_alb_ga y 2.apigw_s3_lambda. Estos archivos contendrán los valores de las variables específicos de su entorno.

    • Para 1.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, cree un archivo con la siguiente plantilla (tendrá que actualizar 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 carpeta como en la 1.vpc_alb_ga 2.apigw_s3_lambda carpeta, edite los provider.tf archivos para que coincidan con su configuración local AWS :

    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 marcador de posición de los archivos .tfvars por los valores reales.

  • Tras completar la primera implementación de Terraform (1.vpc_alb_ga), actualiza el valor vpc_iden 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 ~/.aws/credentials el archivo.

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

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

  • Si cambia aws_region, es posible que también tenga que actualizar las zonas de disponibilidad codificadas de los archivos main.tf para que coincidan con las Región de AWS que ha elegido.

Administrador de la nube, administrador de AWS

Aprovisione los recursos de red.

Para aprovisionar los 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 comando apply , escriba cuando se le solicite.

Administrador de la nube, administrador de AWS

Aprovisione API Gateway, Amazon S3 y Lambda.

Para aprovisionar los recursos de red, use 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 archivo config/index.ts.

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, reemplace cada marcador de posición con su propia información:

  • Sustituya '{arn of the acm which created before}' por el nombre de recurso de Amazon (ARN) del certificado de ACM.

  • Sustituya '{public hosted zone name}' por su nombre de dominio.

  • Sustituya 'hosted zone Id' por el ID de zona alojada de Route 53.

  • Sustituya '{Prefix for the domain}' por el prefijo de dominio que desee usar.

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

Administrador de la nube, administrador de AWS

Implemente 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

Verifique las direcciones IP del punto de conexión.

Para comprobar que el dominio de este patrón tenga 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 carpeta '/objects' 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, llame 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 ${s3-bucket-prefix} y ${domain} por los valores que configuró en los pasos anteriores.

Propietario de la aplicación

Compruebe el resultado.

El resultado esperado es que reciba 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 los recursos, use 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 red.

Para eliminar los recursos de red, use 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

Destruya las pilas.

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

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

Vacíe y elimine los buckets de Amazon S3.

Vacíe y elimine el bucket de Amazon S3 del objeto y el bucket de Amazon S3 de los registros 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 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 ${domain} por los valores que se estableció en los pasos anteriores.

Administrador de la nube, administrador de AWS

Recursos relacionados

AWS Blogs