AWS Lambda – C# 函式



本章將詳細解釋如何在 C# 中使用 AWS Lambda 函式。在這裡,我們將使用 Visual Studio 來編寫程式碼並將其部署到 AWS Lambda。有關安裝 Visual Studio 和向 Visual Studio 新增 AWS 工具包的任何資訊和幫助,請參閱本教程中的**簡介**章節。完成 Visual Studio 的安裝後,請按照以下步驟操作。請參考相應的螢幕截圖以便更好地理解:

步驟 1

開啟 Visual Studio 並按照步驟建立新專案。點選**檔案 -> 新建 -> 專案**。

Introduction

步驟 2

現在,將顯示以下螢幕,您可以在其中選擇**用於 Visual C# 的 AWS Lambda**。選擇**AWS Lambda 專案 (.NET Core)**。

Visual Csharp

如果需要,您可以更改名稱,這裡將保留預設名稱。單擊**確定**繼續。

下一步將要求您選擇一個**藍圖**。

Select Blueprint

在此示例中選擇**空函式**,然後單擊**完成**。它將建立一個新的專案結構,如下所示:

Solution Explorer

現在,選擇**Function.cs**,這是建立 AWS Lambda 的事件和上下文的處理程式的主要檔案。

Functions.cs 檔案的顯示如下:

Csharp Function

您可以使用以下命令將輸入和輸出引數序列化到 AWS Lambda 函式。

[assembly: 
LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

C# 的處理程式詳細資訊

處理程式顯示如下:

public string FunctionHandler(string input, ILambdaContext context) {
   return input?.ToUpper();
}

下面解釋了上述程式碼的各個組成部分:

**FunctionHandler –** 這是 C# AWS Lambda 函式的起點。

**String input –** 處理程式引數**string input** 包含所有事件資料,例如 S3 物件、API 閘道器詳細資訊等。

**ILambdaContext context –** ILamdaContext 是一個介面,其中包含上下文詳細資訊。它包含諸如 Lambda 函式名稱、記憶體詳細資訊、超時詳細資訊等詳細資訊。

Lambda 處理程式可以同步和非同步方式呼叫。如果像上面那樣以同步方式呼叫,則可以具有返回型別。如果是非同步的,則返回型別必須是 void。

現在,讓我們部署 AWS Lambda C# 並測試它。右鍵單擊專案並單擊**釋出到 AWS Lambda**,如下所示:

Publish Explorer

Upload Lambda

填寫**函式名稱**並單擊**下一步**。下一個顯示的螢幕是**高階函式詳細資訊**,如下所示:

Advanced Function

輸入**角色名稱、記憶體**和**超時**詳細資訊。請注意,這裡我們選擇了已建立的現有角色,並使用了 128MB 記憶體和 10 秒超時。完成後,單擊**上傳**以釋出到 AWS Lambda 控制檯。

Uploading Function

上傳 AWS Lambda 函式後,您將看到以下螢幕。單擊**呼叫**以執行建立的 AWS Lambda 函式。目前,它顯示錯誤,因為它需要根據編寫的程式碼輸入一些內容。

Invoke

現在,讓我們輸入一些示例輸入並再次**呼叫**它。請注意,我們在這裡在輸入框中輸入了一些文字,並且在單擊**呼叫**後,響應部分中以大寫形式顯示了相同的文字。日誌輸出顯示如下:

Function Lambda

現在,讓我們也檢查 AWS 控制檯,看看是否建立了函式,因為我們是從 Visual Studio 部署的函式。

上面建立的 Lambda 函式是**使用 csharp 的 aws lambda**,在 AWS 控制檯中顯示如下面的螢幕截圖所示:

Create Function Csharp

Function Code Info Execution Role Csharp

Basic Setting Csharp

處理程式簽名

處理程式是 AWS 執行的起點。處理程式的名稱應定義為:

ASSEMBLY::TYPE::METHOD

簽名的詳細資訊解釋如下:

**程式集 –** 這是為建立的應用程式建立的 .NET 程式集的名稱。它基本上是建立專案的資料夾的名稱。

**型別 –** 這是處理程式的名稱。它基本上是名稱空間.類名。

**方法 –** 這是函式處理程式的名稱。

處理程式簽名的程式碼如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda3 {
   public class Function {

      /// <summary>
      /// A simple function that takes a string and does a ToUpper
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public string FunctionHandler(string input, ILambdaContext context) {
         return input?.ToUpper();
      }
   }
}

請注意,這裡的程式集是**AWSLamda3**,型別是名稱空間.類名,即**AWSLambda3.Function**,方法是**FunctionHandler**。因此,處理程式簽名是**AWSLamda3::AWSLambda3.Function::FunctionHandler**

C# 中的上下文物件

上下文物件提供了有關 AWS 環境中執行時的有用資訊。上下文物件中可用的屬性如下表所示:

序號 屬性和說明
1

MemoryLimitInMB

這將提供為 AWS Lambda 函式配置的記憶體的詳細資訊

2

FunctionName

AWS Lambda 函式的名稱

3

FunctionVersion

AWS Lambda 函式的版本

4

InvokedFunctionArn

用於呼叫此函式的 ARN。

5

AwsRequestId

為建立的 AWS 函式生成的 AWS 請求 ID

6

LogStreamName

Cloudwatch 日誌流名稱

7

LogGroupName

Cloudwatch 組名稱

8

ClientContext

與 AWS 移動 SDK 一起使用時,有關客戶端應用程式和裝置的資訊

9

Identity

與 AWS 移動 SDK 一起使用時,有關 amazon cogbnito 身份的資訊

10

RemainingTime

函式終止之前的剩餘執行時間

11

Logger

與上下文關聯的記錄器

示例

在本節中,讓我們在 C# 中的 AWS Lambda 中測試上述一些屬性。觀察下面給出的示例程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]

namespace AWSLambda6 {
   public class Function {

      /// <summary>
      /// </summary>
      /// <param name="input"></param>
      /// <param name="context"></param>
      /// <returns></returns>
      public void FunctionHandler(ILambdaContext context) {
         LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
         context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
         LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
      }
   }
}

當您在**C#**中呼叫上述程式碼時,您可以觀察到的相關輸出如下所示:

Context Object Csharp

當您在**AWS 控制檯**中呼叫上述程式碼時,您可以觀察到的相關輸出如下所示:

Context Object Output

使用 C# 進行日誌記錄

對於日誌記錄,您可以使用兩個函式:

  • context.Logger.Log

  • LambdaLogger.Log

觀察此處顯示的以下示例:

public void FunctionHandler(ILambdaContext context) {
   LambdaLogger.Log("Function name: " + context.FunctionName+"\n");
   context.Logger.Log("RemainingTime: " + context.RemainingTime+"\n");
   LambdaLogger.Log("LogGroupName: " + context.LogGroupName+"\n");            
}

上面給出的程式碼的相應輸出顯示在此處:

Logging Using Csharp

您可以從 CloudWatch 獲取日誌,如下所示:

Log Group

C# 中 Lambda 函式的錯誤處理

本節討論 C# 中的錯誤處理。對於錯誤處理,必須擴充套件**Exception** 類,如下面的示例所示:

示例

namespace example {            
   public class AccountAlreadyExistsException : Exception {
      public AccountAlreadyExistsException(String message) :
         base(message) {
      }
   }
} 
namespace example {
   public class Handler {
     public static void CreateAccount() {
       throw new AccountAlreadyExistsException("Error in AWS Lambda!");
     }
   }
}

上面給出的程式碼的相應輸出如下所示:

{
   "errorType": "LambdaException",
   "errorMessage": "Error in AWS Lambda!"
}
廣告