ฟังก์ชัน aws lambda โดยใช้เทมเพลตแบบไร้เซิร์ฟเวอร์ของแกน asp.net

ฉันมีความรู้เกี่ยวกับ aws ไม่เพียงพอ แต่บริษัทของฉันขอให้ฉันทำงาน ซึ่งฉันคิดว่า AWS Lambda ทำได้สมบูรณ์แบบ ข้อกำหนดคือฉันต้องสร้างบริการที่มีอุปกรณ์ปลายทางที่ต้องถูกเรียกวันละสองครั้ง แนวทางที่ฉันติดตามคือฉันสร้าง API เว็บแบบไร้เซิร์ฟเวอร์ผ่าน Visual Studio และสร้างตำแหน่งข้อมูลเกตเวย์ API สำหรับแต่ละตำแหน่งข้อมูล จากนั้นเพิ่มทริกเกอร์ผ่านเหตุการณ์การดูบนคลาวด์เพื่อรันวันละสองครั้ง แต่เมื่อใดก็ตามที่ฟังก์ชันถูกทริกเกอร์ ฉันได้รับข้อผิดพลาดนี้

Object reference not set to an instance of an object.: NullReferenceException
   at Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction.MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
   at Amazon.Lambda.AspNetCoreServer.AbstractAspNetCoreFunction`2.FunctionHandlerAsync(TREQUEST request, ILambdaContext lambdaContext)
   at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

comment
หากคุณกำลังเรียกใช้ฟังก์ชัน Lambda ที่เขียนใน .NET โดยใช้เหตุการณ์ cloudwatch เหตุใดจึงต้องใช้ API Gateway คุณสามารถเรียกใช้ฟังก์ชัน Lambda ได้โดยตรงจากเหตุการณ์ cloudwatch   -  person smac2020    schedule 15.03.2021


คำตอบ (1)


ฉันมีปัญหาเดียวกันและสามารถแก้ไขได้เมื่อเร็ว ๆ นี้

หากคุณใช้ Lambda กับ ASP.NET Core คุณควรมีคลาส LambdaEntryPoint เพื่อรองรับคำขอทั้งหมด ลองแทนที่เมธอด MarshallRequest ในคลาสนี้ เพิ่มการบันทึก และดูว่าคุณมีอะไรบ้างในพารามิเตอร์ apiGatewayRequest รหัสอาจมีลักษณะดังนี้:

protected override void MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
    LambdaLogger.Log($"Request path: {apiGatewayRequest.Path}");
    LambdaLogger.Log($"Request path parameters: {apiGatewayRequest.PathParameters}");
    LambdaLogger.Log($"Request body: {apiGatewayRequest.Body}");
    LambdaLogger.Log($"Request request context: {apiGatewayRequest.RequestContext}");
    base.MarshallRequest(features, apiGatewayRequest, lambdaContext);
}

ในกรณีของฉัน ค่าทั้งหมดเหล่านี้เป็นค่าว่าง เหตุผลก็คือการใช้ Amazon EventBridge เพื่อรักษา Lambda ออนไลน์เพื่อหลีกเลี่ยงการสตาร์ทแบบเย็น หากคุณใช้ EventBridge ด้วย ให้ลองกำหนดค่าคำขอที่นั่นอย่างถูกต้อง ถ้าไม่เช่นนั้น คุณสามารถลองอัปเดต MarshalRequest ด้วยวิธีต่อไปนี้:

protected override void MarshallRequest(InvokeFeatures features, APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
    if(apiGatewayRequest.RequestContext == null) //Or other property
    {
        return;
    }

    base.MarshallRequest(features, apiGatewayRequest, lambdaContext);
}
person Grigory Zhadko    schedule 07.04.2021