【问题标题】:Call a aws Lambda function from another lambda function in C#从 C# 中的另一个 lambda 函数调用 aws Lambda 函数
【发布时间】:2018-05-19 02:31:50
【问题描述】:

我是 c# 的 aws lambda 函数的新手。我有两个 lambda 函数,我想从第二个函数调用一个 lambda 函数,我使用的代码如下:

public string Function1(JObject input)
{
    string param = input["param"].ToString();
    string param1 = input["param1"].ToString();
    return param.ToUpper()+" "+param1.ToUpper();
}


public string Function2()
{
    try
    {
        using (AmazonLambdaClient client = new AmazonLambdaClient(some region))
        {
            JObject ob = new JObject();
            ob.Add("param", "hello");
            ob.Add("param1", "Lambda");
            var request = new InvokeRequest
            {
                FunctionName = "Function1",
                Payload = ob.ToString()
            };
            var response = client.Invoke(request);
            string result;
            using (var sr = new StreamReader(response.Payload))
            {
                return result = sr.ReadToEnd();
            }
        }
    }
    catch (Exception ex) 
    {
        return ex.Message.ToString();
    }
}

我收到如下错误:

{ "errorType": "TypeLoadException", "errorMessage": "无法从程序集'System,Version=2.0.5.0,Culture=neutral,PublicKeyToken=7cec85d7bea7798e,Retargetable=Yes'中加载类型'System.Net.HttpStatusCode'。", “堆栈跟踪”: [ “在 AWSLambdaApp.Function.Function2()”, “在 lambda_method(闭包,流,流,上下文信息)” ] }

在函数 2 应用程序中,我添加了“AWSSDK.Core”和“AWSSDK.Lambda”dll 的引用。 谁能告诉我我做错了什么?

【问题讨论】:

  • 您使用的是哪个版本的 .Net Framework?
  • 我正在使用 "framework": "netcoreapp1.0", "function-runtime": "dotnetcore1.0",

标签: c# .net asp.net-mvc aws-lambda


【解决方案1】:

我的电脑上没有安装“netcoreapp1.0”。所以我试过'netcoreapp2.0'。

我的代码看起来像:

public string FunctionHandler(JObject input, ILambdaContext context)
{
    param = input["param"].Value<string>();
    param1 = input["param1"].Value<string>();
    param.ToUpper() + " " + param1.ToUpper();
}

对于函数 2:

public async Task<string> FunctionHandler(string input, ILambdaContext context)
{
    try
    {
        using (AmazonLambdaClient client = new AmazonLambdaClient(RegionEndpoint.USEast1))
        {
            JObject ob = new JObject { { "param", "hello" }, { "param1", "Lambda" } };

            var request = new InvokeRequest
            {
                FunctionName = "Function1",//Function1:v1 if you use alias
                Payload = ob.ToString()
            };

            var response = await client.InvokeAsync(request);

            using (var sr = new StreamReader(response.Payload))
            {
                return await sr.ReadToEndAsync();
            }
        }
    }
    catch (Exception ex)
    {
        return ex.Message;
    }
}

而执行结果是"\"HELLO LAMBDA\""

我的代码工作的原因可能是:

  • 如何从 Function1 中的输入中获取参数。很有可能。
  • 我的异步代码。我无法在最新的 SDK 中使用同步代码来调用 lambda。
  • .net 核心版本。

另外,我需要发送一个简单的字符串作为 Function2 的参数。

【讨论】:

  • 此外,FunctionName 也可以是 Lambda 别名,例如“Function1:v1”,以防万一。
【解决方案2】:

我认为你必须重新考虑你的架构。请记住,lambda 函数有限制(执行时间和 CPU 使用率)。

在这种情况下最好使用aws step function。在这种情况下,您可以使用责任链模式。 Lambda 函数将被解耦,并且更容易支持它们。你会得到类似的结果:

此外,aws step-functions 具有许多功能,例如条件、并行执行、服务员等。它为您提供强大的工具来改进您的应用程序。

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2019-06-28
    • 2022-12-05
    • 2018-08-21
    • 2021-09-23
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多