

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS X-Ray サンプルアプリケーション
<a name="xray-scorekeep"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

GitHub で利用可能な AWS X-Ray [eb-java-scorekeep](https://github.com/awslabs/eb-java-scorekeep/tree/xray) サンプルアプリケーションは、 AWS X-Ray SDK を使用して受信 HTTP コール、DynamoDB SDK クライアント、および HTTP クライアントを計測する方法を示しています。サンプルアプリケーションは を使用して DynamoDB テーブル CloudFormation を作成し、インスタンスで Java コードをコンパイルし、追加の設定なしで X-Ray デーモンを実行します。

[Scorekeep チュートリアル](scorekeep-tutorial.md)を参照して、 AWS マネジメントコンソール または を使用して、計測されたサンプルアプリケーションのインストールと使用を開始します AWS CLI。

![\[Scorekeep は AWS X-Ray SDK を使用して、受信 HTTP コール、DynamoDB SDK クライアント、HTTP クライアントを計測します。\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-flow.png)


サンプルには、フロントエンドのウェブアプリ、それが呼び出す API、データの保存に使用する DynamoDB テーブルが含まれています。[フィルター](xray-sdk-java-filters.md)、[プラグイン](xray-sdk-java-configuration.md)、および計測[された AWS SDK クライアントを使用した基本的な計測](xray-sdk-java-awssdkclients.md)は、プロジェクトの`xray-gettingstarted`ブランチに表示されます。これは、[入門ガイドチュートリアル](scorekeep-tutorial.md)でデプロイするブランチです。このブランチには基本情報しか含まれていないので、`master` ブランチと比較すると、基本をすばやく理解できます。

![\[Service map showing client interaction with Scorekeep container and related AWS のサービス.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-servicemap-before-ECS.png)


同じアプリケーションで、次のファイルの基本計測も説明します。
+ **HTTP リクエストフィルタ**–[https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java)
+ **AWS SDK クライアントの計測** – [https://github.com/awslabs/eb-java-scorekeep/tree/xray/build.gradle](https://github.com/awslabs/eb-java-scorekeep/tree/xray/build.gradle)

アプリケーションの `xray` ブランチには、[HTTPClient](xray-sdk-java-httpclients.md)､[注釈](xray-sdk-java-segment.md)､[SQL クエリ](xray-sdk-java-sqlclients.md)、[カスタムサブセグメント](xray-sdk-java-subsegments.md)､実装された [AWS Lambda](xray-services-lambda.md) 関数､および[実装された初期化コードとスクリプト](scorekeep-startup.md)の使用が含まれています｡

ユーザーログインとブラウザでの AWS SDK for JavaScript の使用をサポートするために、`xray-cognito`ブランチはユーザーの認証と認可をサポートする Amazon Cognito を追加します。また、 Amazon Cognitoから認証情報を取得すると、ウェブアプリケーションはトレースデータをX-Rayに送信してクライアントの観点からリクエスト情報を記録します。ブラウザクライアントは、トレースマップ上に独自のノードとして表示され、ユーザーが表示しているページの URL やユーザーの ID などの追加情報を記録します。

最後に、 `xray-worker`ブランチは、個別に実行され、Amazon SQS キューの項目を処理する、実装された Python Lambda 関数を追加します。Scorekeep は、ゲームが終了するたびに項目をキューに追加します。CloudWatch Events によりトリガーされるLambda ワーカーは、数分ごとにキューから項目を取得し、それらの項目を処理して分析のためにゲームレコードをAmazon S3 に保存します。

**Topics**
+ [Scorekeep サンプルアプリケーションの開始方法](scorekeep-tutorial.md)
+ [AWS SDK クライアントの手動計測](scorekeep-sdkclients.md)
+ [追加のサブセグメントを作成する](scorekeep-subsegments.md)
+ [注釈、メタデータ、およびユーザー ID を記録する](scorekeep-annotations.md)
+ [送信 HTTP 呼び出しの計測](scorekeep-httpclient.md)
+ [PostgreSQL データベースに対する呼び出しの計測](scorekeep-postgresql.md)
+ [AWS Lambda 関数の計測](scorekeep-lambda.md)
+ [スタートアップコードの作成](scorekeep-startup.md)
+ [実装スクリプト](scorekeep-scripts.md)
+ [ウェブアプリケーションクライアントの実装](scorekeep-client.md)
+ [実装されたクライアントをワーカースレッドで使用する](scorekeep-workerthreads.md)

# Scorekeep サンプルアプリケーションの開始方法
<a name="scorekeep-tutorial"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

このチュートリアルでは、[Scorekeep サンプルアプリケーションの](xray-scorekeep.md) `xray-gettingstarted` ブランチを使用します。このブランチは、 CloudFormation を使用して、Amazon ECS でサンプルアプリケーションと X-Ray デーモンを実行するリソースを作成および設定します。アプリケーションは Spring フレームワークを使用して JSON ウェブ API を実装し、 AWS SDK for Java を使用してデータを Amazon DynamoDB に保持します。アプリケーションのサーブレットフィルターは、アプリケーションによって処理されるすべての受信リクエストを計測し、 AWS SDK クライアントのリクエストハンドラーは DynamoDB へのダウンストリーム呼び出しを計測します。

このチュートリアルは、 AWS マネジメントコンソール または を使用して実行できます AWS CLI。

**Topics**
+ [前提条件](#xray-gettingstarted-prereqs)
+ [CloudFormation を使用した Scorekeep アプリケーションのインストール](#xray-gettingstarted-deploy)
+ [トレースデータの生成](#xray-gettingstarted-generate-traces)
+ [でトレースマップを表示する AWS マネジメントコンソール](#xray-gettingstarted-console)
+ [Amazon SNS 通知の設定](#xray-gettingstarted-notifications)
+ [サンプルアプリケーションの詳細](#xray-gettingstarted-sample)
+ [オプション: 最小特権ポリシー](#xray-gettingstarted-security)
+ [クリーンアップ](#xray-gettingstarted-cleanup)
+ [次の手順](#xray-gettingstarted-nextsteps)

## 前提条件
<a name="xray-gettingstarted-prereqs"></a>

このチュートリアルでは CloudFormation 、 を使用して、サンプルアプリケーションと X-Ray デーモンを実行するリソースを作成および設定します。チュートリアルでインストールと実行をする前提条件として以下が必要です。

1. アクセス許可が限定された IAM ユーザーを使用する場合は、[IAM コンソール](https://console.aws.amazon.com/iam)に次のユーザーポリシーを追加してください。
   + `AWSCloudFormationFullAccess` – CloudFormation にアクセスして使用
   + `AmazonS3FullAccess` – を使用してテンプレートファイルを CloudFormation にアップロードするには AWS マネジメントコンソール
   + `IAMFullAccess` – Amazon ECS インスタンスロールと Amazon EC2 インスタンスロールを作成
   + `AmazonEC2FullAccess` – Amazon EC2 リソースを作成
   + `AmazonDynamoDBFullAccess` – DynamoDB テーブルを作成
   + `AmazonECS_FullAccess` – Amazon ECS リソースを作成
   + `AmazonSNSFullAccess` – Amazon SNS トピックを作成
   + `AWSXrayReadOnlyAccess` - X-Ray コンソールでトレースマップとトレースを表示するアクセス許可

1. を使用してチュートリアルを実行するには AWS CLI、[CLI バージョン 2.7.9 以降をインストール](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)し、前のステップの ユーザーを使用して [CLI を設定します](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)。ユーザー AWS CLI で を設定するときは、リージョンが設定されていることを確認してください。リージョンが設定されていない場合は、すべての CLI コマンドに `--region AWS-REGION` を追加する必要があります。

1. サンプルアプリケーションリポジトリを複製ために、[Git](https://github.com/git-guides/install-git) がインストールされていることを確認してください。

1. 次のコード例を使用して、Scorekeep リポジトリの `xray-gettingstarted` ブランチをクローンします。

   ```
   git clone https://github.com/aws-samples/eb-java-scorekeep.git xray-scorekeep -b xray-gettingstarted
   ```

## CloudFormation を使用した Scorekeep アプリケーションのインストール
<a name="xray-gettingstarted-deploy"></a>

------
#### [ AWS マネジメントコンソール ]

**を使用してサンプルアプリケーションをインストールする AWS マネジメントコンソール**

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. **[スタックの作成]** を選択し、ドロップダウンメニューから **[新しいリソースを使用]** を選択します。

1. **[テンプレートの指定]** セクションで、**[テンプレートファイルのアップロード]** を選択します。

1. **[ファイルの選択]** を選択し、git リポジトリをクローンしたときに作成された `xray-scorekeep/cloudformation` フォルダーに移動して、`cf-resources.yaml` ファイルを選択します。

1. **[次へ]** を選択して続行します。

1. **[スタック名]** テキストボックスに `scorekeep` と入力し、ページ下部の **[次へ]** を選択して続行します。このチュートリアルのこれ以降の部分ではスタックの名前を `scorekeep` とします。

1. **[スタックオプションの設定]** ページの一番下までスクロールし、**[次へ]** を選択して続行します。

1. **[レビュー]** ページの一番下までスクロールし、[CloudFormation によってカスタム名がついた IAM リソースが作成される場合があることを承認します] チェックボックスをオンにし、**[スタックの作成]** を選択します。

1. CloudFormation スタックが作成中になります。スタックのステータスは約 5 分間 `CREATE_COMPLETE` で、その後 `CREATE_IN_PROGRESS` に変わります。ステータスは定期的に更新されます。ページを更新して再表示することもできます。

------
#### [ AWS CLI ]

**を使用してサンプルアプリケーションをインストールする AWS CLI**

1. このチュートリアルの前の部分でクローンを作成した `xray-scorekeep` リポジトリの `cloudformation` フォルダーに移動します。

   ```
   cd xray-scorekeep/cloudformation/
   ```

1. 次の AWS CLI コマンドを入力して CloudFormation スタックを作成します。

   ```
   aws cloudformation create-stack --stack-name scorekeep --capabilities "CAPABILITY_NAMED_IAM" --template-body file://cf-resources.yaml
   ```

1. CloudFormation スタックのステータスが `CREATE_COMPLETE` になるまで約 5 分待ってください。ステータスを確認するには、次の AWS CLI コマンドを使用します。

   ```
   aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"
   ```

------

## トレースデータの生成
<a name="xray-gettingstarted-generate-traces"></a>

サンプルアプリケーションには、フロントエンドのウェブアプリケーションが含まれています。ウェブアプリケーションを使用して API へのトラフィックを生成し、トレースデータを X-Ray に送信します。まず、 AWS マネジメントコンソール または AWS CLIを使用してウェブアプリの URL を取得します。

------
#### [ AWS マネジメントコンソール ]

**を使用してアプリケーション URL を検索する AWS マネジメントコンソール**

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. リストから `scorekeep` スタックを選択します。

1. `scorekeep` スタックページの [**出力**] タブを選択し、`LoadBalancerUrl` URL リンクを選択してウェブアプリケーションを開きます。

------
#### [ AWS CLI ]

**を使用してアプリケーション URL を検索する AWS CLI**

1. 次のコマンドを使用して、ウェブアプリケーションの URL を表示します。

   ```
   aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].Outputs[0].OutputValue"
   ```

1. この URL をコピーしてブラウザで開き、Scorekeep ウェブアプリケーションを表示します。

------

**ウェブアプリケーションを使用してトレースデータを生成する**

1. [**Create**] を選択して、ユーザーとセッションを作成します。

1. **[ゲーム名]** を入力し、**[ルール]** を **[Tic Tac Toe]** に設定したら、**[作成]** を選択して、ゲームを作成します。

1. [**Play**] を選択してゲームを開始します。

1. ゲームの状態を移行および変更するには、タイルを選択します。

これらの各ステップで、API への HTTP リクエスト、および DynamoDB へのダウンストリーム呼び出しが生成され、ユーザー、セッション、ゲーム、移動、および状態データが読み書きされます。

## でトレースマップを表示する AWS マネジメントコンソール
<a name="xray-gettingstarted-console"></a>

X-Ray コンソールと CloudWatch コンソールで、サンプルアプリケーションによって生成されたトレースマップとトレースを確認できます。

------
#### [ X-Ray console ]

**X-Ray コンソールを使用する**

1. [X-Ray コンソール](https://console.aws.amazon.com/xray/home#/service-map)のトレースマップページを開きます。

1. コンソールには、X-Ray によってアプリケーションから送信されたトレースデータから生成されたサービスグラフの表現が表示されます。ウェブアプリケーションを最初に起動した時点からのすべてのトレースが表示されるように、必要に応じてトレースマップの期間を調整してください。  
![\[X-Ray トレースマップの期間\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/xray-console-time-period-15-minutes.png)

トレースマップに表示されるのは、ウェブアプリケーションクライアント、Amazon ECS で実行されている API、アプリケーションで使用される各 DynamoDB テーブルです。アプリケーションに対するすべてのリクエストは、1 秒あたりのリクエストの設定可能な最大数まで、API にヒットした際にトレースされ、ダウンストリームサービスへのリクエストを生成して、完了します。

サービスグラフの任意のノードを選択すると、そのノードに対してトラフィックを生成したリクエストのトレースを表示できます。現在、Amazon SNS ノードは黄色になっています。理由を調べるために掘り下げます。

![\[X-Ray コンソールのトレースマップページ\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-servicemap-before-ECS.png)


**エラーの原因を見つけるには**

1. [**SNS**] という名前のノードを選択します。ノードの詳細パネルが表示されます。

1. [**トレースの表示**] を選択して、[**トレースの概要**] 画面にアクセスします。

1. [**Trace のリスト**] からトレースを選択します。受信リクエストに応答するのではなく起動時に記録されているため、トレースには、メソッドまたは URL はありません。  
![\[トレースリストからトレースを選択する\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-tracelist-sns.png)

1. ページ下部の Amazon SNS セグメント内のエラーステータスアイコンを選択し、SNS サブセグメントの **[例外]** ページを開きます。  
![\[エラー状態のアイコンを選択して、Amazon SNS サブセグメントの [例外] ページを開きます。\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-timeline-sns-ecs.png)

1. X-Ray SDK は、計測された AWS SDK クライアントによってスローされた例外を自動的にキャプチャし、スタックトレースを記録します。  
![\[キャプチャされた例外と記録されたスタックトレースを示す [例外] タブ\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-exception.png)

------
#### [ CloudWatch console ]

**CloudWatch コンソールを使用する**

1. CloudWatch コンソールの [X-Ray トレースマップ](https://console.aws.amazon.com/cloudwatch/home#xray:service-map/map)ページを開きます。

1. コンソールには、X-Ray によってアプリケーションから送信されたトレースデータから生成されたサービスグラフの表現が表示されます。ウェブアプリケーションを最初に起動した時点からのすべてのトレースが表示されるように、必要に応じてトレースマップの期間を調整してください。  
![\[CloudWatch トレースマップの期間\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/cw-console-service-map-time-period-15-minutes.png)

トレースマップに表示されるのは、ウェブアプリケーションクライアント、Amazon EC2 で実行されている API、アプリケーションで使用される各 DynamoDB テーブルです。アプリケーションに対するすべてのリクエストは、1 秒あたりのリクエストの設定可能な最大数まで、API にヒットした際にトレースされ、ダウンストリームサービスへのリクエストを生成して、完了します。

サービスグラフの任意のノードを選択すると、そのノードに対してトラフィックを生成したリクエストのトレースを表示できます。現在、Amazon SNS ノードはオレンジ色になっています。理由を調べるために掘り下げます。

![\[X-Ray コンソールのトレースマップページ\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-cw-servicemap-before-ECS.png)


**エラーの原因を見つけるには**

1. [**SNS**] という名前のノードを選択します。SNS ノードの詳細パネルがマップの下に表示されます。

1. **[トレースを表示]** を選択して **[トレース]** ページにアクセスします。

1. ページの下部で、**[トレース]** リストからトレースを選択します。受信リクエストに応答するのではなく起動時に記録されているため、トレースには、メソッドまたは URL はありません。  
![\[トレースリストからトレースを選択する\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-cw-tracelist-sns-ecs.png)

1. セグメントタイムラインの下部にある Amazon SNS サブセグメントを選択し、SNS サブセグメントの **[例外]** タブを選択すると、例外の詳細が表示されます。  
![\[Amazon SNS サブセグメントの [例外] タブを表示\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-gettingstarted-cw-timeline-sns-ecs.png)

------

この原因は、`WebConfig` クラスで行われた `createSubscription` の呼び出しで指定された E メールアドレスが無効であることを意味します。次のセクションで、これを修正します。

## Amazon SNS 通知の設定
<a name="xray-gettingstarted-notifications"></a>

Scorekeep では、ユーザーがゲームを達成すると、Amazon SNS で通知が送信されます。アプリケーション起動時、CloudFormation のスタックパラメータで定義された E メールアドレスのサブスクリプションが作成されます。現在その呼び出しに失敗しています。通知を有効にするように通知 E メールを設定し、トレースマップで強調表示されている障害を解決します。

------
#### [ AWS マネジメントコンソール ]

**を使用して Amazon SNS 通知を設定するには AWS マネジメントコンソール**

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. リストの `scorekeep` スタック名の横にあるラジオボタンを選択して、**[更新]** を選択します。

1. **[現在のテンプレートの使用]** が選択されていることを確認し、**[スタックの更新]** ページで **[次へ]** をクリックします。

1. リストから **[E メール]** パラメータを探し、デフォルト値を有効な E メールアドレスに置き換えます。  
![\[E メール設定を更新する\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-cf-email-update.png)

1. ページの下部にスクロールし、[**次へ**] を選択します。

1. **[レビュー]** ページの一番下までスクロールし、[CloudFormation によってカスタム名がついた IAM リソースが作成される場合があることを承認します] チェックボックスをオンにし、**[スタックの更新]** を選択します。

1. CloudFormation スタックが更新中になります。スタックのステータスは約 5 分間 `UPDATE_COMPLETE` で、その後 `UPDATE_IN_PROGRESS` に変わります。ステータスは定期的に更新されます。ページを更新して再表示することもできます。

------
#### [ AWS CLI ]

**を使用して Amazon SNS 通知を設定するには AWS CLI**

1. 以前に作成した `xray-scorekeep/cloudformation/` フォルダーに移動し、`cf-resources.yaml` ファイルをテキストエディタで開きます。

1. **[E メール]** パラメータ内の `Default` 値を検索し、*UPDATE\$1ME* から有効な E メールアドレスに変更します。

   ```
   Parameters:
     Email:
       Type: String
       Default: UPDATE_ME # <- change to a valid abc@def.xyz email address
   ```

1. `cloudformation` フォルダから、次の AWS CLI コマンドを使用して CloudFormation スタックを更新します。

   ```
   aws cloudformation update-stack --stack-name scorekeep --capabilities "CAPABILITY_NAMED_IAM" --template-body file://cf-resources.yaml
   ```

1. CloudFormation スタックのステータスが `UPDATE_COMPLETE` になるまで数分待ってください。ステータスを確認するには、次の AWS CLI コマンドを使用します。

   ```
   aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"
   ```

------

更新が完了すると、Scorekeep が再起動し、SNS トピックへのサブスクリプションが作成されます。E メールとサブスクリプションを確認して、ゲーム達成時にアップデートの有無を確認します。トレースマップを開いて、SNS への呼び出しが失敗しなくなったことを確認します。

## サンプルアプリケーションの詳細
<a name="xray-gettingstarted-sample"></a>

サンプルアプリケーションは、X-Ray SDK for Java を使用するように設定された Java の HTTP ウェブ API です。CloudFormation テンプレートを使用してアプリケーションをデプロイすると、ECS で Scorekeep を実行するために必要な DynamoDB テーブル、Amazon ECS クラスター、およびその他のサービスが作成されます。ECS のタスク定義ファイルは、CloudFormation によって作成されます。このファイルは ECS クラスター内のタスクごとに使用されるコンテナイメージを定義します。これらのイメージは、公式の X-Ray パブリック ECR から取得されます。Scorekeep API コンテナイメージには Gradle でコンパイルされた API が含まれています。Scorekeep フロントエンドコンテナのコンテナイメージは、nginx プロキシサーバーを使用するフロントエンドに対応します。このサーバーは /api で始まるパスにリクエストをルーティングして API に送信します。

受信 HTTP リクエストを測定するには、アプリケーションで SDK によって提供された `TracingFilter` を追加します。

**Example src/main/java/scorekeep/WebConfig.java - サーブレットフィルタ**  

```
import javax.servlet.Filter;
import [com.amazonaws.xray.javax.servlet.AWSXRayServletFilter](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/javax/servlet/AWSXRayServletFilter.html);
...

@Configuration
public class WebConfig {

  @Bean
  public Filter TracingFilter() {
    return new AWSXRayServletFilter("Scorekeep");
  }
...
```

このフィルタは、アプリケーションが処理するすべての受信リクエストに関するトレースデータを送信します。リクエスト URL、メソッド、レスポンスステータス、開始時間、終了時間が含まれます。

また、アプリケーションは AWS SDK for Javaを使用して DynamoDB に対するダウンストリーム呼び出しを行います。これらの呼び出しを計測するために、アプリケーションは単に AWS SDK 関連のサブモジュールを依存関係として受け取り、X-Ray SDK for Java はすべての AWS SDK クライアントを自動的に計測します。

アプリケーションは `Docker` を使用して、インスタンス上で `Gradle Docker Image` と `Scorekeep API Dockerfile` ファイルを使用するソースコードを構築し、Gradle の `ENTRYPOINT` で生成する実行可能 JAR を実行します。

**Example Docker を使用して Gradle Docker イメージ経由で構築する**  

```
docker run --rm -v /PATH/TO/SCOREKEEP_REPO/home/gradle/project -w /home/gradle/project gradle:4.3 gradle build
```

**Example Dockerファイル ENTRYPOINT**  

```
ENTRYPOINT [ "sh", "-c", "java -Dserver.port=5000 -jar scorekeep-api-1.0.0.jar" ]
```

SDK サブモジュールを依存関係として宣言することで、コンパイル中に `build.gradle` ファイルによって SDK サブモジュールが Maven からダウンロードされます。

**Example build.gradle -- 依存関係**  

```
...
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')
    compile('com.amazonaws:aws-java-sdk-dynamodb')
    compile("com.amazonaws:aws-xray-recorder-sdk-core")
    compile("com.amazonaws:aws-xray-recorder-sdk-aws-sdk")
    compile("com.amazonaws:aws-xray-recorder-sdk-aws-sdk-instrumentor")
    ...
}
dependencyManagement {
    imports {
        mavenBom("com.amazonaws:aws-java-sdk-bom:1.11.67")
        mavenBom("com.amazonaws:aws-xray-recorder-sdk-bom:2.11.0")
    }
}
```

コア、 AWS SDK、および AWS SDK Instrumentor サブモジュールは、 AWS SDK で行われたダウンストリーム呼び出しを自動的に計測するために必要なすべてです。

未加工のセグメントデータを X-Ray API に中継するには、X-Ray デーモンが UDP ポート 2000 でトラフィックを受信する必要があります。そのため、アプリケーションでは、ECS で Scorekeep アプリケーションとともに*サイドカーコンテナ*としてデプロイされるコンテナでX-Ray デーモンを実行します。詳細については、[X-Ray デーモン](xray-daemon.md)のトピックを参照してください。

**Example ECS タスク定義内の X-Ray デーモンコンテナ定義**  

```
...
Resources:
  ScorekeepTaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties: 
      ContainerDefinitions: 
      ...
      
      - Cpu: '256'
        Essential: true
        Image: amazon/aws-xray-daemon
        MemoryReservation: '128'
        Name: xray-daemon
        PortMappings: 
          - ContainerPort: '2000'
            HostPort: '2000'
            Protocol: udp
      ...
```

X-Ray SDK for Java は、`AWSXRay` という名前のクラスを提供します。これはコードを計測するために使用する `TracingHandler` というグローバルレコーダーを提供します。グローバルレコーダーを設定して、受信 HTTP 呼び出しのセグメントを作成する `AWSXRayServletFilter` をカスタマイズできます。サンプルには、プラグインとサンプリングルールでグローバルレコーダーを設定する `WebConfig` クラスの静的ブロックが含まれています。

**Example src/main/java/scorekeep/WebConfig.java - レコーダー**  

```
import com.amazonaws.xray.AWSXRay;
import com.amazonaws.xray.AWSXRayRecorderBuilder;
import com.amazonaws.xray.javax.servlet.AWSXRayServletFilter;
import com.amazonaws.xray.plugins.ECSPlugin;
import com.amazonaws.xray.plugins.EC2Plugin;
import com.amazonaws.xray.strategy.sampling.LocalizedSamplingStrategy;
...

@Configuration
public class WebConfig {
  ...
  
  static {
    AWSXRayRecorderBuilder builder = AWSXRayRecorderBuilder.standard().withPlugin(new ECSPlugin()).withPlugin(new EC2Plugin());

    URL ruleFile = WebConfig.class.getResource("/sampling-rules.json");
    builder.withSamplingStrategy(new LocalizedSamplingStrategy(ruleFile));

    AWSXRay.setGlobalRecorder(builder.build());
    ...
    
  }
}
```

この例では、ビルダーを使用して `sampling-rules.json` という名前のファイルからサンプリングルールをロードします。サンプリングルールは、SDK が受信リクエストのセグメントを記録するレートを決定します。

**Example src/main/java/resources/sampling-rules.json**  

```
{
  "version": 1,
  "rules": [
    {
      "description": "Resource creation.",
      "service_name": "*",
      "http_method": "POST",
      "url_path": "/api/*",
      "fixed_target": 1,
      "rate": 1.0
    },
    {
      "description": "Session polling.",
      "service_name": "*",
      "http_method": "GET",
      "url_path": "/api/session/*",
      "fixed_target": 0,
      "rate": 0.05
    },
    {
      "description": "Game polling.",
      "service_name": "*",
      "http_method": "GET",
      "url_path": "/api/game/*/*",
      "fixed_target": 0,
      "rate": 0.05
    },
    {
      "description": "State polling.",
      "service_name": "*",
      "http_method": "GET",
      "url_path": "/api/state/*/*/*",
      "fixed_target": 0,
      "rate": 0.05
    }
  ],
  "default": {
    "fixed_target": 1,
    "rate": 0.1
  }
}
```

サンプリングルールファイルでは、4 つのカスタムサンプリングルールおよびデフォルトルールが定義されます。各受信リクエスト用に、SDK は定義された順にカスタムルールを適用します。SDK は、リクエストのメソッド、パス、サービス名に一致する最初のルールを適用します。Scorekeep の場合、最初のルールは、1 秒あたり 1 リクエストの固定ターゲット、および固定ターゲットが満たされた後の 1.0 または 100% のリクエストのレートを適用して、すべての POST リクエスト (リソース作成呼び出し) をキャッチします。

他の 3 つのカスタムルールでは、固定ターゲットなしで、セッション、ゲーム、および状態の読み取り (GET リクエスト) に 5% のレートを適用します。これにより、フロントエンドが、コンテンツが最新であることを確認するために数秒ごとに自動的に行う周期的呼び出しのトレース数を最小限に抑えることができます。他のすべてのリクエストの場合は、ファイルは、1 秒あたり 1 リクエストのデフォルトレートおよび 10% のレートを定義します。

また、サンプルアプリケーションでは、手動 SDK クライアント計測、追加サブセグメントの作成、HTTP 呼び出しの出力など、高度な機能の使用方法も説明します。詳細については、「[AWS X-Ray サンプルアプリケーション](xray-scorekeep.md)」を参照してください。

## オプション: 最小特権ポリシー
<a name="xray-gettingstarted-security"></a>

 Scorekeep ECS コンテナは、`AmazonSNSFullAccess` や `AmazonDynamoDBFullAccess` などのフルアクセスポリシーを使用してリソースにアクセスします。フルアクセスポリシーの使用は、本稼働アプリケーションではベストプラクティスではありません。次の例では、DynamoDB IAM ポリシーを更新してアプリケーションのセキュリティを向上させます。IAM ポリシーのセキュリティのベストプラクティスの詳細については、[AWS 「X-Ray の Identity and Access Management](security-iam.md)」を参照してください。

**Example cf-resources.yaml テンプレート ECSTaskRole 定義**  

```
ECSTaskRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"		 	 	 
        Statement: 
          - 
            Effect: "Allow"
            Principal: 
              Service: 
                - "ecs-tasks.amazonaws.com"
            Action: 
              - "sts:AssumeRole"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess"
        - "arn:aws:iam::aws:policy/AmazonSNSFullAccess"
        - "arn:aws:iam::aws:policy/AWSXrayFullAccess"
      RoleName: "scorekeepRole"
```

ポリシーを更新するには、最初に DynamoDB リソースの ARN を特定します。次に、カスタム IAM ポリシーで ARN を使用します。最後に、そのポリシーをインスタンスプロファイルに適用します。

**DynamoDB リソースの ARN を識別するには :**

1. [DynamoDB コンソール](https://console.aws.amazon.com/dynamodbv2)を開きます。

1. 左側のナビゲーションバーから [**テーブル**] を選択します。

1. `scorekeep-*` のいずれかを選択すると、テーブルの詳細ページが表示されます。

1. **[概要]** タブで **[追加情報]** を選択してセクションを展開し、Amazon リソースネーム (ARN) を表示します。この値をコピーします。

1. `AWS_REGION` および `AWS_ACCOUNT_ID` の値を特定のリージョンとアカウント ID に置き換えて、ARN を次の IAM ポリシーに挿入します。この新しいポリシーは、すべてのアクションを許可する `AmazonDynamoDBFullAccess` ポリシーではなく、指定されたアクションのみ許可します。  
**Example**  

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "ScorekeepDynamoDB",
               "Effect": "Allow",
               "Action": [
                   "dynamodb:PutItem",
                   "dynamodb:UpdateItem",
                   "dynamodb:DeleteItem",
                   "dynamodb:GetItem",
                   "dynamodb:Scan",
                   "dynamodb:Query"
               ],
               "Resource": "arn:aws:dynamodb:us-east-1:111122223333:table/scorekeep-*"
           }
       ]
   }
   ```

------

   アプリケーションが作成するテーブルは、一貫した命名規則に従います。`scorekeep-*` 形式を使用して、すべての Scorekeep テーブルを指定できます。

**IAM ポリシーを変更する**

1. IAM コンソールから [Scorekeep タスクロール (scorekeepRole)](https://console.aws.amazon.com/iamv2/home#/roles/details/scorekeepRole) を開きます。

1. `AmazonDynamoDBFullAccess` ポリシーの横にあるチェックボックスを選択して **[削除]** を選択し、このポリシーを削除します。

1. [**アクセス許可の追加**]、[**ポリシーのアタッチ**]、[**ポリシーの作成**] の順に選択します。

1. [**JSON**] タブを選択し、上で作成したポリシーを貼り付けます。

1. ページ下部の **[次へ: タグ]** を選択します。

1. ページ下部の **[次へ: 確認]** を選択します。

1. **[名前]** に、ポリシーの名前を割り当てます。

1. ページの下部の **[ポリシーの作成]** を選択します。

1. 新しく作成したポリシーを `scorekeepRole` ロールにアタッチします。アタッチしたポリシーが適用されるまで数分かかることがあります。

新しいポリシーを `scorekeepRole` ロールにアタッチした場合は、CloudFormation スタックを削除する前にデタッチする必要があります。このアタッチしたポリシーによってスタックの削除がブロックされるためです。ポリシーを削除すると、ポリシーを自動的にデタッチできます。

**カスタム IAM ポリシーを削除する**

1. [[IAM コンソール]](https://console.aws.amazon.com/iam) を開きます。

1. 左側のナビゲーションバーから [**ポリシー**] を選択します。

1. このセクションで先ほど作成したカスタムポリシー名を検索し、ポリシー名の横にあるラジオボタンを選択して強調表示します。

1. **[アクション]** ドロップダウンを選択してから、**[削除]** を選択します。

1. カスタムポリシーの名前を入力して [**削除**] を選択し、削除を確定します。これにより、ポリシーが `scorekeepRole` ロールから自動的にデタッチされます。

## クリーンアップ
<a name="xray-gettingstarted-cleanup"></a>

Scorekeep アプリケーションのリソースを削除するには、次の手順を従います。

**注記**  
このチュートリアルの前のセクションでカスタムポリシーを作成してアタッチした場合は、CloudFormation スタックを削除する前に、`scorekeepRole` からポリシーを削除する必要があります。

------
#### [ AWS マネジメントコンソール ]

**を使用してサンプルアプリケーションを削除する AWS マネジメントコンソール**

1. [CloudFormation コンソール](https://console.aws.amazon.com/cloudformation/)を開きます。

1. リストの `scorekeep` スタック名の横にあるラジオボタンを選択して、**[削除]** を選択します。

1. CloudFormation スタックが削除中になります。スタックのステータスは、すべてのリソースが削除されるまで数分間 `DELETE_IN_PROGRESS` になります。ステータスは定期的に更新されます。ページを更新して再表示することもできます。

------
#### [ AWS CLI ]

**を使用してサンプルアプリケーションを削除する AWS CLI**

1. 次の AWS CLI コマンドを入力して CloudFormation スタックを削除します。

   ```
   aws cloudformation delete-stack --stack-name scorekeep
   ```

1. CloudFormation スタックが存在しなくなるまで約 5 分待ってください。ステータスを確認するには、次の AWS CLI コマンドを使用します。

   ```
   aws cloudformation describe-stacks --stack-name scorekeep --query "Stacks[0].StackStatus"
   ```

------

## 次の手順
<a name="xray-gettingstarted-nextsteps"></a>

次の章「[AWS X-Ray の概念](xray-concepts.md)」で X-Ray の詳細をご覧ください。。

独自のアプリケーションを測定するには、X-Ray SDK for Javaまたは他の X-Ray SDK のいずれかの詳細をご覧ください。
+ **X-Ray SDK for Java** – [AWS X-Ray SDK for Java](xray-sdk-java.md)
+ **X-Ray SDK for Node.js** – [AWS Node.js 用 X-Ray SDK](xray-sdk-nodejs.md)
+ **X-Ray SDK for .NET** – [AWS X-Ray SDK for .NET](xray-sdk-dotnet.md)

X-Ray デーモンをローカルまたは で実行するには AWS、「」を参照してください[AWS X-Ray デーモン](xray-daemon.md)。

サンプルアプリケーションを GitHub に投稿するには、[eb-java-scorekeep](https://github.com/awslabs/eb-java-scorekeep/tree/xray-gettingstarted)を参照してください。

# AWS SDK クライアントの手動計測
<a name="scorekeep-sdkclients"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

X-Ray SDK for Java は、ビルドの依存関係に AWS SDK Instrumentor サブモジュールを含めると、すべての SDK クライアントを自動的に計測します。 [AWS](xray-sdk-java.md#xray-sdk-java-dependencies)

クライアントの自動実装は、Instrumentor サブモジュールを削除することで無効にできます。これにより、他を無視しながら一部のクライアントを手動で実装するか、異なるクライアントで異なるトレースハンドラーを使用できるようになります。

特定の AWS SDK クライアントの計測のサポートを説明するために、アプリケーションはユーザー、ゲーム、セッションモデルのリクエストハンドラー`AmazonDynamoDBClientBuilder`として にトレースハンドラーを渡します。このコード変更により、これらのクライアントを使用する DynamoDB に対するすべての呼び出しを実装するように SDK に指示します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/SessionModel.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/SessionModel.java) – AWS SDK クライアントの手動計測**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
import [com.amazonaws.xray.handlers.TracingHandler](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/handlers/TracingHandler.html);

public class SessionModel {
  private AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
        .withRegion(Constants.REGION)
        .withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))
        .build();
  private DynamoDBMapper mapper = new DynamoDBMapper(client);
```

プロジェクトの依存関係から AWS SDK Instrumentor サブモジュールを削除すると、手動で計測された AWS SDK クライアントのみがトレースマップに表示されます。

# 追加のサブセグメントを作成する
<a name="scorekeep-subsegments"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

ユーザーモデルクラスでは、アプリケーションがサブセグメントを手動で作成して、`saveUser` 関数内で行われるすべてのダウンストリーム呼び出しをグループ化し、メタデータを追加します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/UserModel.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/UserModel.java) - カスタムサブセグメント**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
import [com.amazonaws.xray.entities.Subsegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Subsegment.html);
...
    public void saveUser(User user) {
    // Wrap in subsegment
    Subsegment subsegment = AWSXRay.beginSubsegment("## UserModel.saveUser");
    try {
      mapper.save(user);
    } catch (Exception e) {
      subsegment.addException(e);
      throw e;
    } finally {
      AWSXRay.endSubsegment();
    }
  }
```

# 注釈、メタデータ、およびユーザー ID を記録する
<a name="scorekeep-annotations"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

ゲームモデルクラスでは、アプリケーションはDynamoDB にゲームを保存するたびに[メタデータ](xray-sdk-java-segment.md#xray-sdk-java-segment-metadata) ブロックに `Game` オブジェクトを記録します。アプリケーションは個別にゲーム ID を、[ フィルタ式](xray-sdk-java-segment.md#xray-sdk-java-segment-annotations) で使用できるように、[注釈](xray-console-filters.md) に記録します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/GameModel.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/GameModel.java)–注釈とメタデータ**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
import [com.amazonaws.xray.entities.Segment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Segment.html);
import [com.amazonaws.xray.entities.Subsegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Subsegment.html);
...
  public void saveGame(Game game) throws SessionNotFoundException {
    // wrap in subsegment
    Subsegment subsegment = AWSXRay.beginSubsegment("## GameModel.saveGame");
    try {
      // check session
      String sessionId = game.getSession();
      if (sessionModel.loadSession(sessionId) == null ) {
        throw new SessionNotFoundException(sessionId);
      }
      Segment segment = AWSXRay.getCurrentSegment();
      subsegment.putMetadata("resources", "game", game);
      segment.putAnnotation("gameid", game.getId());
      mapper.save(game);
    } catch (Exception e) {
      subsegment.addException(e);
      throw e;
    } finally {
      AWSXRay.endSubsegment();
    }
  }
```

移動コントローラーでは、アプリケーションは[ユーザー ID](xray-sdk-java-segment.md#xray-sdk-java-segment-userid) を `setUser` を使用して記録します。ユーザー ID はセグメントの個別のフィールドに記録され、検索用にインデックスが作成されます。

**Example [src/main/java/scorekeep/MoveController.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/MoveController.java) – ユーザー ID**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
...
  @RequestMapping(value="/{userId}", method=RequestMethod.POST)
  public Move newMove(@PathVariable String sessionId, @PathVariable String gameId, @PathVariable String userId, @RequestBody String move) throws SessionNotFoundException, GameNotFoundException, StateNotFoundException, RulesException {
    AWSXRay.getCurrentSegment().setUser(userId);
    return moveFactory.newMove(sessionId, gameId, userId, move);
  }
```

# 送信 HTTP 呼び出しの計測
<a name="scorekeep-httpclient"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

ユーザーファクトリクラスは、アプリケーションがX-Ray SDK for Javaの `HTTPClientBuilder` バージョンを使用して送信 HTTP 呼び出しを計測する方法を示します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/UserFactory.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/UserFactory.java)–HTTP クライアント計測**  

```
import [com.amazonaws.xray.proxies.apache.http.HttpClientBuilder](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/proxies/apache/http/HttpClientBuilder.html);

  public String randomName() throws IOException {
    CloseableHttpClient httpclient = HttpClientBuilder.create().build();
    HttpGet httpGet = new HttpGet("http://uinames.com/api/");
    CloseableHttpResponse response = httpclient.execute(httpGet);
    try {
      HttpEntity entity = response.getEntity();
      InputStream inputStream = entity.getContent();
      ObjectMapper mapper = new ObjectMapper();
      Map<String, String> jsonMap = mapper.readValue(inputStream, Map.class);
      String name = jsonMap.get("name");
      EntityUtils.consume(entity);
      return name;
    } finally {
      response.close();
    }
  }
```

現在 `org.apache.http.impl.client.HttpClientBuilder` を使用している場合は、そのクラスのインポートステートメントを `com.amazonaws.xray.proxies.apache.http.HttpClientBuilder` のものと交換するだけです。

# PostgreSQL データベースに対する呼び出しの計測
<a name="scorekeep-postgresql"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

`application-pgsql.properties` ファイルは X-Ray PostgreSQL トレースインターセプターを [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java) で作成されたデータソースに追加します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/resources/application-pgsql.properties](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/resources/application-pgsql.properties) – PostgreSQL データベース実装**  

```
spring.datasource.continue-on-error=true
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create-drop
spring.datasource.jdbc-interceptors=com.amazonaws.xray.sql.postgres.TracingInterceptor
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL94Dialect
```

**注記**  
アプリケーション環境に PostgreSQL データベースを追加する方法に関する詳細については、『[https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.db.html](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.managing.db.html) 開発者ガイド*』の「AWS Elastic Beanstalk Elastic Beanstalk を使用してデータベースを設定する*」 を参照してください。

`xray` ブランチの X-Rayデモページは、実装済みデータソースを使用して、生成した SQL クエリに関する情報を示すトレースを生成するデモを含みます。実行中のアプリケーションの `/#/xray` パスに移動するか、ナビゲーションバーの **[Powered by AWS X-Ray]** を選択してデモページを表示します。

![\[AWS X-Ray integration demo page showing game session tracing and SQL query tracing options.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-demo.png)


[**Trace SQL queries**] を選択して、ゲームセッションをシミュレートし、アタッチされたデータベースに結果を保存します。次に、** AWS X-Ray でトレースを表示する** を選択して、API の`/api/history`ルートにヒットしたトレースのフィルタリングされたリストを表示します。

SQL クエリを含め、リストからトレースのいずれかを選択して、タイムラインを表示します。

![\[Timeline view of a trace showing method, response, duration, and age for a GET request.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-trace-sql.png)


# AWS Lambda 関数の計測
<a name="scorekeep-lambda"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

Scorekeep は 2 つの AWS Lambda 関数を使用します。1 つ目は、新しいユーザー用にランダムな名前を生成する `lambda` ブランチからの Node.js 関数です。ユーザーが名前を入力せずにセッションを作成すると、アプリケーションは、 AWS SDK for Javaで `random-name` という名前の関数を呼び出します。X-Ray SDK for Java は、計測された AWS SDK クライアントで行われた他の呼び出しと同様に、サブセグメント内の Lambda への呼び出しに関する情報を記録します。

**注記**  
`random-name` Lambda 関数を実装するには、Elastic Beanstalk 環境の外でその他のリソースを作成する必要があります。詳細については readme、手順については「[AWS Lambda との統合](https://github.com/awslabs/eb-java-scorekeep/tree/xray/README.md#aws-lambda-integration)」を参照してください。

2 つ目の関数 `scorekeep-worker` は、Scorekeep API と関係なく実行される Python 関数です。ゲームが終了すると、API はセッション ID とゲーム ID を SQS キューに書き込みます。ワーカー関数はキューから項目を読み取り、Scorekeep API を呼び出してAmazon S3 内のストレージのゲームセッションごとに完全なレコードを構築します。

Scorekeep には、両方の関数を作成するための CloudFormation テンプレートとスクリプトが含まれています。X-Ray SDK を関数コードとバンドルする必要があるため、テンプレートはコードなしで関数を作成します。Scorekeep をデプロイすると、`.ebextensions` フォルダに含まれている設定ファイルにより、SDK を含むソースバンドルが作成され、 AWS Command Line Interfaceによって関数コードと設定が更新されます。

**Topics**
+ [ランダム名](#scorekeep-lambda-randomname)
+ [ワーカー](#scorekeep-lambda-worker)

## ランダム名
<a name="scorekeep-lambda-randomname"></a>

Scorekeep は、ユーザーがサインインしたりユーザー名を指定したりせずにゲームセッションを開始するとランダム名関数を呼び出します。`random-name` の呼び出しが Lambda で処理されると、「[トレースヘッダー](xray-concepts.md#xray-concepts-tracingheader)」が読み出されます。これには、X-Ray SDK for Javaによって書き込まれるトレース ID とサンプリングデシジョンを含みます。

Lambda は、サンプリングされたリクエストごとに X-Ray デーモンを実行し、2 つのセグメントを書き込みます。最初のセグメントでは、関数を呼び出す Lambda の呼び出しに関する情報を記録します。このセグメントには、Scorekeep によって記録されるサブセグメントと同じ情報が含まれますが、Lambda の視点からという点で異なります。2 番目のセグメントは、関数の動作を表します。

Lambda は、関数コンテキストを通じて X-Ray SDK に関数セグメントを渡します。Lambda 関数を実装した場合、[受信リクエストのセグメントを作成](xray-sdk-nodejs-middleware.md)するために SDK は使用しません。 Lambdaにセグメントが提供され、SDK を使用することでクライアントを実装してサブセグメントを書き込みます。

![\[scorekeep で Lambda 関数を呼び出して、新しいユーザーのランダム名を取得する方法を示すトレースマップ\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-servicemap-lambda-node.png)


`random-name` 関数は、Node.js で実装されています。Node.js の SDK for JavaScript を使用して Amazon SNS で通知を送信し、X-Ray SDK for Node.js を使用して AWS SDK クライアントを計測します。注釈を書き込むため、関数は `AWSXRay.captureFunc` を使用してカスタムサブセグメントを作成し、実装された関数に注釈を書き込みます。 Lambdaでは、関数セグメントに直接注釈を書き込むことはできません。作成したサブセグメントにのみ書き込むことができます。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/function/index.js](https://github.com/awslabs/eb-java-scorekeep/tree/xray/function/index.js) - Random 名 Lambda 関数**  

```
var AWSXRay = require('aws-xray-sdk-core');
var AWS = AWSXRay.captureAWS(require('aws-sdk'));

AWS.config.update({region: process.env.AWS_REGION});
var Chance = require('chance');

var myFunction = function(event, context, callback) {
  var sns = new AWS.SNS();
  var chance = new Chance();
  var userid = event.userid;
  var name = chance.first();

  AWSXRay.captureFunc('annotations', function(subsegment){
    subsegment.addAnnotation('Name', name);
    subsegment.addAnnotation('UserID', event.userid);
  });

  // Notify
  var params = {
    Message: 'Created randon name "' + name + '"" for user "' + userid + '".',
    Subject: 'New user: ' + name,
    TopicArn: process.env.TOPIC_ARN
  };
  sns.publish(params, function(err, data) {
    if (err) {
      console.log(err, err.stack);
      callback(err);
    }
    else {
      console.log(data);
      callback(null, {"name": name});
    }
  });
};

exports.handler = myFunction;
```

この関数は、サンプルアプリケーションを Elastic Beanstalk にデプロイするときに自動的に作成されます。`xray` ブランチには、空白のLambda 関数を作成するスクリプトが含まれています。`.ebextensions` フォルダの設定ファイルは、デプロイ`npm install`中に で関数パッケージを構築し、 CLI で Lambda AWS 関数を更新します。

## ワーカー
<a name="scorekeep-lambda-worker"></a>

実装されたワーカー関数は、ワーカー関数と関連リソースを作成してからでないと実行できないため、自身のブランチ `xray-worker` で提供されます。手順については、[ブランチの readme](https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/README.md) を参照してください。

この関数は、5 分ごとにバンドルされているAmazon CloudWatch Events イベントによってトリガーされます。実行されると、この関数は Scorekeep によって管理されるAmazon SQS キューから項目を取得します。各メッセージには、完了したゲームに関する情報が含まれています。

ワーカーは、ゲームレコードが参照する他のテーブルからゲームレコードとドキュメントを取得します。たとえば、 DynamoDBのゲームレコードには、ゲーム中に実行されたムービーのリストが含まれています。リストには、ムービー自体は含まれておらず、別個のテーブルに格納されたムービーの ID が含まれています。

セッションと状態は、参照としても保存されます。これにより、ゲームテーブル内のエントリが大きくなりすぎることはありませんが、ゲームに関するすべての情報を取得するには追加の呼び出しが必要です。このワーカーは、これらのすべてのエントリを間接参照し、ゲームの完全なレコードをAmazon S3 に単一のドキュメントとして構築します。データで分析を行う場合、読み取り量の多いデータ移行を実行してデータを DynamoDBから取得しなくても、Amazon Athena を使用して Amazon S3 で直接クエリを実行できます。

![\[scorekeep ワーカー関数が Amazon SQS、　Amazon S3、Scorekeep API を使用する方法を示すトレースマップ。\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-servicemap-lambdaworker-node.png)


ワーカー関数では、 AWS Lambdaのその設定においてアクティブトレースが有効になっています。ランダム名関数とは異なり、ワーカーは計測されたアプリケーションからリクエストを受信しないため、 AWS Lambda はトレースヘッダーを受信しません。アクティブトレースを使用すると、 Lambdaはトレース ID を作成してサンプリングの決定を行います。

X-Ray SDK for Python は、SDK をインポートし、その`patch_all`関数を実行して、Amazon SQS と Amazon S3 の呼び出しに使用する AWS SDK for Python (Boto) と HTTclientsにパッチを適用する関数の上部にある数行です。ワーカーが API を呼び出すと、SDK は[トレースヘッダー](xray-concepts.md#xray-concepts-tracingheader)をリクエストに追加し、API を通じて呼び出しをトレースします。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/_lambda/scorekeep-worker/scorekeep-worker.py](https://github.com/awslabs/eb-java-scorekeep/tree/xray-worker/_lambda/scorekeep-worker/scorekeep-worker.py) -- ワーカー Lambda 関数**  

```
import os
import boto3
import json
import requests
import time
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

patch_all()
queue_url = os.environ['WORKER_QUEUE']

def lambda_handler(event, context):
    # Create SQS client
    sqs = boto3.client('sqs')
    s3client = boto3.client('s3')

    # Receive message from SQS queue
    response = sqs.receive_message(
        QueueUrl=queue_url,
        AttributeNames=[
            'SentTimestamp'
        ],
        MaxNumberOfMessages=1,
        MessageAttributeNames=[
            'All'
        ],
        VisibilityTimeout=0,
        WaitTimeSeconds=0
    )
   ...
```

# スタートアップコードの作成
<a name="scorekeep-startup"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

X-Ray SDK for Java は、着信リクエストのセグメントを自動的に作成します。リクエストが範囲内にある限り、計測クライアントを使用して問題なしでサブセグメントを記録できます。しかし、計測クライアントをスタートアップコードで使用しようとすると、[SegmentNotFoundException](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/exceptions/SegmentNotFoundException.html) が発生します。

スタートアップコードは、ウェブアプリケーションの標準的なリクエスト/レスポンスフローの外側で実行されるため、手動でセグメントを作成して計測する必要があります。Scorekeep はスタートアップコードのインストルメンテーションを`WebConfig` ファイルに表示します。Scorekeep はスタートアップ時に SQL データベースと Amazon SNS を呼び出します。

![\[Diagram showing client requests to Scorekeeper-init, which connects to SQL database and SNS.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-servicemap-init.png)


デフォルトの `WebConfig` クラスは、通知のための Amazon SNS サブスクリプションを作成します。Amazon SNSクライアントの使用時に X-Ray SDK が書き込むセグメントを提供するために、Scorekeep はグローバルレコーダー上で `beginSegment` と `endSegment` を呼び出します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java#L49](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/WebConfig.java#L49) – スタートアップコードに計測された AWS SDK クライアント**  

```
AWSXRay.beginSegment("Scorekeep-init");
if ( System.getenv("NOTIFICATION_EMAIL") != null ){
  try { Sns.createSubscription(); }
  catch (Exception e ) {
    logger.warn("Failed to create subscription for email "+  System.getenv("NOTIFICATION_EMAIL"));
  }
}
AWSXRay.endSegment();
```

Amazon RDS データベースが接続されているときに Scorekeep が使用する `RdsWebConfig` では、スタートアップ時にデータベーススキーマを適用するときに Hibernate が使用する SQL クライアントのセグメントも作成されます。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java#L83](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/RdsWebConfig.java#L83) – スタートアップコードの実装 SQL データベースクライアント**  

```
@PostConstruct
public void schemaExport() {
  EntityManagerFactoryImpl entityManagerFactoryImpl = (EntityManagerFactoryImpl) localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory();
  SessionFactoryImplementor sessionFactoryImplementor = entityManagerFactoryImpl.getSessionFactory();
  StandardServiceRegistry standardServiceRegistry = sessionFactoryImplementor.getSessionFactoryOptions().getServiceRegistry();
  MetadataSources metadataSources = new MetadataSources(new BootstrapServiceRegistryBuilder().build());
  metadataSources.addAnnotatedClass(GameHistory.class);
  MetadataImplementor metadataImplementor = (MetadataImplementor) metadataSources.buildMetadata(standardServiceRegistry);
  SchemaExport schemaExport = new SchemaExport(standardServiceRegistry, metadataImplementor);

  AWSXRay.beginSegment("Scorekeep-init");
  schemaExport.create(true, true);
  AWSXRay.endSegment();
}
```

`SchemaExport` は自動的に実行され、SQL クライアントを使用します。クライアントが計測されているため、Scorekeep はデフォルトの実装をオーバーライドし、SDK がクライアントの呼び出し時に使用するセグメントを提供する必要があります。

# 実装スクリプト
<a name="scorekeep-scripts"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

また、アプリケーションの一部ではないコードを計測することもできます。X-Ray デーモンが実行されている場合、X-Ray SDK によって生成されない場合でも、デーモンは受信したすべてのセグメントを X-Ray に中継します。Scorekeep は独自のスクリプトを使用して、展開中にアプリケーションをコンパイルするビルドを実装します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/build.sh](https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/build.sh) – 実装されたビルドスクリプト**  

```
SEGMENT=$(python bin/xray_start.py)
gradle build --quiet --stacktrace &> /var/log/gradle.log; GRADLE_RETURN=$?
if (( GRADLE_RETURN != 0 )); then 
  echo "Gradle failed with exit status $GRADLE_RETURN" >&2
  python bin/xray_error.py "$SEGMENT" "$(cat /var/log/gradle.log)"
  exit 1
fi
python bin/xray_success.py "$SEGMENT"
```

[https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_start.py](https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_start.py)､[https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_error.py](https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_error.py)､および [https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_success.py](https://github.com/awslabs/eb-java-scorekeep/tree/xray/bin/xray_success.py) は、セグメントオブジェクトを構築し、JSON 文書に変換し、UDP 経由でデーモンに送信する単純な Python スクリプトです。Gradle のビルドに失敗した場合は、X-Ray コンソールトレースマップの **[scorekeep-build]** ノードをクリックして、エラーメッセージを見つけることができます。

![\[Diagram showing client connection to Scorekeep-build with average time of 14.6s and 0.07/min.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-servicemap-builderror.png)


![\[Timeline view showing Scorekeep-build process with 14.6 second duration and warning icon.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-timeline-builderror.png)


![\[Error message showing build failure due to missing ElasticBeanstalkPlugin symbol in RdsWebConfig class.\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-exception-builderror.png)


# ウェブアプリケーションクライアントの実装
<a name="scorekeep-client"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

[https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito](https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito) ブランチで､Scorekeep は Amazon Cognito を使用して､ユーザーがアカウントを作成し、それを使用してサインインして Amazon Cognito ユーザープールからユーザー情報を取得することができるようにします。ユーザーがサインインすると、Scorekeep は Amazon Cognito ID プールを使用して、 で使用する一時的な AWS 認証情報を取得します AWS SDK for JavaScript。

ID プールは、サインインしたユーザーがトレースデータを AWS X-Rayに書き込むことができるように設定されています。ウェブアプリケーションは、これらの認証情報を使用して、ログインしたユーザーの ID、ブラウザパス、および Scorekeep API への呼び出しのクライアントビューを記録します。

ほとんどの作業は `xray` というサービスクラスで行われます。このサービスクラスは、必要な識別子の生成、進行中のセグメントの作成、セグメントのファイナライズ、セグメントドキュメントの X-Ray API への送信手段を提供します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito/public/app/xray.js](https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito/public/app/xray.js) – セグメントの記録とアップロード**  

```
...
  service.beginSegment = function() {
    var segment = {};
    var traceId = '1-' + service.getHexTime() + '-' + service.getHexId(24);

    var id = service.getHexId(16);
    var startTime = service.getEpochTime();

    segment.trace_id = traceId;
    segment.id = id;
    segment.start_time = startTime;
    segment.name = 'Scorekeep-client';
    segment.in_progress = true;
    segment.user =  sessionStorage['userid'];
    segment.http = {
      request: {
        url: window.location.href
      }
    };

    var documents = [];
    documents[0] = JSON.stringify(segment);
    service.putDocuments(documents);
    return segment;
  }

  service.endSegment = function(segment) {
    var endTime = service.getEpochTime();
    segment.end_time = endTime;
    segment.in_progress = false;
    var documents = [];
    documents[0] = JSON.stringify(segment);
    service.putDocuments(documents);
  }

  service.putDocuments = function(documents) {
    var xray = new AWS.XRay();
    var params = {
      TraceSegmentDocuments: documents
    };
    xray.putTraceSegments(params, function(err, data) {
      if (err) {
        console.log(err, err.stack);
      } else {
        console.log(data);
      }
    })
  }
```

これらのメソッドは、ウェブアプリケーションが Scorekeep API を呼び出すために使用するリソースサービスのヘッダーおよび `transformResponse` 関数で呼び出されます。API が生成するセグメントと同じトレースにクライアントセグメントを含めるには、ウェブアプリケーションは､X-Ray SDK が読み取り可能な[トレースへッダー](xray-concepts.md#xray-concepts-tracingheader) (`X-Amzn-Trace-Id`) にトレース ID とセグメント ID を含める必要があります｡ 実装された Java アプリケーションがこのヘッダーでリクエストを受け取ると、X-Ray SDK for Java は同じトレース ID を使用し、ウェブアプリケーションクライアントからのセグメントをセグメントの親にします。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito/public/app/services.js](https://github.com/awslabs/eb-java-scorekeep/tree/xray-cognito/public/app/services.js) – 角度リソースコールとトレースヘッダーの書き込みセグメントの記録**  

```
var module = angular.module('scorekeep');
module.factory('SessionService', function($resource, api, XRay) {
  return $resource(api + 'session/:id', { id: '@_id' }, {
    segment: {},
    get: {
      method: 'GET',
      headers: {
        'X-Amzn-Trace-Id': function(config) {
          segment = XRay.beginSegment();
          return XRay.getTraceHeader(segment);
        }
      },
      transformResponse: function(data) {
        XRay.endSegment(segment);
        return angular.fromJson(data);
      },
    },
...
```

表示されるトレースマップには、ウェブアプリケーションクライアントのノードが含まれます。

![\[\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-servicemap-client.png)


ウェブアプリケーションからのセグメントを含むトレースには、ユーザーがブラウザに表示する URL (`/#/` で始まるパス) が表示されます。クライアント実装機能がなければ、ウェブアプリケーションが呼び出す API リソース (`/api/` で始まるパス) の URL のみを取得します。

![\[\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-traces-client.png)


# 実装されたクライアントをワーカースレッドで使用する
<a name="scorekeep-workerthreads"></a>

**注記**  
X-Ray SDK/デーモンメンテナンス通知 – 2026 年 2 月 25 日、 AWS X-Ray SDKsデーモンはメンテナンスモードに移行します。 AWS では、X-Ray SDK とデーモンのリリースがセキュリティの問題にのみ対処するように制限されます。サポートタイムラインの詳細については、「[X-Ray SDK とデーモンのサポートタイムライン](xray-sdk-daemon-timeline.md)」を参照してください。OpenTelemetry に移行することをお勧めします。OpenTelemetry への移行の詳細については、「[X-Ray による計装から OpenTelemetry による計装への移行](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-migration.html)」を参照してください。

Scorekeep は、ユーザーがゲームに勝利したときにワーカースレッドを使用して Amazon SNS に通知を発行します。通知の発行は、残りのリクエスト操作の組み合わせよりも時間がかかり、クライアントまたはユーザーには影響しません。したがって、タスクを非同期で実行することは、応答時間を改善するための良い方法です。

ただし、X-Ray SDK for Java は、スレッドが作成されたときにどのセグメントがアクティブであったかを認識しません。その結果、計測された AWS SDK for Java クライアントをスレッド内で使用しようとすると、 がスローされ`SegmentNotFoundException`、スレッドがクラッシュします。

**Example web-1.error.log**  

```
Exception in thread "Thread-2" com.amazonaws.xray.exceptions.SegmentNotFoundException: Failed to begin subsegment named 'AmazonSNS': segment cannot be found.
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
...
```

この問題を解決するために、アプリケーションは `GetTraceEntity` を使用してメインスレッドのセグメントへの参照を取得し、`Entity.run()` を使用してセグメントのコンテキストにアクセスし、ワーカースレッドコードを安全に実行します。

**Example [https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/MoveFactory.java#L70](https://github.com/awslabs/eb-java-scorekeep/tree/xray/src/main/java/scorekeep/MoveFactory.java#L70) – ワーカースレッドにトレースコンテキストを渡す**  

```
import [com.amazonaws.xray.AWSXRay](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRay.html);
import [com.amazonaws.xray.AWSXRayRecorder](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/AWSXRayRecorder.html);
import [com.amazonaws.xray.entities.Entity](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Entity.html);
import [com.amazonaws.xray.entities.Segment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Segment.html);
import [com.amazonaws.xray.entities.Subsegment](https://docs.aws.amazon.com/xray-sdk-for-java/latest/javadoc/com/amazonaws/xray/entities/Subsegment.html);
...
      Entity segment = recorder.getTraceEntity();
      Thread comm = new Thread() {
        public void run() {
         segment.run(() -> {
            Subsegment subsegment = AWSXRay.beginSubsegment("## Send notification");
            Sns.sendNotification("Scorekeep game completed", "Winner: " + userId);
            AWSXRay.endSubsegment();
          }
        }
```

Amazon SNS の呼び出しの前に要求が解決されるため、アプリケーションはスレッド用に別のサブセグメントを作成します。これにより、Amazon SNS からの応答を記録する前に X-Ray SDK がセグメントを閉じるのを防ぎます。Scorekeep がリクエストを解決したときにサブセグメントが開いていない場合、Amazon SNS からの応答は失われる可能性があります。

![\[\]](http://docs.aws.amazon.com/ja_jp/xray/latest/devguide/images/scorekeep-workerthread.png)


マルチスレッドの詳細については、「[マルチスレッドアプリケーションでのスレッド間のセグメントコンテキストの受け渡し](xray-sdk-java-multithreading.md)」を参照してください。