AWS Lambda での Python コードの作成 - AWS Lambda

AWS Lambda での Python コードの作成

注記

Python 3.6 ランタイムのサポートは、2022 年 7 月 18 日で終了します。詳細については、「ランタイムの非推奨化に関するポリシー」を参照してください。

Lambda アプリケーションのトレース、デバッグ、および最適化を行うために、Lambda は AWS X-Ray と統合されています。X-Ray を使用すると、Lambda 関数や他の AWS のサービスが含まれるアプリケーション内で、リソースを横断するリクエストをトレースできます。

トレースされたデータを X-Ray に送信するには、以下の 2 つの SDK ライブラリのいずれかを使用します。

ADOT と X-Ray SDK を使用することで、テレメトリーデータを X-Ray サービスに送信できます。その後、X-Ray を使用して、アプリケーションのパフォーマンスメトリクスの表示やフィルタリングを行い、インサイトを取得することで、問題点や最適化のための手法を同定できます。

重要

ADOT は、Lambda 関数の計測用として推奨されている手法です。すべての新しいアプリケーションでは、ADOT を使用することをお勧めします。ただし、OpenTelemetry に備わる柔軟性が原因で、Lambda 関数の呼び出し時に、コールドスタートのレイテンシーが増加する可能性があります。低レイテンシーに対する最適化を行っており、テレメトリの相関関係やバックエンドの送信先に関する動的な設定など、OpenTelemetry の高度な機能も必要としない場合は、ADOT の AWS X-Ray SDK が便利です。

ADOT を使用して Python 関数をインストルメント化する

ADOT はフルマネージド型の Lambda レイヤーを提供します。こにより、OTel SDK を使用してテレメトリデータを収集するために必要なすべてがパッケージ化されます。このレイヤーを使用すると、関数コードを変更する必要はなしで、Lambda 関数を計測できます。また、このレイヤーは、OTel でのカスタムな初期化を実行するように構成することもできます。詳細については、ADOT のドキュメントの「Custom configuration for the ADOT Collector on Lambda」(Lambda 上での ADOT Collector のカスタム設定) 参照してください。

Python ランタイムの場合は、AWS マネージド Lambda layer for ADOT Python を追加して、関数を自動的に計測できます。このレイヤーは、arm64 アーキテクチャと x86_64 アーキテクチャの両方で機能します。このレイヤーの使用方法の詳細については、ADOT のドキュメントの「AWS Distro for OpenTelemetry Lambda Support for Python」を参照してください。

X-Ray SDK を使用して Python 関数をインストルメント化する

Lambda 関数がアプリケーション内の他のリソースに対して行う呼び出しの詳細を記録するために、AWS X-Ray SDK for Python を使用することもできます。SDK を取得するには、アプリケーションの依存関係に aws-xray-sdk パッケージを追加します。

requirements.txt

jsonpickle==1.3 aws-xray-sdk==2.4.3

機能コードでは、boto3 ライブラリに aws_xray_sdk.core モジュールをパッチすることにより、AWS SDK クライアントをインストルメント化できます。

関数 - AWS SDK クライアントのトレース

import boto3 from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.core import patch_all logger = logging.getLogger() logger.setLevel(logging.INFO) patch_all() client = boto3.client('lambda') client.get_account_settings() def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ))) ...

正しい依存関係を追加し、必要なコード変更を行った後、Lambda コンソールまたはAPIを介して関数の設定でトレースをアクティブにします。

Lambda コンソールを使用したトレースの有効化

コンソールを使用して Lambda 関数のアクティブなトレースを切り替えるには、次のステップに従います。

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

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

  2. 関数を選択します。

  3. [Configuration] (設定) を選択してから、[Monitoring and operations tools] (モニタリングおよび運用ツール) を選択します。

  4. [Edit] (編集) を選択します。

  5. [X-Ray] で、[Active tracing] (アクティブトレース) をオンに切り替えます。

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

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

AWS CLI または AWS SDK で Lambda 関数のトレースを設定するには、次の 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 Serverless Application Model (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml - トレース設定

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

X-Ray トレースの解釈

関数には、トレースデータを X-Ray にアップロードするためのアクセス許可が必要です。Lambda コンソールでトレースを有効にすると、Lambda は必要な権限を関数の [execution role] (実行ロール) に追加します。それ以外の場合は、AWSXRayDaemonWriteAccess ポリシーを実行ロールに追加します。

アクティブトレースの設定後は、アプリケーションを通じて特定のリクエストの観測が行えるようになります。[X-Ray service graph] (X-Rayサービスグラフ) には、アプリケーションとそのすべてのコンポーネントに関する情報が表示されます。エラープロセッサ のサンプルアプリケーションの次の例は、2 つの関数を持つアプリケーションを示しています。プライマリ関数はイベントを処理し、エラーを返す場合があります。上位 2 番目の関数は、最初のロググループに表示されるエラーを処理し、AWS SDKを使用してX-Ray、Amazon Simple Storage Service (Amazon S3)、および Amazon CloudWatch Logs を呼び出します。


        X-Ray の 2 つの個別のアプリケーションとそれぞれに関係するサービスマップを示した図

X-Ray は、アプリケーションへのすべてのリクエストをトレースするわけではありません。X-Ray は、サンプリングアルゴリズムを適用することで効率的なトレースを行い、同時に、すべてのリクエストについての代表的なサンプルを示します。サンプルレートは 1 秒あたり 1 回のリクエストで、追加リクエストの 5% です。

注記

関数の X-Ray サンプルレートは設定することはできません。

アクティブトレースを使用する場合、Lambda はトレースごとに 2 つのセグメントを記録します。これにより、サービスグラフに 2 つのノードが作成されます。次のイメージは、上記のエラープロセッサの例の主要機能のこれら 2 つのノードを示しています。


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

左に示された 1 つめのノードは、呼び出しリクエストを受信する Lambda サービスを表しています。2 番目のノードは、特定の Lambda 関数を表しています。次の例は、これら 2 つのセグメントを使用したトレースを示しています。いずれも my-function と名付けられていますが、1 つは AWS::Lambda が起点があり、もう 1 つは AWS::Lambda::Function が起点があります。


        特定の Lambda 呼び出しの各サブセグメント間に生じるレイテンシーを示した X-Ray トレース。

この例では、関数セグメントを展開して、それの 3 つのサブセグメントが表示されています。

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

  • [Invocation] (呼び出し) - ハンドラーコードの実行に費やされた時間を表します。

  • [Overhead] (オーバーヘッド) - Lambda ランタイムが次のイベントを処理するための準備に費やす時間を表します。

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

料金

X-Ray トレースは、毎月、AWS 無料利用枠で設定された一定限度まで無料で利用できます。X-Ray の利用がこの上限を超えた場合は、トレースによる保存と取得に対する料金が発生します。詳細については、「AWS X-Ray 料金表」を参照してください。

ランタイムの依存関係のレイヤーへの保存 (X-Ray SDK)

X-Ray SDK を使用して AWS SDK クライアントを関数コードに埋め込むと、デプロイパッケージが巨大になる可能性があります。機能コードを更新するたびに実行時の依存関係がアップロードされないようにするには、X-Ray SDK を [Lambda layer] (Lambda レイヤー) にパッケージ化します。

次に、AWS X-Ray SDK for Python を保存している AWS::Serverless::LayerVersion リソースの例を示します。

template.yml - 依存関係レイヤー

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-python-lib Description: Dependencies for the blank-python sample app. ContentUri: package/. CompatibleRuntimes: - python3.8

この設定では、ランタイム依存関係を変更した場合にのみ、ライブラリレイヤーの更新が必要です。関数のデプロイパッケージにはユーザーのコードのみが含まれるため、アップロード時間を短縮できます。

依存関係のレイヤーを作成するには、デプロイ前にレイヤーアーカイブを生成するようにビルドを変更する必要があります。実際の例については、blank-python サンプルアプリケーションを参照してください。