Configuración de una función Lambda para obtener acceso a los recursos en una VPC - AWS Lambda

Configuración de una función Lambda para obtener acceso a los recursos en una VPC

Puede configurar una función de Lambda para conectarse a subredes privadas en una nube virtual privada (VPC) de su cuenta de AWS. Utilice Amazon Virtual Private Cloud (Amazon VPC) para crear una red privada para recursos como bases de datos, instancias de caché o servicios internos. Conecte su función a la VPC para acceder a recursos privados mientras la función se está ejecutando.

Cuando conecta una función a una VPC, Lambda crea una interfaz de red elástica para cada subred en la configuración de VPC de la función. Este proceso puede tardar varios minutos.

Mientras Lambda crea una interfaz de red, no se pueden realizar operaciones adicionales que se dirijan a la función, como creación de versiones o actualización del código de la función. Para nuevas funciones, no se puede invocar la función hasta que su estado cambie de Pending a Active. Para las funciones existentes, todavía puede invocar la versión anterior mientras la actualización está en curso. Para obtener más información acerca de los estados de función, consulte Monitorización del estado de una función con la API de Lambda.

Varias funciones pueden compartir una interfaz de red, si dichas funciones comparten la misma subred y grupo de seguridad. Conectar funciones adicionales a una subred que tiene una interfaz de red administrada por Lambda existente es mucho más rápido que hacer que Lambda cree interfaces de red adicionales. Sin embargo, si tiene muchas funciones o funciones con un alto uso de red, es posible que Lambda pueda todavía crear interfaces de red adicionales.

Si las funciones no están activas durante un largo periodo de tiempo, Lambda reclama las interfaces de red y las funciones pasan a ser Idle. Para reactivar una función inactiva, invóquela. Esta invocación produce un error y la función vuelve a encontrarse en un estado Pending hasta que esté disponible una interfaz de red.

Las funciones Lambda no pueden conectarse directamente a una VPC con tenencia de instancias dedicada. Para conectarse a los recursos de una VPC dedicada, interconéctela con una segunda VPC con tenencia predeterminada.

Permisos de usuario y rol de ejecución

Lambda utiliza los permisos de la función para crear y administrar interfaces de red. Para conectarse a una VPC, el rol de ejecución de la función debe tener los siguientes permisos:

Permisos de rol de ejecución

  • ec2:CreateNetworkInterface

  • ec2:DescribeNetworkInterfaces

  • ec2:DeleteNetworkInterface

Estos permisos están incluidos en la política administrada de AWS AWSLambdaVPCAccessExecutionRole.

Al configurar la conectividad de VPC, Lambda utiliza los permisos para comprobar los recursos de red. Para configurar una función para conectarse a una VPC, su usuario de AWS Identity and Access Management (IAM) necesita los siguientes permisos:

Permisos de usuario

  • ec2:DescribeSecurityGroups

  • ec2:DescribeSubnets

  • ec2:DescribeVpcs

Configuración del acceso mediante VPC (consola)

Si los permisos de IAM solo le permiten crear funciones de Lambda que se conectan a la VPC, debe configurar la VPC al crear la función. Si los permisos de IAM le permiten crear funciones que no están conectadas a la VPC, puede agregar la configuración de la VPC después de crear la función.

Para configurar una VPC al crear una función

  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija Create function (Crear función).

  3. En Basic information (Información básica), para Function name (Nombre de función), escriba un nombre para la función.

  4. Amplíe Advanced settings (Configuración avanzada).

  5. En Network (Red), elija una VPC a la que tenga acceso la función.

  6. Elija subredes y grupos de seguridad. Cuando elige un grupo de seguridad, la consola muestra las reglas de entrada y salida de ese grupo de seguridad.

    nota

    Para acceder a recursos privados, conecte la función a subredes privadas. Si su función necesita acceso a Internet, utilice traducción de direcciones de red (NAT). La conexión de una función a una subred pública no le concede acceso a Internet ni una dirección IP pública.

  7. Elija Create function (Crear función).

Para configurar una VPC para una función existente

  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija una función.

  3. Elija Configuración y, a continuación, elija VPC.

  4. En VPC, elija Edit (Editar).

  5. Elija una VPC, las subredes y los grupos de seguridad.

    nota

    Para acceder a recursos privados, conecte la función a subredes privadas. Si su función necesita acceso a Internet, utilice traducción de direcciones de red (NAT). La conexión de una función a una subred pública no le concede acceso a Internet ni una dirección IP pública.

  6. Seleccione Save.

Configuración del acceso mediante VPC (API)

Para conectar una función de Lambda a una VPC, puede utilizar las siguientes operaciones de la API:

Para crear una función y conectarla a una VPC mediante la AWS Command Line Interface (AWS CLI), puede utilizar el comando create-function con la opción vpc-config. En el ejemplo siguiente se crea una función con una conexión a una VPC con dos subredes y un grupo de seguridad.

aws lambda create-function --function-name my-function \ --runtime nodejs12.x --handler index.js --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/lambda-role \ --vpc-config SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

Para conectar una función existente a una VPC, utilice el comando update-function-configuration con la opción vpc-config.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=subnet-071f712345678e7c8,subnet-07fd123456788a036,SecurityGroupIds=sg-085912345678492fb

Para desconectar la función de una VPC, actualice la configuración de la función con una lista vacía de subredes y grupos de seguridad.

aws lambda update-function-configuration --function-name my-function \ --vpc-config SubnetIds=[],SecurityGroupIds=[]

Uso de claves de condición de IAM para la configuración de la VPC

Puede utilizar claves de condición específicas de Lambda para la configuración de la VPC para proporcionar controles de permisos adicionales para sus funciones de Lambda. Por ejemplo, puede requerir que todas las funciones de la organización estén conectadas a una VPC. También puede especificar las subredes y los grupos de seguridad que los usuarios de la función pueden y no pueden utilizar.

Lambda admite las siguientes claves de condición en las políticas de IAM:

  • lambda:VpcIds: permiten o deniegan una o varias VPC.

  • lambda:SubnetIds: permiten o deniegan una o varias subredes.

  • lambda:SecurityGroupIds: permiten o deniegan uno o varios grupos de seguridad.

Las operaciones de la API de Lambda CreateFunction y UpdateFunctionConfiguration admiten estas claves de condición. Para obtener más información acerca de las claves de condición en las políticas de IAM, consulte Elementos de la política de JSON de IAM: Condición en la Guía del usuario de IAM.

sugerencia

Si su función ya incluye una configuración de VPC de una solicitud de la API anterior, puede enviar una solicitud UpdateFunctionConfiguration sin la configuración de la VPC.

Políticas de ejemplo con claves de condición para la configuración de la VPC

En los ejemplos siguientes se muestra cómo utilizar claves de condición para la configuración de la VPC. Después de crear una instrucción de política con las restricciones deseadas, agregue la instrucción de política para el usuario o rol de IAM de destino.

Asegúrese de que los usuarios implementen solo funciones conectadas a la VPC

Para asegurarse de que todos los usuarios implementen solo funciones conectadas a la VPC, puede denegar operaciones de creación y actualización de funciones que no incluyan un ID de VPC válido.

Tenga en cuenta que el ID de VPC no es un parámetro de entrada para la solicitud CreateFunction o UpdateFunctionConfiguration. Lambda recupera el valor ID de la VPC en función de los parámetros de subred y grupo de seguridad.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceVPCFunction", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "Null": { "lambda:VpcIds": "true" } } } ] }

Denegar a los usuarios el acceso a VPC, subredes o grupos de seguridad específicos

Para denegar a los usuarios el acceso a VPC específicas, utilice StringEquals para comprobar el valor de la condición lambda:VpcIds. En el ejemplo siguiente se deniega a los usuarios el acceso a vpc-1 y vpc-2.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceOutOfVPC", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

Para denegar a los usuarios el acceso a subredes específicas, utilice StringEquals para comprobar el valor de la condición lambda:SubnetIds. En el ejemplo siguiente se deniega a los usuarios el acceso a subnet-1 y subnet-2.

{ "Sid": "EnforceOutOfSubnet", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

Para denegar a los usuarios el acceso a grupos de seguridad específicos, utilice StringEquals para comprobar el valor de la condición lambda:SecurityGroupIds. En el ejemplo siguiente se deniega a los usuarios el acceso a sg-1 y sg-2.

{ "Sid": "EnforceOutOfSecurityGroups", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Deny", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

Permitir a los usuarios crear y actualizar funciones con configuraciones específicas de VPC

Para permitir a los usuarios acceder a VPC específicas, utilice StringEquals para comprobar el valor de la condición lambda:VpcIds. En el siguiente ejemplo se permite a los usuarios acceder a vpc-1 y vpc-2.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EnforceStayInSpecificVpc", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "StringEquals": { "lambda:VpcIds": ["vpc-1", "vpc-2"] } } }

Para permitir a los usuarios acceder a subredes específicas, utilice StringEquals para comprobar el valor de la condición lambda:SubnetIds. En el siguiente ejemplo se permite a los usuarios acceder a subnet-1 y subnet-2.

{ "Sid": "EnforceStayInSpecificSubnets", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SubnetIds": ["subnet-1", "subnet-2"] } } }

Para permitir a los usuarios acceder a grupos de seguridad específicos, utilice StringEquals para comprobar el valor de la condición lambda:SecurityGroupIds. En el siguiente ejemplo se permite a los usuarios acceder a sg-1 y sg-2.

{ "Sid": "EnforceStayInSpecificSecurityGroup", "Action": [ "lambda:CreateFunction", "lambda:UpdateFunctionConfiguration" ], "Effect": "Allow", "Resource": "*", "Condition": { "ForAllValues:StringEquals": { "lambda:SecurityGroupIds": ["sg-1", "sg-2"] } } } ] }

Acceso a Internet y a los servicios para funciones conectadas a la VPC

De forma predeterminada, Lambda ejecuta las funciones en una VPC segura con acceso a los servicios de AWS e Internet. Lambda es propietaria de esta VPC, que no está conectada a la VPC predeterminada. Al conectar una función a una VPC de su cuenta, la función no puede acceder a Internet a no ser que su VPC proporcione acceso.

nota

Varios servicios de AWS ofrecen puntos de enlace de la VPC. Puede utilizar los puntos de enlace de la VPC para conectarse a servicios de AWS desde dentro de una VPC sin acceso a Internet.

El acceso a Internet desde una subred privada requiere la conversión de las direcciones de red (NAT). Para conceder a la función acceso a Internet, enrute el tráfico saliente a una gateway NAT en una subred pública. La gateway NAT tiene una dirección IP pública y puede conectarse a Internet a través de la gateway de Internet de la VPC. Para obtener más información, consulte Cómo conceder acceso a Internet a una función Lambda en una VPC.

Tutoriales de VPC

En los siguientes tutoriales, se conecta una función de Lambda a los recursos de la VPC.

Ejemplos de configuraciones de VPC

Puede utilizar las siguientes plantillas de AWS CloudFormation de ejemplo para crear configuraciones de VPC que se usarán con funciones de Lambda. Hay dos plantillas disponibles en el repositorio de GitHub de esta guía:

  • vpc-private.yaml: una VPC con dos subredes privadas y puntos de enlace de la VPC para Amazon Simple Storage Service (Amazon S3) y Amazon DynamoDB. Utilice esta plantilla para crear una VPC para funciones que no necesitan acceso a Internet. Esta configuración admite el uso de Amazon S3 y DynamoDB con los SDK de AWS, así como el acceso a los recursos de base de datos de la misma VPC a través de una conexión de red local.

  • vpc-privatepublic.yaml: VPC con dos subredes privadas, puntos de enlace de la VPC, una subred pública con una gateway NAT y una gateway de Internet. El tráfico hacia Internet desde las funciones de las subredes privadas se enruta a la gateway NAT mediante una tabla de enrutamiento.

Para crear una VPC con una plantilla, en la consola de AWS CloudFormation, en la página Stacks (Pilas), elija Create stack (Crear pila) y, a continuación, siga las instrucciones del asistente de Create stack (Crear pila).