AWS Lambda での Ruby の作成 - AWS Lambda

AWS Lambda での Ruby の作成

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

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

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

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

アクティブトレースをオンにするには
  1. Lambda コンソールの [関数ページ] を開きます。

  2. 関数を選択します。

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

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

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

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

料金

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

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

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

X-Ray では、トレースは 1 つ以上のサービスによって処理されるリクエストに関する情報を記録します。Lambda はトレースごとに 2 つのセグメントを記録します。これにより、サービスグラフに 2 つのノードが作成されます。次の図は、これら 2 つのノードを強調表示しています。

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

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

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

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

注記

AWS は現在、Lambda サービスに変更を実装しています。これらの変更により、AWS アカウント のさまざまな Lambda 関数によって出力されるシステムログメッセージとトレースセグメントの構造と内容にわずかな違いが生じる場合があります。

ここで示すトレースの例は、古いスタイルの関数セグメントを示しています。古いスタイルのセグメントと新しいスタイルのセグメントの違いについては、次の段落で説明します。

これらの変更は今後数週間に実装され、中国および GovCloud リージョンを除くすべての AWS リージョンのすべての関数は、新しい形式のログメッセージとトレースセグメントを使用するように移行されます。

古いスタイルの関数セグメントには、次のサブセグメントが含まれます。

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

  • [呼び出し] - ハンドラーコードの実行に要した時間を表します。

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

新しいスタイルの関数セグメントには Invocation サブセグメントが含まれていません。代わりに、顧客サブセグメントが関数セグメントに直接アタッチされます。古いスタイルの関数セグメントと新しいスタイルの関数セグメントの構造の詳細については、「」を参照してくださいX-Ray トレースを理解する

ハンドラーコードを実装して、メタデータを記録し、ダウンストリームコールをトレースできます。ハンドラーが他のリソースやサービスに対して行うコールの詳細を記録するには、X-Ray SDK for Ruby を使用します。SDK を取得するには、アプリケーションの依存関係に aws-xray-sdk パッケージを追加します。

blank-ruby/function/Gemfile
# Gemfile source 'https://rubygems.org' gem 'aws-xray-sdk', '0.11.4' gem 'aws-sdk-lambda', '1.39.0' gem 'test-unit', '3.3.5'

AWS SDK クライアントを実装するには、初期化コードでクライアントを作成した後、aws-xray-sdk/lambda モジュールが必要です。

blank-ruby/function/lambda_function.rb - AWS SDK クライアントのトレース
# lambda_function.rb require 'logger' require 'json' require 'aws-sdk-lambda' $client = Aws::Lambda::Client.new() $client.get_account_settings() require 'aws-xray-sdk/lambda' def lambda_handler(event:, context:) logger = Logger.new($stdout) ...

X-Ray では、トレースは 1 つ以上のサービスによって処理されるリクエストに関する情報を記録します。Lambda はトレースごとに 2 つのセグメントを記録します。これにより、サービスグラフに 2 つのノードが作成されます。次の図は、これら 2 つのノードを強調表示しています。

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

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

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

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

注記

AWS は現在、Lambda サービスに変更を実装しています。これらの変更により、AWS アカウント のさまざまな Lambda 関数によって出力されるシステムログメッセージとトレースセグメントの構造と内容にわずかな違いが生じる場合があります。

ここで示すトレースの例は、古いスタイルの関数セグメントを示しています。古いスタイルのセグメントと新しいスタイルのセグメントの違いについては、次の段落で説明します。

これらの変更は今後数週間に実装され、中国および GovCloud リージョンを除くすべての AWS リージョンのすべての関数は、新しい形式のログメッセージとトレースセグメントを使用するように移行されます。

古いスタイルの関数セグメントには、次のサブセグメントが含まれます。

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

  • [呼び出し] - ハンドラーコードの実行に要した時間を表します。

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

新しいスタイルの関数セグメントには Invocation サブセグメントが含まれていません。代わりに、顧客サブセグメントが関数セグメントに直接アタッチされます。古いスタイルの関数セグメントと新しいスタイルの関数セグメントの構造の詳細については、「」を参照してくださいX-Ray トレースを理解する

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

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 Serverless Application Model (AWS SAM) AWS::Serverless::Function リソースに、Tracing プロパティを使用します。

template.yml - トレース設定
Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...

ランタイム依存関係をレイヤーに保存する

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

以下の例は、X-Ray SDK for Ruby を保存する 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-ruby-lib Description: Dependencies for the blank-ruby sample app. ContentUri: lib/. CompatibleRuntimes: - ruby2.5

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

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