[A02] /admin/analyze が 1000 カラムの CSV で Bedrock converse の read timeout に必ず失敗する
再現条件
- 1 CSV に 1000 カラム前後(実測
column_0000..column_0999、ヘッダー 11,999 バイト、1 行あたり ~17 KB)
- Admin UI で該当プレフィックスを指定して
analyze 実行
観測された挙動
/admin/analyze 呼び出しから約 5 分 7 秒後、Admin UI に以下のエラーが表示される:
テーブル定義を生成できませんでした — testcase/A02-construction-1000-cols/wide_table.csv:
Read timeout on endpoint URL: "https://bedrock-runtime.ap-northeast-1.amazonaws.com/model/<model-id>/converse"
- 同じ操作を 2 回実施して再現(5:07, 5:08)
- Step Functions execution ARN は生成されない(analyze 段階で失敗しているため apply に進まない)
- AdminBackend Lambda の CloudWatch Logs で
analyze: [1/1] group(1 files, rep=testcase/A02-construction-1000-cols/wide_table.csv) を AI 分析中... → WARNING analyze: ... AI 分析失敗: Read timeout on endpoint URL ...
原因(推定)
1. bedrock-runtime クライアントに read_timeout / リトライ設定が無い
lambda/adminwebbackend/app.py L232:
bedrock_runtime = boto3.client("bedrock-runtime")
botocore.config.Config を渡していないため、bedrock-runtime の同期 converse に対して read timeout やリトライを明示コントロールできていない
- 一方で S3 クライアントは
BotoConfig(signature_version="v4", ...) を渡している(同じファイル L33)ため、設計上忘れられたと思われる
2. カラム数が多い CSV で入出力トークンが極端に肥大化する
_analyze_single_csv_with_bedrock が送るプロンプトには以下すべてが埋め込まれる:
- ヘッダー 1000 要素の Python リストの文字列表現(~12 KB)
- 先頭 20 行のサンプル(1 行 ~17 KB × 20 = ~340 KB)
- 中程 20 行のサンプル(~340 KB)
- 末尾 20 行のサンプル(~340 KB)
合計 ~1 MB 級のプロンプトを非ストリーミングの converse に投入している。
加えて、ツールスキーマ _TABLE_TOOL_SCHEMA が columns: [{name, type, description}, ...] の description を required にしているため、Claude は全 1000 カラムに日本語説明を返す必要がある。inferenceConfig={"maxTokens": 8192} では到底足りないし、8192 トークン出し切ること自体に数分かかる。
3. 同期 converse + デフォルト SDK 設定では長時間応答に耐えられない
- Bedrock の同期
converse は 60 秒を超える応答に対して信頼性が低い(公式には converse_stream が推奨)
- 1MB プロンプト + 1000 カラム分の構造化出力というワークロードは
converse_stream でないと現実的に処理できない
再現手順
- S3 に
testcase/A02-construction-1000-cols/wide_table.csv を配置(ヘッダー 1000 カラム、10,000 行、~185 MB)
- Admin UI から該当プレフィックスを指定して Agent を作成
analyze を実行
- 約 5 分後に
Read timeout on endpoint URL: ".../converse" が表示されることを観測
期待される挙動
- カラム数が多い CSV でもテーブル定義を生成できる、または明示的に「カラム数が多すぎて分析できない」「サンプルを減らして再試行」等のガイド付きエラーを返す
- 具体的な改善候補:
bedrock-runtime クライアントに Config(read_timeout=600, retries={...}) を設定
converse ではなく converse_stream を使い、チャンクを受け取りながらタイムアウトを延ばす
- カラム数が多い場合は サンプル行数を 20 行から自動的に縮小する / サンプルを送らず「先頭 1 行のみ + 各列の値のハッシュ統計」に置き換える
_TABLE_TOOL_SCHEMA の columns[].description を required から外し、Claude が省略できるようにする
inferenceConfig.maxTokens を動的に調整(カラム数 × 50 程度を最低限確保)
参考情報
- 対象スタック:
arn:aws:cloudformation:ap-northeast-1:411521242467:stack/devDwhAgentStack/6619ffe0-3f8b-11f1-a3dc-068ad41190bd
- AdminBackend Lambda:
devDwhAgentStack-AdminBackendHandler45CB5D31-3hja9Gbucn5k(Timeout 900 秒 / Memory 2048 MB / コンテナ)
- モデル:
global.anthropic.claude-sonnet-4-6
- 関連ファイル:
lambda/adminwebbackend/app.py L232, L461 以降 (_analyze_single_csv_with_bedrock)
[A02]
/admin/analyzeが 1000 カラムの CSV で Bedrockconverseの read timeout に必ず失敗する再現条件
column_0000..column_0999、ヘッダー 11,999 バイト、1 行あたり ~17 KB)analyze実行観測された挙動
/admin/analyze呼び出しから約 5 分 7 秒後、Admin UI に以下のエラーが表示される:analyze: [1/1] group(1 files, rep=testcase/A02-construction-1000-cols/wide_table.csv) を AI 分析中... → WARNING analyze: ... AI 分析失敗: Read timeout on endpoint URL ...原因(推定)
1. bedrock-runtime クライアントに
read_timeout/ リトライ設定が無いlambda/adminwebbackend/app.pyL232:botocore.config.Configを渡していないため、bedrock-runtime の同期converseに対して read timeout やリトライを明示コントロールできていないBotoConfig(signature_version="v4", ...)を渡している(同じファイル L33)ため、設計上忘れられたと思われる2. カラム数が多い CSV で入出力トークンが極端に肥大化する
_analyze_single_csv_with_bedrockが送るプロンプトには以下すべてが埋め込まれる:合計 ~1 MB 級のプロンプトを非ストリーミングの
converseに投入している。加えて、ツールスキーマ
_TABLE_TOOL_SCHEMAがcolumns: [{name, type, description}, ...]のdescriptionをrequiredにしているため、Claude は全 1000 カラムに日本語説明を返す必要がある。inferenceConfig={"maxTokens": 8192}では到底足りないし、8192 トークン出し切ること自体に数分かかる。3. 同期
converse+ デフォルト SDK 設定では長時間応答に耐えられないconverseは 60 秒を超える応答に対して信頼性が低い(公式にはconverse_streamが推奨)converse_streamでないと現実的に処理できない再現手順
testcase/A02-construction-1000-cols/wide_table.csvを配置(ヘッダー 1000 カラム、10,000 行、~185 MB)analyzeを実行Read timeout on endpoint URL: ".../converse"が表示されることを観測期待される挙動
bedrock-runtimeクライアントにConfig(read_timeout=600, retries={...})を設定converseではなくconverse_streamを使い、チャンクを受け取りながらタイムアウトを延ばす_TABLE_TOOL_SCHEMAのcolumns[].descriptionを required から外し、Claude が省略できるようにするinferenceConfig.maxTokensを動的に調整(カラム数 × 50 程度を最低限確保)参考情報
arn:aws:cloudformation:ap-northeast-1:411521242467:stack/devDwhAgentStack/6619ffe0-3f8b-11f1-a3dc-068ad41190bddevDwhAgentStack-AdminBackendHandler45CB5D31-3hja9Gbucn5k(Timeout 900 秒 / Memory 2048 MB / コンテナ)global.anthropic.claude-sonnet-4-6lambda/adminwebbackend/app.pyL232, L461 以降 (_analyze_single_csv_with_bedrock)