Skip to main content

Command Palette

Search for a command to run...

Utilizando una función lambda con una IP estática

Updated
4 min read

En ocasiones, puede ser necesario contar con una dirección IP para registrarla dentro de una whitelist y permitir conexiones solo desde una dirección específica o un rango de IP determinado. Este proceso es clave cuando interactuamos con servicios que requieren controles de seguridad más estrictos.

Imagen: AWS Lambda invocando un proveedor de API que solo permite conexiones desde direcciones IP específicas

AWS Lambda es un servicio "sin servidor" y, cuando trabajamos con funciones Lambda, estas no se crean dentro de una VPC, por lo que no tienen una dirección IP asignada. Entonces, ¿cómo podemos resolver este requisito utilizando funciones Lambda?

AWS Lambda, junto con otros servicios como DynamoDB, S3, SQS, SNS, entre otros, pertenece al espacio público de AWS. Cada vez que un recurso dentro de una VPC interactúa con estos servicios, lo hace a través de la red pública.

Imagen: Servicios en Zona Pública de AWS. Fuente: Elaboración propia

Sin embargo, si queremos que esta comunicación se realice dentro de la misma red o, por razones de seguridad, necesitamos que un servicio se ejecute dentro de una VPC específica, en una o más subredes, y tenga un grupo de seguridad, podemos utilizar los VPC endpoints que AWS nos proporciona. Estos VPC endpoints pueden ser de dos tipos:

  • Interface: Abastece una mayor cantidad de servicios (como en este caso, Lambda) y tiene un costo asociado a la ENI (Interfaz de Red Elástica) que se genera con la creación del VPC endpoint.

  • Gateway: Actualmente solo cubre servicios como DynamoDB y S3, y no tiene costo alguno.

Connectivity to AWS services using VPC endpoints

Imagen: Conectividad con servicios de AWS mediante VPC endpoints. Fuente: AWS

Por lo tanto, asociar un VPC endpoint a una función lambda nos ayudará a que el tráfico entre mi lambda y otros servicios de AWS se mantengan dentro de la misma red privada de AWS sin salir a Internet (reduce los costos de transferencia de datos externa y mejora la latencia); además de poder aplicar mayores controles de seguridad (a través de un grupo de seguridad).

Para asociar una VPC a una función lambda, basta con ir al tab Configuración → VPC

Imagen: Configuración función lambda

Y seleccionar la VPC, las subredes y el grupo de seguridad que vamos a asociar a la función lambda

Para este ejemplo, hemos desarrollado un código de ejemplo para la función lambda.

import json
import urllib.request

lambda_handler = lambda event, context: {
    'statusCode': 200,
    'body': json.dumps({
        'ip_address': urllib.request.urlopen("http://checkip.amazonaws.com").read().decode('utf-8').strip()
    })
}

Código función lambda: Python 3.9

Este código realiza una solicitud HTTP a http://checkip.amazonaws.com para obtener la IP pública desde la que la función Lambda se está ejecutando. El resultado se devuelve en formato JSON.

Cuando una función Lambda se ejecuta en una subred privada, el tráfico de salida a Internet generalmente pasa a través de un NAT Gateway. Este NAT Gateway asigna una IP pública al tráfico de salida, que normalmente es una Elastic IP (EIP), y esa será la dirección IP utilizada para las solicitudes HTTP/HTTPS externas realizadas por Lambda.

Imagen: Arquitectura de una lambda con VPC endpoint en subredes privadas.

Al ejecutar la función lambda, vemos que como resultado nos trae una dirección IP

Imagen: Resultado de ejecución de la lambda

Esa dirección IP corresponde con una IP elástica, como podemos verificar en la consola.

Imagen: IP elástica

Y esa IP elástica es la que se encuentra asociada al NAT Gateway de la VPC donde se encuentra la lambda. De esta forma cada vez que la función lambda se ejecute está será su IP asociada, la cual podrá ser registrada en un whitelist de un data center de ser el caso.

Imagen: NatGateway de la VPC Egress

Cuando una función Lambda necesita realizar una solicitud HTTP/HTTPS a una API externa, se sigue el siguiente proceso:

  1. El tráfico sale de la VPC a través de la NAT Gateway.

  2. La Lambda utilizará la IP pública de la NAT Gateway para acceder a los servicios externos.

  3. Si tienes una Elastic IP (EIP) asociada a la NAT Gateway, esta será la dirección IP utilizada para la salida del tráfico.

Aunque, la Lambda no cuenta con una IP estática propia, podemos emplear la IP de salida de la NAT Gateway. Si requerimos que esta dirección IP sea fija, debemos asociar una Elastic IP a la NAT Gateway.

De esta forma, asignar una IP estática a una función Lambda dentro de una VPC es una estrategia eficaz para cumplir con los requisitos de seguridad de servicios que exigen conexiones desde direcciones IP específicas.

More from this blog

A

Alfalfita ☁️

19 posts

Software developer motivada y apasionada por la tecnología en la nube (AWS)