Con Amazon Virtual Private Cloud (Amazon VPC), usted puede crear redes privadas en su Cuenta de AWS para alojar recursos, como por ejemplo instancias de Amazon Elastic Compute Cloud (Amazon EC2), instancias de Amazon Relational Database Service (Amazon RDS) e instancias de Amazon ElastiCache. Puede conceder a su función de Lambda acceso a los recursos alojados en una Amazon VPC al adjuntar su función a la VPC a través de las subredes privadas que contienen los recursos. Siga las instrucciones de las siguientes secciones para adjuntar una función de Lambda a una Amazon VPC mediante la consola de Lambda, la AWS Command Line Interface (AWS CLI) o el AWS SAM.
nota
Cada función de Lambda se ejecuta dentro de una VPC que pertenece y es administrada por el servicio Lambda. Lambda gestiona automáticamente estas VPC y no se encuentran visibles para los clientes. La configuración de la función para acceder a otros recursos de AWS en una Amazon VPC no afecta a la VPC gestionada por Lambda en la que se ejecuta la función.
Secciones
Permisos de IAM necesarios
Para adjuntar una función de Lambda a una Amazon VPC en su Cuenta de AWS, Lambda necesita permisos para crear y administrar las interfaces de red que utiliza para que su función acceda a los recursos de la VPC.
Las interfaces de red que Lambda crea se conocen como interfaces de red elásticas de hiperplano o ENI de hiperplano. Para obtener más información acerca de estas interfaces de red, consulte Introducción a las interfaces de red elástica (ENI) de hiperplano.
Puede conceder a la función los permisos que necesita adjuntando la política administrada de AWS AWSLambdaVPCAccessExecutionRole al rol de ejecución de la función. Cuando crea una función nueva en la consola de Lambda y la conecta a una VPC, Lambda añade automáticamente esta política de permisos.
Si prefiere crear su propia política de permisos de IAM, asegúrese de añadir los siguientes permisos:
-
ec2:CreateNetworkInterface
-
ec2:DescribeNetworkInterfaces: esta acción solo funciona si está permitida en todos los recursos (
"Resource": "*"
). -
ec2:DescribeSubnets
-
ec2:DeleteNetworkInterface: si no especifica un ID de recurso para DeleteNetworkInterface en el rol de ejecución, es posible que la función no pueda acceder a la VPC. Especifique un ID de recurso único o incluya todos los ID de recursos, por ejemplo,
"Resource": "arn:aws:ec2:us-west-2:123456789012:*/*"
. -
ec2:AssignPrivateIpAddresses
-
ec2:UnassignPrivateIpAddresses
Tenga en cuenta que el rol de su función solo necesita estos permisos para crear las interfaces de red, no para invocar su función. Puede invocar correctamente la función cuando está conectada a una Amazon VPC, incluso si elimina estos permisos del rol de ejecución de la función.
Para adjuntar la función a una VPC, Lambda también necesita verificar los recursos de la red mediante su rol de usuario de IAM. Asegúrese de que su rol de usuario tenga los siguientes permisos de IAM:
-
ec2:DescribeSecurityGroups
-
ec2:DescribeSubnets
-
ec2:DescribeVpcs
-
ec2:getSecurityGroupsForVpc
nota
El servicio de Lambda utiliza los permisos de Amazon EC2 que concede al rol de ejecución de la función para adjuntar la función a una VPC. Sin embargo, estos permisos también se otorgan implícitamente al código de la función. Esto significa que su código de función puede realizar estas llamadas a la API de Amazon EC2. Para obtener consejos sobre prácticas recomendadas de seguridad, consulte Prácticas recomendadas de seguridad.
Conexión de las funciones de Lambda a una Amazon VPC en su Cuenta de AWS
Adjunte su función a una Amazon VPC en su Cuenta de AWS mediante la consola de Lambda, la AWS CLI o el AWS SAM. Si utiliza AWS CLI o AWS SAM, o si adjunta una función existente a una VPC mediante la consola de Lambda, asegúrese de que el rol de ejecución de la función tenga los permisos necesarios que se indican en la sección anterior.
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
Cómo adjuntar una función a una Amazon VPC al crearla
-
Abra la página Funciones
de la consola de Lambda y elija Crear función. -
En Basic information (Información básica), para Function name (Nombre de función), escriba un nombre para la función.
-
Para configurar los ajustes de la VPC para la función, haga lo siguiente:
-
Amplíe Configuración avanzada.
-
Seleccione Habilitar VPC y, a continuación, elija la VPC a la que desea adjuntar la función.
-
(Opcional) Para permitir el tráfico IPv6 saliente, seleccione Permitir tráfico IPv6 para subredes de doble pila.
-
Elija las subredes y los grupos de seguridad para crear la interfaz de red. Si seleccionó Permitir tráfico IPv6 para subredes de pila doble, todas las subredes seleccionadas deben tener un bloque de CIDR IPv4 y un bloque de CIDR IPv6.
nota
Para acceder a recursos privados, conecte la función a subredes privadas. Si la función necesita acceso a Internet, consulte Habilitación del acceso a Internet para funciones de Lambda conectadas a VPC. 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.
-
-
Seleccione Creación de función.
Cómo adjuntar una función existente a una Amazon VPC
-
Abra la página Funciones
de la consola de Lambda y seleccione su función. -
Elija la pestaña Configuración y, a continuación, elija VPC.
-
Elija Editar.
-
En VPC, seleccione la Amazon VPC a la que quiera adjuntar su función.
-
(Opcional) Para permitir el tráfico IPv6 saliente, seleccione Permitir tráfico IPv6 para subredes de doble pila.
-
Elija las subredes y los grupos de seguridad para crear la interfaz de red. Si seleccionó Permitir tráfico IPv6 para subredes de pila doble, todas las subredes seleccionadas deben tener un bloque de CIDR IPv4 y un bloque de CIDR IPv6.
nota
Para acceder a recursos privados, conecte la función a subredes privadas. Si la función necesita acceso a Internet, consulte Habilitación del acceso a Internet para funciones de Lambda conectadas a VPC. 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.
-
Seleccione Guardar.
Acceso a Internet cuando está conectado a una VPC
De forma predeterminada, las funciones de Lambda tienen acceso al Internet público. Cuando asocie la función a una VPC, esta solo puede tener acceso a los recursos disponibles dentro de esa VPC. Para conceder a la función acceso a internet, también necesita configurar la VPC para tener acceso a Internet. Para obtener más información, consulte Habilitación del acceso a Internet para funciones de Lambda conectadas a VPC.
Compatibilidad con IPv6
Su función puede conectarse a recursos en subredes de VPC de doble pila a través de IPv6. Esta opción está desactivada de forma predeterminada. Para permitir el tráfico IPv6 saliente, use la consola o la opción --vpc-config Ipv6AllowedForDualStack=true
con el comando create-function
nota
Para permitir el tráfico IPv6 saliente en una VPC, todas las subredes que estén conectadas a la función deben ser subredes de doble pila. Lambda no admite conexiones IPv6 salientes para subredes exclusivas de IPv6 en una VPC, conexiones IPv6 salientes para funciones que no están conectadas a una VPC ni conexiones IPv6 entrantes mediante puntos de enlace de VPC (AWS PrivateLink).
Puede actualizar el código de función para conectarse explícitamente a los recursos de subred a través de IPv6. El siguiente ejemplo de Python abre un socket y se conecta a un servidor IPv6.
ejemplo — Conectarse al servidor IPv6
def connect_to_server(event, context):
server_address = event['host']
server_port = event['port']
message = event['message']
run_connect_to_server(server_address, server_port, message)
def run_connect_to_server(server_address, server_port, message):
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0)
try:
# Send data
sock.connect((server_address, int(server_port), 0, 0))
sock.sendall(message.encode())
BUFF_SIZE = 4096
data = b''
while True:
segment = sock.recv(BUFF_SIZE)
data += segment
# Either 0 or end of data
if len(segment) < BUFF_SIZE:
break
return data
finally:
sock.close()
Prácticas recomendadas para utilizar Lambda con Amazon VPC
Para asegurarse de que la configuración de su Lambda VPC cumpla con las guías de las prácticas recomendadas, siga los consejos de las siguientes secciones.
Prácticas recomendadas de seguridad
Para adjuntar la función de Lambda a una VPC, debe otorgar a su rol de ejecución de la función una cantidad de permisos de Amazon EC2. Estos permisos son necesarios para crear las interfaces de red que utiliza su función para acceder a los recursos de la VPC. Sin embargo, estos permisos también se otorgan implícitamente al código de la función. Esto significa que su código de función tiene permiso para realizar estas llamadas a la API de Amazon EC2.
Para seguir el principio del acceso con el privilegio mínimo, añada una política de denegación como la del siguiente ejemplo al rol de ejecución de la función. Esta política impide que su función realice llamadas a las API de Amazon EC2 que el servicio de Lambda utiliza para adjuntar su función a una VPC.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"ec2:CreateNetworkInterface",
"ec2:DeleteNetworkInterface",
"ec2:DescribeNetworkInterfaces",
"ec2:DescribeSubnets",
"ec2:DetachNetworkInterface",
"ec2:AssignPrivateIpAddresses",
"ec2:UnassignPrivateIpAddresses"
],
"Resource": [ "*" ],
"Condition": {
"ArnEquals": {
"lambda:SourceFunctionArn": [
"arn:aws:lambda:us-west-2:123456789012:function:my_function"
]
}
}
}
]
}
AWS proporciona grupos de seguridad y listas de control de acceso (ACL) de la red para aumentar la seguridad en la VPC. Los grupos de seguridad controlan el tráfico de entrada y salida de los recursos, mientras que las ACL de red controlan el tráfico de entrada y salida de las subredes. Los grupos de seguridad proporcionan suficiente control de acceso para la mayoría de las subredes. Puede utilizar las ACL de red si desea agregar un nivel de seguridad adicional en la VPC. Para obtener instrucciones generales sobre las prácticas recomendadas de seguridad al utilizar Amazon VPC, consulte Prácticas recomendadas de seguridad para su VPC en la Guía del usuario de Amazon Virtual Private Cloud.
Prácticas recomendadas de rendimiento
Al conectar la función a una VPC, Lambda comprueba si hay algún recurso de red disponible (ENI de hiperplano) al que pueda conectarse. Las ENI de hiperplano están asociadas a una combinación particular de grupos de seguridad y subredes de VPC. Si ya ha asociado una función a una VPC, especificando las mismas subredes y grupos de seguridad al adjuntar otra función, Lambda puede compartir los recursos de la red y evitar la necesidad de crear una nueva ENI de hiperplano. Para obtener más información sobre las ENI de hiperplano y su ciclo de vida, consulte Introducción a las interfaces de red elástica (ENI) de hiperplano.
Introducción a las interfaces de red elástica (ENI) de hiperplano
Una ENI de hiperplano es un recurso gestionado que actúa como una interfaz de red entre la función de Lambda y los recursos a los que desea que se conecte la función. El servicio de Lambda crea y administra estas ENI automáticamente al conectar la función a una VPC.
Las ENI de hiperplano no son visibles directamente para usted y no necesita configurarlas ni administrarlas. Sin embargo, saber cómo funcionan puede ayudarle a comprender el comportamiento de su función cuando la adjunta a una VPC.
La primera vez que se asocia una función a una VPC mediante una combinación de subred y grupo de seguridad en particular, Lambda crea una ENI de hiperplano. Otras funciones de su cuenta que utilizan la misma combinación de subred y grupo de seguridad también pueden utilizar esta ENI. Siempre que es posible, Lambda reutiliza las ENI existentes para optimizar la utilización de los recursos y minimizar la creación de nuevas ENI. Sin embargo, cada ENI de hiperplano admite hasta 65 000 conexiones o puertos. Si el número de conexiones supera este límite, Lambda escala el número de ENI automáticamente en función del tráfico de red y los requisitos de simultaneidad.
En el caso de las funciones nuevas, mientras Lambda crea una ENI de hiperplano, la función permanece en el estado Pendiente y no se puede invocar. La función pasa al estado Activo solo cuando la ENI de hiperplano está lista, lo que puede tardar varios minutos. En el caso de las funciones existentes, no es posible realizar operaciones adicionales sobre la función, como crear nuevas versiones o actualizar su código, aunque aún se pueden invocar versiones anteriores de la misma.
Como parte de la administración del ciclo de vida de la interfaz de red elástica (ENI), Lambda puede eliminar y recrear ENI para equilibrar la carga del tráfico de red en las ENI o para solucionar los problemas encontrados en las comprobaciones de estado de las ENI. Además, si una función de Lambda permanece inactiva durante 30 días, Lambda recupera cualquier ENI de Hyperplane no utilizada y establece el estado de la función en inactivo. La siguiente invocación fallará y la función reingresa al estado Pendiente hasta que Lambda completa la creación o asignación de una ENI de hiperplano. Recomendamos que el diseño no dependa de la persistencia de las ENI.
Cuando se actualiza una función para eliminar la configuración de VPC, Lambda necesita hasta 20 minutos para eliminar la ENI de hiperplano adjunta. Lambda solo elimina la ENI si ninguna otra función (o versión de función publicada) utiliza esa ENI de hiperplano.
Lambda depende de los permisos de la función rol de ejecución para eliminar la ENI de hiperplano. Si elimina la función de ejecución antes de que Lambda elimine la ENI de hiperplano, Lambda no podrá eliminar la ENI de hiperplano. Puede realizar la eliminación de forma manual.
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 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"]
}
}
}
]
}
Tutoriales de VPC
En los siguientes tutoriales, se conecta una función de Lambda a los recursos de la VPC.