AWS Lambda – C#の関数

この章では、C#でAWSLambda関数を操作する方法について詳しく説明します。ここでは、Visual Studioを使用してコードを記述し、AWSLambdaにデプロイします。VisualStudioのインストールとAWSツールキットのVisualStudioへの追加に関する情報とヘルプについては、Introductionこのチュートリアルの章。Visual Studioのインストールが完了したら、以下の手順に従ってください。理解を深めるために、それぞれのスクリーンショットを参照してください-

ステップ1

Visual Studioを開き、手順に従って新しいプロジェクトを作成します。クリックFile -> New -> Project

ステップ2

これで、次の画面が表示されます。 AWS Lambda for Visual C#。選択するAWS Lambda Project (.NET Core)

必要に応じて名前を変更できます。ここではデフォルトの名前が保持されます。クリックOK 続ける。

次のステップでは、を選択するように求められます Blueprint

選択する Empty function この例では、をクリックします Finish。以下に示すように、新しいプロジェクト構造が作成されます。

ここで、 Function.cs これは、AWSLambda用にイベントとコンテキストを持つハンドラーが作成されるメインファイルです。

Functions.csファイルの表示は次のとおりです。

以下のコマンドを使用して、入力パラメーターと出力パラメーターをAWSLambda関数にシリアル化できます。

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

C#のハンドラーの詳細

ハンドラーは次のように表示されます-

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

上記のコードのさまざまなコンポーネントを以下に説明します-

FunctionHandler −これがC#AWSLambda関数の開始点です。

String input − ハンドラーへのパラメーター string input S3オブジェクト、APIゲートウェイの詳細などのすべてのイベントデータがあります。

ILambdaContext context −ILamdaContextは、コンテキストの詳細を持つインターフェイスです。ラムダ関数名、メモリの詳細、タイムアウトの詳細などの詳細があります。

Lambdaハンドラーは、同期および非同期の方法で呼び出すことができます。上記のように同期して呼び出された場合は、戻り値の型を指定できます。戻り値の型よりも非同期の場合は無効にする必要があります。

それでは、AWS Lambda C#をデプロイして、同じものをテストしてみましょう。プロジェクトを右クリックして、Publish to AWS Lambda 以下に示すように-

を埋める Function Name をクリックします Next。表示される次の画面はAdvanced Function Details 示されているように-

入力します Role Name, Memory そして Timeout。詳細ここでは、作成され使用された既存のロールを128MBとして選択し、タイムアウトを10秒として選択したことに注意してください。完了したらクリックUpload AWSLambdaコンソールに公開します。

AWS Lambda関数がアップロードされると、次の画面が表示されます。クリックInvoke作成されたAWSLambda関数を実行します。現在、記述されたコードに従って何らかの入力が必要なため、エラーが表示されます。

ここで、いくつかのサンプル入力を入力してみましょう。 Invokeもう一度。ここでは、入力ボックスにいくつかのテキストを入力し、クリックしても同じであることに注意してくださいinvoke応答セクションに大文字で表示されます。ログ出力は以下に表示されます-

ここで、AWSコンソールをチェックして、VisualStudioから関数をデプロイしたときに関数が作成されているかどうかを確認しましょう。

上で作成されたLambda関数は aws lambda using csharp 以下のスクリーンショットに示すように、同じものがAWSコンソールに表示されます-

ハンドラー署名

ハンドラーは、AWSが実行するための開始点です。ハンドラーの名前は次のように定義する必要があります-

ASSEMBLY::TYPE::METHOD

署名の詳細は以下のとおりです。

ASSEMBLY−これは、作成されたアプリケーションの.NETアセンブリの名前です。これは基本的に、プロジェクトが作成されたフォルダーの名前です。

TYPE−これはハンドラーの名前です。基本的にはnamespace.classnameです。

METHOD −これは関数ハンドラーの名前です。

ハンドラー署名のコードは次のとおりです-

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、タイプはnamespace.classnameであり、 AWSLambda3.Function 方法は FunctionHandler。したがって、ハンドラーの署名はAWSLamda3::AWSLambda3.Function::FunctionHandler

C#のコンテキストオブジェクト

コンテキストオブジェクトは、AWS環境のランタイムに関する有用な情報を提供します。コンテキストオブジェクトで使用できるプロパティは、次の表に示すとおりです。

シニア番号 プロパティと説明
1

MemoryLimitInMB

これにより、AWSLambda関数用に構成されたメモリの詳細が表示されます

2

FunctionName

AWSLambda関数の名前

3

FunctionVersion

AWSLambda関数のバージョン

4

InvokedFunctionArn

この関数を呼び出すために使用されるARN。

5

AwsRequestId

作成されたAWS関数のAWSリクエストID

6

LogStreamName

Cloudwatchログストリーム名

7

LogGroupName

Cloudwatchグループ名

8

ClientContext

AWS mobileSDKで使用する場合のクライアントアプリケーションとデバイスに関する情報

9

Identity

AWS mobileSDKで使用した場合のamazoncogbnitoIDに関する情報

10

RemainingTime

関数が終了するまでの残りの実行時間

11

Logger

コンテキストに関連付けられたロガー

このセクションでは、C#のAWSLambdaで上記のプロパティのいくつかをテストしましょう。以下のサンプルコードを確認してください-

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# 以下のようになります−

上記のコードを呼び出したときに観察できる関連出力 AWS Console 以下のようになります−

C#を使用したロギング

ロギングには、2つの機能を使用できます-

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

上記のコードに対応する出力を次に示します-

以下に示すように、CloudWatchからログを取得できます-

Lambda関数のC#でのエラー処理

このセクションでは、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!"
}