

# AgentCore の外部でホストされているエージェントの A/B テストを実行する
<a name="ab-testing-3p-agents"></a>

A/B は、Lambda、Amazon EKS、Amazon ECS AWS など、任意の場所でホストされているエージェントを使用して、AgentCore ランタイムの外部で実行されるエージェントをテストできます。A/B テストエージェントの場合、AgentCore ゲートウェイはバリアント間でトラフィックをルーティングし、各セッションのオンライン評価スコアをルーティングし、サービスはバリアントごとの統計的有意性を計算します。エージェントを AgentCore ランタイムにない場合は、オブザーバビリティのために計測し、AgentCore ゲートウェイターゲットとして自分で登録し、ゲートウェイトレースを有効にして、セッションをバリアントに属性付けできるようにする必要があります。

A/B テストでは[、単一のエージェントランタイムの設定バンドル](ab-testing-config-bundle.md)と、[2 つのエージェントエンドポイントを使用したターゲットベースのルーティング](ab-testing-target-based.md)がサポートされています。このページでは、トレースを有効にして、HTTP 到達可能なエージェントエンドポイントを AgentCore ゲートウェイのターゲットとして設定する方法を示します。次に、AgentCore ゲートウェイトレースはバリアント属性を提供し、エージェントエンドポイントのオブザーバビリティはスコアリング用のメッセージコンテンツを提供します。

このページは、[ターゲットベースのルーティングで A/B テストを実行する](ab-testing-target-based.md)ための付録です。例として Lambda がホストするエージェント (関数 URL の背後) を使用する、ランタイム以外のエージェントが必要とする追加セットアップのみを対象としています。AgentCore ゲートウェイターゲットとして登録した HTTP 到達可能なエージェントエンドポイントにも同じアプローチが適用され、テストを作成および実行するためにそのページに戻ります。

## 前提条件
<a name="ab-testing-3p-prereqs"></a>

[一般的な A/B テストの前提条件](ab-testing-prereqs.md)に加えて、以下が必要です。

1. AgentCore ゲートウェイトレースがゲートウェイで有効になっているため、セッションをバリアントに属性付けできます。

1. エージェントは、サポートされているプロトコルを使用して AgentCore ゲートウェイのパススルーターゲットとして を追加しました。

## ステップ 1: AgentCore オブザーバビリティのためにエージェントを計測する
<a name="ab-testing-3p-step1-observability"></a>

**注記**  
完全なセットアップ[については、AgentCore の外部でホストされているエージェントのオブザーバビリティの有効化](observability-configure.md#observability-configure-3p)」を参照してください。

Lambda がホストするエージェントの場合は、[AWS Lambda Layer for OpenTelemetry ](https://aws-otel.github.io/docs/getting-started/lambda#adot-lambda-layer-arns)をアタッチし、次の環境変数を設定します。

```
aws lambda update-function-configuration \
  --function-name <function-name> \
  --region <region> \
  --layers <adot-python-layer-arn> \
  --environment "Variables={
    AGENT_OBSERVABILITY_ENABLED=true,
    OTEL_PROPAGATORS='baggage,xray-lambda,tracecontext',
    OTEL_PYTHON_DISTRO=aws_distro,
    OTEL_PYTHON_CONFIGURATOR=aws_configurator,
    OTEL_LOGS_EXPORTER=otlp,
    OTEL_TRACES_EXPORTER=otlp,
    OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf,
    OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED=true,
    OTEL_AWS_APPLICATION_SIGNALS_ENABLED=false,
    OTEL_EXPORTER_OTLP_LOGS_HEADERS='x-aws-log-group=/aws/bedrock-agentcore/agents/<function-name>/runtime-logs,x-aws-log-stream=runtime-logs,x-aws-metric-namespace=agentcore',
    OTEL_RESOURCE_ATTRIBUTES='service.name=<function-name>',
    AWS_LAMBDA_EXEC_WRAPPER=/opt/otel-instrument
  }"
```

関数 URL リクエストを解析し、セッションのバランサーを設定する最小限の Lambda ハンドラー。

```
import base64, json
from strands import Agent
from strands.models.bedrock import BedrockModel
from opentelemetry import baggage, context

_model = BedrockModel(model_id="global.anthropic.claude-sonnet-4-5-20250929-v1:0")


def lambda_handler(event, _context):
    # Lambda function URL payload format 2.0: JSON body is in event["body"], no httpMethod.
    raw = event.get("body")
    if raw is not None and event.get("isBase64Encoded"):
        raw = base64.b64decode(raw).decode()
    body = json.loads(raw) if isinstance(raw, str) else (raw or event)

    session_id = _session_id(event)
    token = context.attach(baggage.set_baggage("session.id", session_id))
    try:
        agent = Agent(model=_model, system_prompt="You are a helpful assistant. Be concise.")
        result = agent(body.get("prompt", "Hello"))
    finally:
        context.detach(token)
    return {"response": str(result), "sessionId": session_id}


def _session_id(event):
    return (event.get("headers") or {}).get("x-session-id") or "default"
```

ターゲットベースのルーティングでは、テストする変更 (別の `model_id`やシステムプロンプトなど) を使用して、これを 2 回デプロイします。

## ステップ 2: HTTP 経由でエージェントを公開する
<a name="ab-testing-3p-step2-http"></a>

エージェントは、AgentCore ゲートウェイが呼び出すことができる HTTP エンドポイントで到達可能である必要があります。Lambda の例では、関数ごとに IAM 認証を使用して関数 URL を作成します。

```
aws lambda create-function-url-config \
  --function-name cs-agent-control \
  --auth-type AWS_IAM \
  --region us-west-2
```

処理関数に対して繰り返します。(コンテナまたはセルフホストエージェントの場合は、代わりに HTTPS エンドポイントを公開し、ステップ 3 に進みます）。

## ステップ 3: エージェントを AgentCore ゲートウェイターゲットとして登録する
<a name="ab-testing-3p-step3-target"></a>

AgentCore ゲートウェイで各エンドポイントを HTTP **パススルー**ターゲットとして登録します。`protocolType`、維持、認証情報オプションなど、パススルーターゲットの詳細については、[「HTTP パススルーターゲット](https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-http-passthrough.html)」を参照してください。

Lambda 関数 URL をターゲットとして登録するには、 `protocolType` を に設定`CUSTOM`し、 を指定します`iamCredentialProvider`。認証情報プロバイダーは、ゲートウェイが`lambda`サービスとして関数 URL への各アウトバウンドリクエストに署名することを許可します。

**注記**  
は、 `x-session-id`ヘッダーを使用して、同じセッションに属するリクエストを認識するようにゲートウェイに`stickinessConfiguration`指示します。セッションの維持は、A/B テストを開始または停止するときに進行中のセッションに影響を与えません。ゲートウェイは、進行中のセッションを既に割り当てられているのと同じターゲットに引き続きルーティングし、テストの実行中に A/B テスト処理の重みに従って新しいセッションのみをルーティングします。
オブザーバビリティのために、エージェントはトレースコンテキストでこの同じセッション ID も設定する必要があります (例: `session.id`バランサー）。これにより、オンライン評価はエージェントセッションとトレースをスコアリングし、それらを正しい A/B テスト処理に関連付けます。

**Example**  

```
agentcore add gateway-target \
  --name customer-support-control \
  --gateway cs-3p-abtest-gw \
  --type passthrough \
  --passthrough-endpoint https://<control-id>.lambda-url.us-west-2.on.aws/ \
  --passthrough-protocol CUSTOM \
  --stickiness-identifier '$context.header.x-session-id' \
  --stickiness-timeout 28800 \
  --signing-service lambda \
  --signing-region us-west-2
```

```
aws bedrock-agentcore-control create-gateway-target \
  --gateway-identifier cs-3p-abtest-gw-abc123 \
  --name customer-support-control \
  --region us-west-2 \
  --target-configuration '{
    "http": {
      "passthrough": {
        "endpoint": "https://<control-id>.lambda-url.us-west-2.on.aws/",
        "protocolType": "CUSTOM",
        "stickinessConfiguration": {
          "identifier": "$context.header.x-session-id",
          "timeout": 28800
        }
      }
    }
  }' \
  --credential-provider-configurations '[
    {
      "credentialProviderType": "GATEWAY_IAM_ROLE",
      "credentialProvider": {
        "iamCredentialProvider": { "service": "lambda", "region": "us-west-2" }
      }
    }
  ]'
```

ターゲットベースのルーティングの場合は、処理エンドポイントに対して を繰り返します (名前は )`customer-support-treatment`。が `get-gateway-target`になるまで、各ターゲットを でポーリング`status`します`READY`。

**注記**  
 `iamCredentialProvider` は、IAM 認証パススルーターゲットに必要です。Lambda 関数の URL が `service`に設定されている場合`lambda`。ゲートウェイ IAM ロールには、各関数の ARN `lambda:InvokeFunction` に `lambda:InvokeFunctionUrl`と の両方が必要です。

## ステップ 4: AgentCore ゲートウェイトレースを有効にする
<a name="ab-testing-3p-step4-gateway-tracing"></a>

AgentCore ゲートウェイでトレース配信を有効にして、バリアント属性スパンを に出力します`aws/spans`。コンソールからトレースを有効にするには、ゲートウェイの詳細ページを開き、**ログ配信とトレース** → **トレース →** **有効化**を選択します。詳細については、[CloudWatch へのトレース配信を設定する](observability-configure.md#observability-configure-tracing)」を参照してください。

トラフィックがフローを開始すると、各ゲートウェイスパンには、リクエスト`traceId`の とともに `aws.agentcore.gateway.routing_experiment_arn`および `aws.agentcore.gateway.routing_experiment_variant_name` (例: `C`または `T1`) 属性が保持されます。オンライン評価パイプラインは、ゲートウェイスパンをエージェントのスパンに で結合します。これは`traceId`、スコアリングされた各セッションがそのバリアントに属性付けられる方法です。ゲートウェイトレースがないと、セッションは引き続きスコアリングされますが、バリアントに帰属させることはできません。また、A/B テストではバリアントごとの結果は生成されません。

## ステップ 5: A/B テストを作成して実行する
<a name="ab-testing-3p-step5-run"></a>

エージェントは、テレメトリを出力するゲートウェイターゲットになりました。2 つのステップが残ります。

1.  **バリアントエンドポイントごとに 1 つのオンライン評価設定を作成します。**[「オンライン評価の作成](create-online-evaluations.md)」を参照してください。設定ごとに、 で設定した `service.name`および イベントロググループを使用します[ステップ 1: AgentCore オブザーバビリティのためにエージェントを計測する](#ab-testing-3p-step1-observability)。

1.  **A/B テストを作成して実行します。**[「A/B テストの作成」ステップから始めて、ターゲットベースのルーティングで](ab-testing-target-based.md) **A/B テスト**を実行する — でテストを作成し`perVariantOnlineEvaluationConfig`、トラフィックを送信し、結果をポーリングして、勝者を停止してデプロイします。

ゲートウェイ経由でトラフィックを送信するときは、コントロールバリアントのターゲットに転送します。ゲートウェイは、コントロールターゲットに到着するすべてのトラフィックを、A/B テスト設定に従ってコントロール (`C`) ターゲットと処理 (`T1`) ターゲットに分割します。

**Example**  
データソース[ステップ 1: AgentCore オブザーバビリティのためにエージェントを計測する](#ab-testing-3p-step1-observability)として の `service.name`および イベントロググループを使用して、バリアントごとに 1 つのオンライン評価設定を追加し、 `target-based` モードでテストを開始します。  

```
agentcore add online-eval \
  --name cs-control-eval \
  --evaluator Builtin.Correctness \
  --service-name customer-support-control \
  --log-group-name /aws/bedrock-agentcore/agents/cs-agent-control/runtime-logs \
  --enable-on-create

agentcore add online-eval \
  --name cs-treatment-eval \
  --evaluator Builtin.Correctness \
  --service-name customer-support-treatment \
  --log-group-name /aws/bedrock-agentcore/agents/cs-agent-treatment/runtime-logs \
  --enable-on-create

agentcore deploy

agentcore run ab-test \
  --name cs-3p-abtest \
  --gateway cs-3p-abtest-gw \
  --mode target-based \
  --control-target customer-support-control \
  --treatment-target customer-support-treatment \
  --control-online-eval cs-control-eval \
  --treatment-online-eval cs-treatment-eval \
  --control-weight 50 \
  --treatment-weight 50 \
  --wait
```
`agentcore status` テストの実行中にバリアントごとの結果を表示し、終了`agentcore stop`するには、 を使用します。
を使用して、バリアントごとに 1 つのオンライン評価設定を作成します`create_online_evaluation_config`。`serviceNames` をエンドポイントの に設定`service.name`し、 `logGroupNames`をイベントロググループに設定します。次に`create_ab_test`、 を使用して でテストを作成します`perVariantOnlineEvaluationConfig`。トラフィックの送信、結果のポーリング、テストの停止など、boto3 の完全な例については、[「A/B テストの作成」ステップから始めて、ターゲットベースのルーティングで](ab-testing-target-based.md) **A/B テストを実行する**」を参照してください。

## トラブルシューティング
<a name="ab-testing-3p-troubleshooting"></a>

### A/B テストでは、トラフィックの送信後に結果は表示されません
<a name="ab-testing-3p-no-results"></a>
+ ゲートウェイトレースが有効になっていることを確認します ([ステップ 4: AgentCore ゲートウェイトレースを有効にする](#ab-testing-3p-step4-gateway-tracing)) — これがないと、集約パイプラインはセッションをバリアントに属性付けできません。
+ 各オンライン評価設定の がエンドポイントの `serviceNames`と一致し`service.name`、その にエンドポイントのイベントロググループ`logGroupNames`が含まれていることを確認します。オンライン評価`aws/spans`は自動的に読み込まれるため、一覧表示しませんが、イベントロググループ (メッセージコンテンツ) を一覧表示する必要があります。
+ 結果は、設定された でセッションがアイドル状態になった後`sessionTimeoutMinutes`、次のスコアリングサイクルから約 15 分以内に表示されます。