tech.guitarrapc.cóm

Technical updates

.NET Core on Lambdaのローカルデバッグでロガーと変数確認する

Serverlessといっても大事なのはローカルで実行できるかです。どんなに便利でも高速なイテレーションが回せないものは継続せず触らなくなったり進化の波に乗れません。

さて、.NET Core on Lambdaが出た当初にローカルデバッグでILambdaContextがないためcontext触ろうとするとエラーが出ていましたがサクッと解決できるのでしましょう。

これができることで、関数内の変数を見たり、ローカル実行専用の任意ロガー実装を差し込んだりできます。便利。

https://tech.guitarrapc.com/entry/2016/12/05/055458

ILambdaContext の実装クラスを作る

前回のエラーはILambdaContextの実装がなく、nullを渡していたためでした。ということでcontextをザクッと1ファイルに書いちゃいます。ILambdaContextはご自分の関数でもshared classにしてください。

https://gist.github.com/guitarrapc/32bd4c3a4745f0552408756cc5972111

これでローカル実行用のProgram.csからLambda関数呼び出し時にcontextが渡せ、Loggerの中でコンソールに書き出します。

https://gist.github.com/guitarrapc/fdf2d64d6ef5c127e6ed99dab30ed143

ローカル実行して上手く通っていますね?

ちなみに、AWS Lambda Project with Testsでプロジェクト追加したときのテストクラスではTestClientContextが用意されており、その中のTestClientContextは以下のような実装になっています。大体同じですね。

  public class TestLambdaLogger : ILambdaLogger
  {
    /// <summary>
    /// Buffer for all the log messages written to the logger.
    /// </summary>
    public StringBuilder Buffer { get; } = new StringBuilder();

    /// <summary>Write log messages to the console.</summary>
    /// <param name="message"></param>
    public void Log(string message)
    {
      this.LogLine(message);
    }

    /// <summary>Write log messages to the console.</summary>
    /// <param name="message"></param>
    public void LogLine(string message)
    {
      this.Buffer.AppendLine(message);
      Console.WriteLine(message);
    }
  }

そのためテストクラスではvar context = new TestLambdaContext();のままでokです。

まとめ

簡単な実装でずいぶんと楽になります。インタフェースなのでお好きな実装でどうぞ。

リポジトリも更新してあります。

https://github.com/guitarrapc/AWSLambdaCSharpIntroduction