<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Backend Architecture on K-Life Hack | 韓国ハイエンド・ライフスタイルガイド</title><link>https://klifehack.com/categories/backend-architecture/</link><description>Recent content in Backend Architecture on K-Life Hack | 韓国ハイエンド・ライフスタイルガイド</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Sat, 23 May 2026 09:55:55 +0900</lastBuildDate><atom:link href="https://klifehack.com/categories/backend-architecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Valkey 8.0 への移行によるキャッシュスループットの改善とレイテンシスパイクの解消</title><link>https://klifehack.com/p/valkey-migration-performance-tuning/</link><pubDate>Sat, 23 May 2026 09:55:55 +0900</pubDate><guid>https://klifehack.com/p/valkey-migration-performance-tuning/</guid><description>&lt;h1 id="aiエージェントのバーストトラフィックに伴うredisの限界と遅延の発生"&gt;AIエージェントのバーストトラフィックに伴うRedisの限界と遅延の発生
&lt;/h1&gt;&lt;p&gt;2026年5月現在、当社のAIエージェント基盤では、Claude CodeおよびCursorからの同時リクエストが急増しており、バックエンドのキャッシュ層として運用していたRedis 7.2クラスターにおいて深刻なパフォーマンス低下が確認されました。特に、ベクトル検索のメタデータキャッシュおよびセッション管理において、P99レイテンシが平常時の2msから150ms以上にまでスパイクする事象が頻発しました。&lt;/p&gt;
&lt;p&gt;監視ツール（Prometheus/Grafana）による分析の結果、Redisのシングルスレッドモデルに起因するCPU飽和が原因であることが判明しました。Redis 7系でもI/Oスレッドの分離は可能ですが、2026年のワークロードにおける高度な並列処理要求に対しては、スループットの限界に達していました。これを受け、Linux Foundation傘下で開発が進められている&lt;b&gt;&lt;mark&gt;Valkey 8.0&lt;/mark&gt;&lt;/b&gt;への移行を決定しました。&lt;/p&gt;
&lt;h2 id="発生していた障害の技術的詳細"&gt;発生していた障害の技術的詳細
&lt;/h2&gt;&lt;p&gt;以下のログは、Redis 7.2ノードで発生していたスロークエリログの抜粋です。AIエージェントが生成する複雑なパイプラインリクエストが、メインスレッドを長時間占有していました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Redis Slow Log Excerpt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1) (integer) 1024
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2) (integer) 1717143615 # 2026-05-31 14:20:15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;3) (integer) 45000 # Execution time: 45ms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;4) 1) &amp;#34;MGET&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 2) &amp;#34;session:ai_agent:user_992834...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 3) &amp;#34;metadata:vector:index_442...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この遅延により、アップストリームのgRPCサービスでタイムアウトが連鎖し、システム全体の可用性が98.2%まで低下しました。&lt;/p&gt;
&lt;h2 id="valkey-80-への移行手順とマルチスレッド最適化の設定"&gt;Valkey 8.0 への移行手順とマルチスレッド最適化の設定
&lt;/h2&gt;&lt;p&gt;移行にあたっては、Redisとの完全なプロトコル互換性を維持しつつ、Valkey独自のマルチスレッド拡張機能を有効化しました。Valkey 8.0では、コマンド実行自体の並列化が強化されており、特に大規模なMGETやSCAN操作において顕著な性能向上が期待できます。&lt;/p&gt;
&lt;h3 id="インストールおよびビルドプロセス"&gt;インストールおよびビルドプロセス
&lt;/h3&gt;&lt;p&gt;2026年環境の標準パッケージマネージャーである &lt;code&gt;uv&lt;/code&gt; を介して依存関係を整理し、以下の手順でビルドおよびデプロイを実施しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Valkey 8.0.1 のソース取得とビルド&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone --branch 8.0.1 https://github.com/valkey-io/valkey.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd valkey
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make -j&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;nproc&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 既存のRedis設定からの移行と最適化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp /etc/redis/redis.conf /etc/valkey/valkey.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sed -i &lt;span style="color:#e6db74"&gt;&amp;#39;s/redis/valkey/g&amp;#39;&lt;/span&gt; /etc/valkey/valkey.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="スループット向上のための設定変更"&gt;スループット向上のための設定変更
&lt;/h3&gt;&lt;p&gt;Valkeyの性能を最大限に引き出すため、&lt;code&gt;valkey.conf&lt;/code&gt; において以下のパラメータを調整しました。特に &lt;code&gt;io-threads&lt;/code&gt; の最適化が鍵となります。 🛠️&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# valkey.conf optimization for 2026 infrastructure
maxmemory 32gb
maxmemory-policy allkeys-lru
io-threads 8
io-threads-do-reads yes
# Valkey 8.0 specific: Enhanced multi-threading for command execution
server-threads 4
cluster-enabled yes
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="移行後のパフォーマンス検証とスループット測定"&gt;移行後のパフォーマンス検証とスループット測定
&lt;/h2&gt;&lt;p&gt;移行完了後、&lt;code&gt;valkey-benchmark&lt;/code&gt; を使用して、旧Redis環境との比較検証を実施しました。検証環境は、AWS r7g.2xlarge インスタンス（Graviton 4）を使用しています。&lt;/p&gt;
&lt;h3 id="ベンチマークコマンドの実行"&gt;ベンチマークコマンドの実行
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Valkey 8.0 への負荷テスト実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;valkey-benchmark -h 10.0.4.12 -p &lt;span style="color:#ae81ff"&gt;6379&lt;/span&gt; -c &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; -n &lt;span style="color:#ae81ff"&gt;2000000&lt;/span&gt; -t set,get,mget -P &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt; --threads &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="検証結果の比較データ"&gt;検証結果の比較データ
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;指標&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Redis 7.2 (Legacy)&lt;/th&gt;
					&lt;th style="text-align: left"&gt;Valkey 8.0 (New)&lt;/th&gt;
					&lt;th style="text-align: left"&gt;改善率&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;GET スループット (RPS)&lt;/td&gt;
					&lt;td style="text-align: left"&gt;420,000&lt;/td&gt;
					&lt;td style="text-align: left"&gt;1,350,000&lt;/td&gt;
					&lt;td style="text-align: left"&gt;+221%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;MGET (10 keys) RPS&lt;/td&gt;
					&lt;td style="text-align: left"&gt;85,000&lt;/td&gt;
					&lt;td style="text-align: left"&gt;290,000&lt;/td&gt;
					&lt;td style="text-align: left"&gt;+241%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;P99 レイテンシ (ms)&lt;/td&gt;
					&lt;td style="text-align: left"&gt;12.4ms&lt;/td&gt;
					&lt;td style="text-align: left"&gt;1.8ms&lt;/td&gt;
					&lt;td style="text-align: left"&gt;-85%&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;CPU使用率 (ピーク時)&lt;/td&gt;
					&lt;td style="text-align: left"&gt;98% (1 core)&lt;/td&gt;
					&lt;td style="text-align: left"&gt;45% (Distributed)&lt;/td&gt;
					&lt;td style="text-align: left"&gt;負荷分散成功&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="運用監視におけるメトリクスの変化とログ証跡"&gt;運用監視におけるメトリクスの変化とログ証跡
&lt;/h2&gt;&lt;p&gt;Valkey導入後、ノードの稼働状況を確認したところ、スレッド間のコンテンション（競合）が最小限に抑えられていることが確認されました。以下は &lt;code&gt;valkey-cli info&lt;/code&gt; コマンドによる統計情報の出力です。 💡&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Valkey Stats Excerpt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;valkey_version:8.0.1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;multiplexing_api:epoll
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;io_threads_active:1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;server_threads_active:4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;instantaneous_ops_per_sec:1284902
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total_net_input_bytes:15829304822
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total_net_output_bytes:89230492833
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rejected_connections:0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特筆すべきは、&lt;code&gt;rejected_connections&lt;/code&gt; が 0 を維持している点です。旧環境では、TCPバックログの溢れにより、1時間あたり平均150件の接続拒否が発生していました。&lt;/p&gt;
&lt;h2 id="発生した課題とトラブルシューティング"&gt;発生した課題とトラブルシューティング
&lt;/h2&gt;&lt;p&gt;移行初期において、一部のクライアントライブラリ（旧式の &lt;code&gt;redis-py&lt;/code&gt; 4.x系）で、Valkeyのクラスターバス通信におけるノード認識に失敗する事象が発生しました。 ⚠️&lt;/p&gt;
&lt;h3 id="根本原因"&gt;根本原因
&lt;/h3&gt;&lt;p&gt;Valkey 8.0 の &lt;code&gt;CLUSTER NODES&lt;/code&gt; 応答に含まれるメタデータ形式が、一部の古い正規表現ベースのパーサーと競合していました。&lt;/p&gt;
&lt;h3 id="解決策"&gt;解決策
&lt;/h3&gt;&lt;p&gt;クライアント側のライブラリを、2026年標準の &lt;code&gt;valkey-py&lt;/code&gt; または最新の &lt;code&gt;redis-py&lt;/code&gt; 5.5.0 以上にアップデートすることで解決しました。また、&lt;code&gt;uv&lt;/code&gt; を使用してプロジェクト全体の依存関係を強制的に同期しました。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 依存関係の更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv add valkey&amp;amp;gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;8.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uv lock
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="最終確認とシステムへの影響評価"&gt;最終確認とシステムへの影響評価
&lt;/h2&gt;&lt;p&gt;本移行により、AIエージェントからのバースト的なリクエストに対しても、キャッシュ層がボトルネックになることなく、安定したレスポンスを提供可能となりました。2026年5月31日現在の本番環境において、エラー率は 0.01% 未満に抑制されています。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;スループット&lt;/b&gt;: 従来の約3倍の処理能力を確保。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;レイテンシ&lt;/b&gt;: スパイクが解消され、P99が2ms以下で安定。&lt;/li&gt;
&lt;li&gt;&lt;b&gt;リソース効率&lt;/b&gt;: マルチスレッド化により、マルチコアCPUの計算リソースを無駄なく活用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;今後は、Valkey 8.0 の新機能であるベクトルインデックスのネイティブサポートについても検証を進め、AIエージェントの推論高速化に寄与する予定です。&lt;/p&gt;</description></item><item><title>urllib3 Connection PoolにおけるIPS検知時の再試行制御とNATパケット解析</title><link>https://klifehack.com/p/snort-ips-inline-sqli-detection/</link><pubDate>Thu, 21 May 2026 01:33:09 +0900</pubDate><guid>https://klifehack.com/p/snort-ips-inline-sqli-detection/</guid><description>&lt;h2 id="高負荷マイクロサービスにおけるurllib3コネクションプールの最適化とipsの影響"&gt;高負荷マイクロサービスにおけるurllib3コネクションプールの最適化とIPSの影響
&lt;/h2&gt;&lt;p&gt;高負荷なマイクロサービス環境において、&lt;b&gt;&lt;mark&gt;urllib3 Connection Pool&lt;/mark&gt;&lt;/b&gt;の適切な管理は、システム全体のレイテンシとスループットに直結します。特にIPS（Intrusion Prevention System）がインライン配置されたネットワーク経路では、不正トラフィック検知に伴うパケットドロップがコネクションプールの枯渇を引き起こす主要な要因となります。&lt;/p&gt;
&lt;h2 id="ipsのインライン配置によるパケットドロップの影響"&gt;IPSのインライン配置によるパケットドロップの影響
&lt;/h2&gt;&lt;p&gt;IPSが&lt;code&gt;drop&lt;/code&gt;アクションを実行すると、クライアント側の&lt;code&gt;urllib3&lt;/code&gt;はTCPの再送タイマーに基づき待機状態に入ります。IDS（検知のみ）とは異なり、IPSはパケットを物理的に遮断するため、プール内のコネクションが「ESTABLISHED」状態のままハングするリスクを孕んでいます。以下は、Snortを用いたICMPドロップルールの適用例です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/snort/rules/local.rules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# alertからdropへ変更し、IPSモードを有効化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drop icmp any any -&amp;amp;gt; 10.10.11.10 any &lt;span style="color:#f92672"&gt;(&lt;/span&gt;msg: &lt;span style="color:#e6db74"&gt;&amp;#34;ICMP ping Request Inline mode&amp;#34;&lt;/span&gt;; sid: 1000001;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Snortの実行（インラインモード）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;snort -A console -q -u snort -g snort -c /etc/snort/snort.conf -Q
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この設定下でクライアントがリクエストを送信した場合、&lt;code&gt;Destination port unreachable&lt;/code&gt;が返されるか、あるいは完全にサイレントドロップされ、&lt;code&gt;urllib3&lt;/code&gt;側では&lt;code&gt;ReadTimeoutError&lt;/code&gt;が発生します。💡 タイムアウト値の適切な設定は、このようなゾンビコネクションによるリソース占有を防ぐために不可欠です。&lt;/p&gt;
&lt;h2 id="nat環境におけるパケット構造とコネクション維持"&gt;NAT環境におけるパケット構造とコネクション維持
&lt;/h2&gt;&lt;p&gt;NAT（Network Address Translation）を経由する通信では、L3およびL4レイヤーでIPアドレスとポート番号の変換が行われます。&lt;code&gt;urllib3&lt;/code&gt;の&lt;code&gt;HTTPConnectionPool&lt;/code&gt;は、変換後の宛先IP（DIP）に対してコネクションを維持しますが、NATテーブルのタイムアウト設定とプールの&lt;code&gt;keep-alive&lt;/code&gt;設定が不整合を起こすと、無効なコネクションがプールに残留し、通信エラーを誘発します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[HTTP Request: 192.168.100.10 -&amp;amp;gt; 10.10.11.10]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Before DNAT: |L3 SIP 192.168.100.1, DIP 192.168.100.10|L4 sport 5000, dport 80|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;After DNAT: |L3 SIP 192.168.100.1, DIP 10.10.11.10|L4 sport 5000, dport 80|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[HTTP Response: 10.10.11.10 -&amp;amp;gt; 192.168.100.10]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Before SNAT: |L3 SIP 10.10.11.10, DIP 192.168.100.1|L4 sport 80, dport 5000|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;After SNAT: |L3 SIP 192.168.100.10, DIP 192.168.100.1|L4 sport 80, dport 5000|
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sqlインジェクション検知時の再試行戦略の最適化"&gt;SQLインジェクション検知時の再試行戦略の最適化
&lt;/h2&gt;&lt;p&gt;特定のシグネチャ（例：&lt;code&gt;UNION SELECT&lt;/code&gt;）に基づく攻撃が検知された場合、IPSは即座にセッションを遮断します。&lt;code&gt;urllib3&lt;/code&gt;側で無制限な再試行（Retry）を設定していると、遮断されたリクエストが繰り返され、IPSのログを圧迫するだけでなく、アプリケーションスレッドを不必要に占有し続けます。⚠️ 異常検知時のリトライは、指数関数的バックオフを伴う制限的な設計が推奨されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; urllib3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; urllib3.util.retry &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Retry
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# SQLi検知等による遮断を考慮した再試行ロジック&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;retry_strategy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Retry(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;total&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;status_forcelist&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;429&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;502&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;503&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;504&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;allowed_methods&lt;span style="color:#f92672"&gt;=&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;HEAD&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;GET&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;OPTIONS&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;backoff_factor&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;http &lt;span style="color:#f92672"&gt;=&lt;/span&gt; urllib3&lt;span style="color:#f92672"&gt;.&lt;/span&gt;PoolManager(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;maxsize&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;retry_strategy,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;timeout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;urllib3&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Timeout(connect&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;, read&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="snortルールによるunion-sqli検知の実装"&gt;SnortルールによるUNION SQLi検知の実装
&lt;/h2&gt;&lt;p&gt;以下のルールは、HTTP URI内の&lt;code&gt;UNION&lt;/code&gt;および&lt;code&gt;SELECT&lt;/code&gt;文字列を検知し、アラートを生成します。インラインモードでは、これを&lt;code&gt;drop&lt;/code&gt;に変更することで、アプリケーション層への到達を未然に防ぎます。🛠️ シグネチャベースの防御は、コネクション管理と密接に連携させる必要があります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# SQLインジェクション検知ルールの定義&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;alert tcp any any -&amp;amp;gt; $HOME_NET &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; &lt;span style="color:#f92672"&gt;(&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;msg: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;gt;&amp;amp;gt;&amp;amp;gt; WEB-Attack SQL injection attempt using UNION SELECT &amp;amp;lt;&amp;amp;lt;&amp;amp;lt;&amp;#34;&lt;/span&gt;; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flow:to_server,established; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content:&lt;span style="color:#e6db74"&gt;&amp;#34;UNION&amp;#34;&lt;/span&gt;; nocase; http_uri; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;content:&lt;span style="color:#e6db74"&gt;&amp;#34;SELECT&amp;#34;&lt;/span&gt;; nocase; http_uri; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pcre:&lt;span style="color:#e6db74"&gt;&amp;#34;/UNION.+SELECT/Ui&amp;#34;&lt;/span&gt;; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sid:1000002; rev:1;&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;検知時のログ出力例：
&lt;code&gt;06/30-12:33:42.766455 [&lt;b&gt;] [1:1000002:1] &amp;gt;&amp;gt;&amp;gt; WEB-Attack SQL injection attempt using UNION SELECT &amp;lt;&amp;lt;&amp;lt; [&lt;/b&gt;] [Priority: 0] {TCP} 192.168.100.1:2508 -&amp;gt; 10.10.11.10:80&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;インフラ側のIPS挙動とクライアント側の&lt;code&gt;urllib3&lt;/code&gt;コネクション管理を同期させることで、異常トラフィック発生時も安定したシステム稼働が可能となります。技術的な整合性を確保することが、マイクロサービス全体の堅牢性を高める鍵となります。&lt;/p&gt;</description></item></channel></rss>