internet for aws amazon-web-services amazon-s3 aws-lambda amazon-vpc

amazon-web-services - for - aws tags



Acceda a AWS S3 desde Lambda dentro de VPC (3)

En general, estoy bastante confundido al usar AWS Lambda dentro de una VPC. El problema es que Lambda está agotando el tiempo al intentar acceder a un contenedor S3. La solución parece ser un punto final de VPC.

He agregado la función Lambda a una VPC para que pueda acceder a una base de datos alojada en RDS (no se muestra en el código siguiente, pero es funcional). Sin embargo, ahora no puedo acceder a S3 y cualquier intento de hacerlo se agota.

Intenté crear un punto final VPC S3, pero nada ha cambiado.

Configuración de VPC

Estoy usando una VPC simple creada de forma predeterminada cada vez que hice una instancia de EC2. Tiene cuatro subredes, todas creadas por defecto.

Tabla de ruta VPC

_Destination - Target - Status - Propagated_ 172.31.0.0/16 - local - Active - No pl-63a5400a (com.amazonaws.us-east-1.s3) - vpce-b44c8bdd - Active - No 0.0.0.0/0 - igw-325e6a56 - Active - No

Simple S3 Descarga Lambda:

import boto3 import pymysql from StringIO import StringIO def lambda_handler(event, context): s3Obj = StringIO() return boto3.resource(''s3'').Bucket(''marineharvester'').download_fileobj(''Holding - Midsummer/sample'', s3Obj)


Con boto3, las URL de S3 son virtuales de forma predeterminada, que luego requieren que el acceso a Internet se resuelva a las URL específicas de la región. Esto provoca el bloqueo de la función Lambda hasta el tiempo de espera.

Para resolver esto, se requiere el uso de un objeto Config al crear el cliente, que le dice a boto3 que cree las URL de S3 basadas en la ruta en su lugar:

import boto3 import botocore.config client = boto3.client(''s3'', ''ap-southeast-2, config=botocore.config.Config(s3={''addressing_style'':''path''}))

Tenga en cuenta que la región de la llamada debe ser la región en la que está implementando la lambda y el punto final de VPC.

Entonces podrá usar la lista de prefijos pl-xxxxxx para el punto final de VPC dentro del grupo de seguridad de Lambda, y aún acceder a S3.

Aquí hay un script de CloudFormation en funcionamiento que demuestra esto. Crea un cubo S3, un lambda (que coloca registros en el cubo) asociado a una VPC que contiene solo subredes privadas y el punto final de VPC y los roles IAM necesarios.


Hay otro problema relacionado con las subredes y las rutas que no se aborda en las otras respuestas, por lo que estoy creando una respuesta por separado con la condición de que se apliquen todas las respuestas anteriores. Tienes que hacer que todos estén bien para que la función lambda acceda a S3.

Cuando crea una nueva cuenta de AWS que hice el otoño pasado, no hay una tabla de rutas asociada automáticamente con su VPC predeterminada (consulte Tablas de rutas -> Asociaciones de subred en la Consola).

Entonces, si sigue las instructions para crear un Endpoint y crea una ruta para ese Endpoint, no se agrega ninguna ruta, porque no hay una subred para ponerla. Y como es habitual en AWS, no aparece un mensaje de error ...

Lo que debe hacer es crear una subred para su función lambda, asociar esa subred con la tabla de rutas y la función lambda, y luego volver a ejecutar las instrucciones del punto final y, si tiene éxito, encontrará una tabla de rutas que tenga tres entradas como esta:

Destination Target 10.0.0.0/16 Local 0.0.0.0/0 igw-1a2b3c4d pl-1a2b3c4d vpce-11bb22cc

Si solo tiene dos entradas (ninguna entrada ''pl-xxxxx''), entonces todavía no lo ha logrado.

Al final, creo que no debería sorprender que una función lambda necesite una subred para vivir, como cualquier otra entidad en una red. Y es probable que sea recomendable que no se encuentre en la misma subred que sus instancias de EC2, ya que lambda puede necesitar rutas o permisos de seguridad diferentes. Tenga en cuenta que la GUI en lambda realmente quiere que tenga dos subredes en dos AZ diferentes, lo que también es una buena idea.


La causa de mi problema no había sido configurar correctamente las Reglas de salida de mi grupo de seguridad. Específicamente, necesitaba agregar una Regla de salida del protocolo personalizado con un destino de pl-XXXXXXXX (el servicio S3. El valor real lo proporcionó la Consola de AWS).