はじめに
こんにちは。小川です。
今回は、Lambdaのログやメトリクスを簡単に出力することが出来る
AWS Lambda Powertoolsを使ってみました。
下記の公式ドキュメントの通り、
AWS Lambda Powertools for .NETの一般提供が開始されました。
.NETの学習も兼ねて、下記ブログを参考に作成しました。
目次
1..NETのプロジェクトを作成
2.Logging
3.Tracing
4.Metrics
5.つまづいた箇所
.NETのプロジェクトを作成
まずはプロジェクトの作成から進めます。
入力された英語を大文字で返す、
簡単なLambda作成します。
SAMテンプレート
.NETのテンプレートからも作成可能ですが、
今回は、SAMのテンプレートからプロジェクトを作成します。
$ sam init
設定内容は以下の通りです。
・テンプレートソースは、1 - AWS Quick Start Templates
・テンプレートは、1 - Hello World Example
・ランタイムは、dotnet6
・X-rayトレーシングはONを選択
コーディング
下記のようなコードを作成しました。
Functions.cs
using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Net.Http; using System.Text.Json; using Amazon.Lambda.Core; using Amazon.Lambda.APIGatewayEvents; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly:LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace HelloWorld { public class Function { public string FunctionHandler(object input, ILambdaContext context) { var input_string = input.ToString(); var upper_string = UpperCaseString(input_string); LambdaLogger.Log(input_string); LambdaLogger.Log(upper_string); return upper_string; } private static string UpperCaseString(string input) { return input.ToUpper(); } } }
template.ymlに関数名を入力します。
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: FunctionName: [関数名]
デプロイ
CloudFormationからデプロイします。
バケット名には、テンプレート保存用のS3バケット名を入力します。
任意のスタック名を入力して、下記コマンドを実行します。
$ aws cloudformation package --template-file template.yaml --s3-bucket [バケット名] --output-template-file packaged-template.yaml $ dotnet lambda deploy-serverless --s3-bucket [バケット名] --stack-name [スタック名]
実行
下記パラメータでテストを実行します。
{
"statusCode": 200,
"body": "Hello world"
}CloudWatchログを確認します。

大文字が返ってきてますね。
CLIからでも実行が可能です。
$ dotnet lambda invoke-function [関数名] --payload "Hello world" Amazon Lambda Tools for .NET Core applications (5.6.3) Project Home: https://github.com/aws/aws-extensions-for-dotnet-cli, https://github.com/aws/aws-lambda-dotnet Payload: "HELLO WORLD" (以下、省略)
Logging
Powertoolをプロジェクトに追加します。
$ dotnet add package AWS.Lambda.Powertools.Logging
SAMテンプレートに環境変数を追加します。
template.yaml
Globals:
Function:
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: powertools-dotnet-logging-sample
POWERTOOLS_LOG_LEVEL: Debug
POWERTOOLS_LOGGER_CASE: SnakeCase
Lambda関数にLoggingを追加します。
Function.cs
namespace HelloWorld
{
public class Function
{
[Logging(LogEvent = true)]
public string FunctionHandler(object input, ILambdaContext context)
{
var input_string = input.ToString();
var upper_string = UpperCaseString(input_string);
Logger.LogInformation(input_string);
Logger.LogInformation(upper_string);
return upper_string;
}
private static string UpperCaseString(string input)
{
return input.ToUpper();
}
}
}
デプロイ、実行するとCloudWatchログの出力が変更されます。
CloudWatchログ

ログのインサイト

Tracing
Powertoolをプロジェクトに追加します。
$ dotnet add package AWS.Lambda.Powertools.Tracing
SAMテンプレートに環境変数を追加します。
template.yaml
Globals:
Function:
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: powertools-dotnet-tracing-sample
POWERTOOLS_TRACER_CAPTURE_RESPONSE: true
POWERTOOLS_TRACER_CAPTURE_ERROR: true
Lambda関数にTracingを追加します。
Function.cs
namespace HelloWorld
{
public class Function
{
[Tracing]
public string FunctionHandler(object input, ILambdaContext context)
{
var input_string = input.ToString();
var upper_string = UpperCaseString(input_string);
LambdaLogger.Log(input_string);
LambdaLogger.Log(upper_string);
return upper_string;
}
[Tracing(SegmentName = "UpperCaseString Method")]
private static string UpperCaseString(object input)
{
return input.ToString().ToUpper();
}
}
}
デプロイ、実行するとX-rayの出力が変更されます。

Metrics
Powertoolをプロジェクトに追加します。
$ dotnet add package AWS.Lambda.Powertools.Metrics
SAMテンプレートに環境変数を追加します。
template.yaml
Globals:
Function:
Environment:
Variables:
POWERTOOLS_SERVICE_NAME: powertools-dotnet-tracing-sample
POWERTOOLS_METRICS_NAMESPACE: AWSLambdaPowertools
Lambda関数にMetricsを追加します。
Function.cs
namespace HelloWorld
{
public class Function
{
public string FunctionHandler(object input, ILambdaContext context)
{
var input_string = input.ToString();
var upper_string = UpperCaseString(input_string);
LambdaLogger.Log(input_string);
LambdaLogger.Log(upper_string); return upper_string;
}
[Metrics(CaptureColdStart = true)]
private static string UpperCaseString(object input)
{
Metrics.PushSingleMetric("UpperCaseString_Invocations", 1, MetricUnit.Count);
return input.ToString().ToUpper();
}
}
}
デプロイ、実行するとCloudWatchメトリクスの出力が追加されます。
CloudWatchメトリクス

