fungsi aws lambda menggunakan template tanpa server dari inti asp.net

Saya tidak memiliki cukup pengetahuan tentang aws tetapi perusahaan saya meminta saya melakukan pekerjaan yang menurut saya merupakan pekerjaan yang dilakukan AWS Lambda dengan sempurna. Syaratnya saya harus membuat layanan yang memiliki endpoint yang perlu dipanggil dua kali sehari. Pendekatan yang saya ikuti adalah saya membuat API web tanpa server melalui visual studio dan membuat titik akhir gateway API untuk setiap titik akhir. Kemudian menambahkan pemicu melalui acara cloud watch untuk menjalankannya dua kali sehari tetapi setiap kali fungsi tersebut dipicu saya mendapatkan kesalahan ini.

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 )

person k.jabs    schedule 15.03.2021    source sumber
comment
Jika Anda menjalankan fungsi Lambda yang ditulis dalam .NET menggunakan peristiwa cloudwatch, mengapa menggunakan API Gateway? Anda dapat menjalankan fungsi Lambda langsung dari acara cloudwatch.   -  person smac2020    schedule 15.03.2021


Jawaban (1)


Saya memiliki masalah yang sama dan dapat memperbaikinya baru-baru ini.

Jika Anda menggunakan Lambda dengan ASP.NET Core, Anda harus memiliki kelas LambdaEntryPoint untuk menangani semua permintaan. Cobalah untuk mengganti metode MarshallRequest di kelas ini, tambahkan logging dan lihat apa yang Anda miliki di parameter apiGatewayRequest. Kodenya bisa terlihat seperti ini:

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);
}

Dalam kasus saya, semua nilai-nilai ini adalah nol. Alasannya adalah menggunakan Amazon EventBridge untuk menjaga Lambda tetap online untuk menghindari awal yang buruk. Jika Anda juga menggunakan EventBridge, coba konfigurasikan permintaan di sana dengan benar. Jika belum, Anda dapat mencoba memperbarui MarshalRequest dengan cara berikut:

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