AWS Lambda での C# コードの作成 - AWS Lambda

AWS Lambda での C# コードの作成

Lambda が AWS X-Ray と統合され、Lambda アプリケーションのトレース、デバッグ、および最適化が可能になります。X-Ray を使用すると、フロントエンド API からバックエンドのストレージとデータベースまで、アプリケーション内のリソースを横断する際にリクエストをトレースできます。X-Ray SDK ライブラリをビルド設定に追加するだけで、関数が AWS のサービスに対して行う呼び出しのエラーとレイテンシーを記録できます。

X-Ray サービスマップには、アプリケーションからのリクエストのフローが表示されます。エラープロセッサ のサンプルアプリケーションの次の例は、2 つの関数を持つアプリケーションを示しています。プライマリ関数はイベントを処理し、エラーを返す場合があります。2 番目の関数は、最初のロググループに表示されるエラーを処理し、AWS SDK を使用して X-Ray、Amazon S3 と Amazon CloudWatch Logs を呼び出します。


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

トレースヘッダーがないリクエストをトレースするには、関数の設定でアクティブトレースを有効にします。

アクティブトレースを有効にするには

  1. Lambda コンソール (関数ページ) を開きます。

  2. 関数を選択します。

  3. [AWS X-Ray] で、[アクティブトレース] を選択します。

  4. [Save] を選択します。

料金

X-Ray には期限なしの無料利用枠があります。無料利用枠のしきい値を超えると、X-Ray ではトレースのストレージと取得に課金されます。詳細については、「AWS X-Ray 料金表」を参照してください。

関数には、トレースデータを X-Ray にアップロードするためのアクセス許可が必要です。Lambda コンソールでアクティブトレースを有効にすると、Lambda によって関数の実行ロールに必要なアクセス許可が追加されます。それ以外の場合は、AWSXRayDaemonWriteAccess ポリシーを実行ロールに追加します。

X-Ray はサンプリングアルゴリズムを適用することで、トレースを効率的にしつつ、アプリケーションが処理するリクエストの代表的なサンプルを提供できるようにします。デフォルトのサンプリングルールは 1 秒あたり 1 回のリクエストおよび追加リクエストの 5 パーセントです。このサンプリングレートは、Lambda 関数には設定できません。

アクティブなトレースが有効な場合、Lambda は呼び出しのサブセットのトレースを記録します。Lambda は 2 つのセグメントを記録し、サービスマップ上に 2 つのノードを作成します。最初のノードは、呼び出しリクエストを受信する Lambda サービスを表します。2 番目のノードは、関数のランタイムによって記録されます。


      単一の関数を持つ X-Ray サービスマップ。

関数コードを実装して、メタデータを記録し、ダウンストリームコールをトレースできます。関数が他のリソースやサービスに対して行うコールの詳細を記録するには、X-Ray SDK for .NET を使用します。SDK を取得するには、AWSXRayRecorder パッケージをプロジェクトファイルに追加します。

src/blank-csharp/blank-csharp.csproj

<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles> <AWSProjectType>Lambda</AWSProjectType> </PropertyGroup> <ItemGroup> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Amazon.Lambda.Core" Version="1.1.0" /> <PackageReference Include="Amazon.Lambda.SQSEvents" Version="1.1.0" /> <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.7.0" /> <PackageReference Include="AWSSDK.Core" Version="3.3.104.38" /> <PackageReference Include="AWSSDK.Lambda" Version="3.3.108.11" /> <PackageReference Include="AWSXRayRecorder.Core" Version="2.6.2" /> <PackageReference Include="AWSXRayRecorder.Handlers.AwsSdk" Version="2.7.2" /> </ItemGroup> </Project>

AWS SDK クライアントを実装するには、初期化コードで RegisterXRayForAllServices メソッドを呼び出します。

src/blank-csharp/Function.cs – X-Ray の初期化

static async void initialize() { AWSSDKHandler.RegisterXRayForAllServices(); lambdaClient = new AmazonLambdaClient(); await callLambda(); }

次の例は、2 つのセグメントのあるトレースを示しています。どちらも my-function という名前ですが、1 つは AWS::Lambda 型で、もう 1 つは AWS::Lambda::Function 型です。関数セグメントを拡張して、そのサブセグメントを表示します。

最初のセグメントは、Lambda サービスによって処理される呼び出しリクエストを表します。2 番目のセグメントは、関数によって行われた処理を記録します。この関数セグメントには、3 つのサブセグメントがあります。

  • 初期化 – 関数のロードと初期化コードの実行にかかった時間を表します。このサブセグメントは、関数の各インスタンスによって処理される最初のイベントに対してのみ表示されます。

  • 呼び出し – ハンドラコードによって行われた処理を表します。コードをインストルメント化することにより、このサブセグメントを追加のサブセグメントで拡張できます。

  • オーバーヘッド – 次のイベントを処理する準備をするために Lambda ランタイムによって行われた処理を表します。

HTTP クライアントをインストルメントし、SQL クエリを記録し、注釈とメタデータからカスタムサブセグメントを作成することもできます。詳細については、AWS X-Ray 開発者ガイド の「X-Ray SDK for .NET」を参照してください。

Lambda API でのアクティブトレースの有効化

AWS CLI または AWS SDK を使用してトレース設定を管理するには、以下の API オペレーションを使用します。

以下の例の AWS CLI コマンドは、my-function という名前の関数でアクティブトレースを有効にします。

$ aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

トレースモードは、関数のバージョンの公開時にロックされるバージョン固有の設定に含まれます。公開後のバージョンのトレースモードを変更することはできません。

AWS CloudFormation でのアクティブトレースの有効化

AWS CloudFormation テンプレートで AWS::Lambda::Function リソースに対してアクティブトレースを有効にするには、TracingConfig プロパティを使用します。

function-inline.yml – トレース設定

Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

AWS サーバーレスアプリケーションモデル (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml – トレース設定

Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...