AWS Lambda C# - invocando lambda a través de su punto final vpc

¿Es posible invocar una lambda de otra lambda a través de su punto final vpc (no a través de su nombre)? No puedo invocar la lambda directamente porque la llamada lambda está en un VPC y la lambda que quiero llamar no está en el VPC.

Parece que el AWS-SDK en el caller lambda necesita un acceso a Internet para invocar otro lambda (comportamiento por defecto) y en el VPC no tengo uno (no puedo añadir un NAT Gateway o una Instance Nat).

si los lambdas están en el mismo vpc usaría este código:

AmazonLambdaConfig lambdaConfig = new AmazonLambdaConfig() {  RegionEndpoint = RegionEndpoint.EUWest1 };    
AmazonLambdaClient lCli = new AmazonLambdaClient("****APIKEY******", "****SECRET******", lambdaConfig);   //se presente la variabile di ambiente AWS_PROFILE prende si logga con quelle credenziali
Amazon.Lambda.Model.InvokeRequest lambdaRequest = new Amazon.Lambda.Model.InvokeRequest()
{
     FunctionName = "notification-prd-notifyses",
     InvocationType = InvocationType.RequestResponse,
     Payload =  myJobj.ToString()
};

Amazon.Lambda.Model.InvokeResponse response = lCli.InvokeAsync(lambdaRequest).Result;

Así pues, la pregunta es: ¿Puedo invocar una lambda refiriéndose a su punto final VPC i creado (henche a través de su nombre DNS)?

No puedo utilizar/crear una apigateway también, o asociar un punto final vpc a él, así que la pregunta está relacionada sólo con la invocación directa de lambda a lambda. ¿Es posible?

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bytebuster


2 Respuestas:

  • En el caso en el que necesitas invocar una Lambda que está dentro de un VPC desde otra Lambda que no está en el mismo VPC y no puedes utilizar un NAT Gateway o una AWS PrivateLink para la comunicación, es un escenario complicado.

    De manera predeterminada, las Lambdas dentro de un VPC no disponen de una dirección IP pública y no pueden ser invocadas directamente a través de internet. Sin embargo, en este caso específico, parece que necesitas invocar la Lambda a través de su punto final VPC, lo cual no es una funcionalidad directamente soportada por AWS Lambda en este momento.

    Una alternativa que podrías considerar es utilizar un Amazon API Gateway como un intermediario entre las dos Lambdas. Aunque mencionas que no puedes utilizar o crear un API Gateway, esta sería una forma estándar de comunicar Lambdas en diferentes VPCs.

    En resumen, actualmente no es posible invocar directamente una Lambda a través de su punto final VPC desde otra Lambda fuera del VPC sin utilizar un mecanismo intermediario como un API Gateway. Te sugiero revisar tus restricciones y evaluar si es posible encontrar una solución alternativa que se ajuste a tus necesidades y limitaciones.

    Respondida el Dec 19, 2020 a las 07:51 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es posible invocar una función Lambda a través de su punto final VPC desde otra función Lambda que se encuentra en un VPC diferente.

    Para lograr esto, debes utilizar el siguiente enfoque:

    • Obtén el punto final de la función Lambda:
      <ul><li>Ve a la consola de AWS Lambda.</li></ul>      <ul><li>Selecciona la función Lambda que deseas invocar.</li></ul>      <ul><li>Haz clic en la pestaña "Configuración" y copia el "Punto final de VPC".</li></ul>
    
    • Crea un cliente de Lambda con el punto final:
      <ul><li>En tu función Lambda de invocación, crea un objeto `AmazonLambdaClient` utilizando el SDK de AWS para .NET.</li></ul>      <ul><li>Configura el punto final utilizando `EndpointUrl`.</li></ul>
    
    • Invoca la función Lambda:
      <ul><li>Crea una solicitud de invocación (`InvokeRequest`) y establece el `EndpointUrl` en el punto final de la función Lambda que deseas invocar.</li></ul>      <ul><li>Invoca la función Lambda mediante `InvokeAsync`.</li></ul>
    

    Código de ejemplo:

    csharp
    using Amazon.Lambda;
    using Amazon.Lambda.Model;
    using System;
    using System.Threading.Tasks;
    
    namespace LambdaVPCInvocation
    {
        public class Function
        {
            public async Task Handle(object input, ILambdaContext context)
            {
                // Obtener el punto final de VPC de la función Lambda de destino
                string targetLambdaEndpointUrl = "vpc-endpoint-url-of-target-lambda";
    
                // Crear un cliente de Lambda con el punto final de VPC
                var lambdaConfig = new AmazonLambdaConfig
                {
                    EndpointUrl = targetLambdaEndpointUrl
                };
                var lambdaClient = new AmazonLambdaClient(lambdaConfig);
    
                // Crear una solicitud de invocación
                var invokeRequest = new InvokeRequest
                {
                    FunctionName = "target-lambda-function-name",
                    InvocationType = InvocationType.RequestResponse,
                    Payload = "{ \"message\": \"Hola desde la función Lambda de invocación\" }"
                };
    
                // Invocar la función Lambda
                var invokeResponse = await lambdaClient.InvokeAsync(invokeRequest);
    
                // Procesar la respuesta de la función Lambda
                Console.WriteLine($"Respuesta de la función Lambda: {invokeResponse.Payload}");
            }
        }
    }
    

    Ten en cuenta:

    • Debes asegurarte de que ambas funciones Lambda tienen políticas de ejecución que permitan la invocación entre VPC.
    - El punto final de VPC solo es accesible dentro de la misma región y cuenta de AWS.

    Respondida el Dec 19, 2020 a las 07:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0