---
title: "Datadog を使用した AWS Lambda Provisioned Concurrency メトリクスの監視"
description: "Provisioned Concurrency を設定した AWS Lambda 関数について詳しく理解し、最適に利用する方法をご紹介します。"
author: "Kai Xin Tai"
date: 2019-12-03
tags: ["serverless monitoring", "aws", "aws lambda", "microservices"]
blog_type_id: the-monitor
locale: ja
---

サーバーレスコンピューティングの普及が拡大を続けるなか、その多くのプラットフォームに [AWS Lambda](https://aws.amazon.com/lambda/) が採用されています。Provisioned Concurrency は、AWS がごく最近リリースした AWS Lambda の新機能です。Provisioned Concurrency を使用すると、ネットワークがトラフィックバーストを起こしている間でも、コールドスタートに対する耐性を高めることができます。消費者がアプリケーションを使用する際、画面の表示に時間がかかったり、リクエストがタイムアウトしたりすると、ユーザーエクスペリエンスが損なわれ、収益の大幅な低下にもつながります。Provisioned Concurrency を使用すれば、関数を初期化された状態に保てるため、リクエストをミリ秒単位で処理できます。

Detadog はこのたび、[AWS Lambda インテグレーション](https://docs.datadoghq.com/integrations/amazon_lambda.md?tab=awsconsole)に Provisioned Concurrency メトリクスを組み込みました。このアップデートにより、AWS Lambda インテグレーションの利用を開始してすぐに、実行中の関数をモニタリングできるようになります。[すぐに使える Lambda ダッシュボード](https://app.datadoghq.com/screen/integration/98/aws-lambda?from_ts=1574700300000&to_ts=1574703900000&live=true)と[サーバーレスビュー]()により、他のツールを使うことなく、Lambda のすべての関数を包括的に可視化（Provisioned Concurrency 利用率など）することが可能です。

![すぐに使える AWS Lambda ダッシュボードがアップデート。Provisioned Concurrency メトリクスを搭載。](https://web-assets.dd-static.net/42588/1776301394-monitor-aws-lambda-provisioned-concurrency-updated-dashboard-v3.png)

## Provisioned Concurrency の仕組み

AWS Lambda では、Lambda 関数を最初に呼び出した時、あるいはアクティブでない状態がしばらく続いた後にレスポンス時間が増加することを**コールドスタート**と呼びます。この期間に AWS は、ランタイムコンテナのプロビジョニングや、外部との依存関係の初期化など、リクエストへの対応に必要な関数の[実行コンテキスト](https://docs.aws.amazon.com/lambda/latest/dg/running-lambda-code.html)のセットアップを行います。マイクロサービス環境などで、サーバーレス関数が互いに依存していると、トラフィックの急増によってコールドスタートが次々と発生し、ユーザー側でアプリケーションに大幅な遅延が発生する場合があります。Provisioned Concurrency を利用すれば、このようなコールドスタートを軽減できるため、サーバーレスアプリケーションのパフォーマンスを、規模の大小を問わず最適化することができます。

![リクエストトレースを検索し、AWS Lambda 関数内のコールドスタートを特定することが可能。](https://web-assets.dd-static.net/42588/1776301399-monitor-aws-lambda-provisioned-concurrency-cold-start.png)

Provisioned Concurrency を理解するために、まず Lambda での[同時実行の上限](https://docs.aws.amazon.com/lambda/latest/dg/scaling.html)について理解しましょう。特定の Lambda 関数に対して同時実行を予約すると、指定された数のインスタンスが、リクエストにいつでも対応できる状態になります。同時実行が上限に達すると、Lambda は 1 つの関数が他の関数に必要なリソースをすべて消費するのを防ぐよう、関数を自動的に調整します。

この方法で Lambda は同時実行を可能にし、またインスタンスをリクエストへの対応が可能な状態にもしています。Provisioned Concurrency を利用して Lambda 関数を構成すれば、関数が初期化された状態に保たれるので、関数の起動にかかる時間を大幅に短縮することができます。特定の関数に対し AWS が初期化コードを実行するよう Provisioned Concurrency を設定すれば、その関数はリクエストを受信してからミリ秒単位で応答を返します。

Provisioned Concurrency の管理には、AWS マネジメントコンソール、Lambda API、AWS CLI、AWS CloudFormation などの AWS インターフェイスを使用します。ステーブルバージョンの Lambda 関数に対して Provisioned Concurrency を構成するには、その関数のエイリアスを指定します。それにより、エイリアスが Datadog の Provisioned Concurrency メトリクスで とタグ付けして表示されます。Provisioned Concurrency は（トラフィックの多い時間に使用するなど）スケジュールベースでも、ターゲットをトラッキングするようにも構成できます。AWS は [Auto Scaling](https://aws.amazon.com/autoscaling/) を使用し、指定されたスケジュールに応じて、あるいは（ターゲットをトラッキングする場合は）受信するトラフィックの量やターゲットの利用状況レベルに応じて、Provisioned Concurrency の上限を動的に調整します。

## Provisioned Concurrency 利用の最適化

Provisioned Concurrency の利用を拡大するか、あるいは縮小するかを適切に判断するために、その利用状況を把握することが非常に重要です。Datadog の AWS Lambda インテグレーションは、以下の 4 つの新しいメトリクスを自動的に収集します。

- Provisioned Concurrency を使用した、関数ごとの同時実行数の合計（`aws.lambda.provisioned_concurrent_executions`）
- Provisioned Concurrency を使用した、関数への呼び出しリクエストの合計数（`aws.lambda.provisioned_concurrent_invocations`）
- Provisioned Concurrency の同時実行の上限と同時実行数の比較（`aws.lambda.provisioned_concurrent_spillover_invocations`）
- 関数ごとの Provisioned Concurrency の使用率（`aws.lambda.provisioned_concurrent_utilization`）

Datadog のインテグレーションは、AWS からメタデータ（関数名、実行バージョン、リージョンなど）を入手し、他の Lambda メトリクスと同じ方法で Provisioned Concurrency メトリクスの収集とタグ付けを行います。これらのタグのほか自作のタグも追加すると、あらゆるディメンションのデータを分析することが可能です。同時実行を設定していない関数も含め、AWS Lambda のすべての関数について、詳しい情報を 1 つの画面でまとめて確認できます。

### プロビジョニングが不十分な関数を特定する

![サーバーレスビューで関数の並べ替えが可能。同時実行数の順に関数を並べ替えれば、プロビジョニングが不十分な関数を特定することもできる。](https://web-assets.dd-static.net/42588/1776301403-monitor-aws-lambda-provisioned-concurrency-serverless-sorted-utilization.png)

先ほどの 4 つのメトリクスは、表の右上にある歯車アイコンをクリックし、メトリクスを選ぶことで、サーバーレスビューに追加できます。たとえば、同時実行の上限と実際の同時実行数の比較（`aws.lambda.provisioned_concurrent_spillover_invocations`）のメトリクスを追加し、その値の順に関数を並べ替えれば、プロビジョニングが不十分な関数や、コールドスタートを起こすリスクのある関数を特定することができます。また、Provisioned Concurrency の利用レベルが上限に近づいたら自動的に通知を送るようアラートを設定することも可能です。このような方法で、ボトルネックによってアプリケーションのパフォーマンスが低下する前に、上限を増やすかどうかを適切に判断することができます。

### 割り当てをリアルタイムに調整する

![Lambda のすぐに使えるダッシュボードに表示されたグラフから、Provisioned Concurrency 利用率の傾向を確認できる。](https://web-assets.dd-static.net/42588/1776301408-monitor-aws-lambda-provisioned-concurrency-dashboard-utilization-graph-v2.png)

このほかにも、すぐに使えるダッシュボードには、関数ごとの Provisioned Concurrency の利用率（`aws.lambda.provisioned_concurrent_utilization`）がグラフで表示されます。このグラフから、特定の関数に一定して Provisioned Concurrency をあまり利用していない時間帯があると確認できた場合は、その時間帯をスケジュールから削除し、使わないリソースに費用をかけることを防ぐことができます。

## 構成の方法

Provisioned Concurrency を有効にするには、AWS Lambda コンソールから直接構成します。Serverless Framework を使用している場合は、下記の例のように、**serverless.yml** ファイル内で該当する関数に `provisionedConcurrency` 変数を追加するだけで構成できます。

*serverless.yml*
```yml
functions:
  hello:
    handler: handler.hello
      events:
        - http:
            path: /hello
        method: get
    provisionedConcurrency: 5
```

この例では、`hello` 関数の同時実行インスタンス数を 5 に設定し、この関数を初期化してリクエストに対応できる状態を保つよう AWS を構成しています。

## サーバーレスのモニタリングをシームレスに

Datadog を利用すれば、AWS Lambda のすべての関数のモニタリングや、パフォーマンスのトラブルシューティングを、カスタムメトリクス、分散型トレース、ログなどの豊富な機能によってリアルタイムに行うことができます。AWS との強力なパートナーシップにより実現した今回の Lambda インテグレーションアップデートにより、Provisioned Concurrency の構成を費用とパフォーマンスの両面から最適化することが可能です。Datadog をすでにお使いの方は、[ドキュメント](https://docs.datadoghq.com/integrations/amazon_lambda.md?tab=awsconsole)を参照して、Provisioned Concurrency の利用状況を、その他のサーバレス環境と併せてモニタリングされることをお勧めします。Datadog をまだお持ちでない方は、14日間の<!-- Sign-up trigger (無料トライアル) omitted -->をぜひお試しください。