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 を呼び出します。

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

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

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

  2. 関数を選択します。

  3. [Configuration] (設定)、[Monitoring tools] (モニタリングツール) の順に選択します。

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

  5. [X-Ray] で、[Active tracing] (アクティブトレース) を有効にします。

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

Pricing

X-Ray では、無期限の無料利用枠をご利用いただけます。無料利用枠の限度を超えると、X-Ray ではトレースのストレージと取得に対する料金が発生します。詳細については、「AWS X-Ray 料金表」を参照してください。

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

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

アクティブなトレースが有効になっている場合、Lambda は呼び出しのサブセットのトレースを記録します。Lambda は 2 つのセグメントを記録し、サービスマップ上に 2 つのノードを作成します。1 つめのノードは、呼び出しリクエストを受信する 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::Lambda::Function テンプレートで AWS CloudFormation リソースに対してアクティブトレースを有効にするには、TracingConfig プロパティを使用します。

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

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

AWS Serverless Application Model (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml - トレース設定

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