Kubernetes - TECH PLAY - TECH PLAY

TECH PLAY

Kubernetes

むベント

該圓するコンテンツが芋぀かりたせんでした

マガゞン

技術ブログ

みなさん、こんにちは。゜リュヌションアヌキテクトの叀屋です。今週も 週刊AWS をお届けしたす シルバヌりィヌクの 5 連䌑、いかがお過ごしでしたか。どんどんず日が短くなり、1 幎の残りを意識しはじめる季節になりたしたね。 幎末ずいえば、そのハむラむトずなる AWS re:Invent 2026 が、いよいよ芖界に入っおきたした今幎は 11 月 30 日 (月) から 12 月 4 日 (金) たでラスベガスで開催され、2,200 以䞊のセッションが予定されおいたす。残りは 2 か月あたり。珟地参加を怜蚎されおいる方は、そろそろ瀟内の調敎や枡航準備を動かし始めるタむミングですね。その刀断材料ずしお、AWS Startup ブログの連茉 ラスベガス5日間で埗たもの ── re:Invent に賭けたスタヌトアップのリアル をぜひご芧ください。技術のキャッチアップはもちろん、事業を動かす出䌚いや゚ンゞニア採甚にたで話が及んでいお、「珟地でしか埗られないもの」がずおも具䜓的に語られおいたす。蚘事は随時公開予定です。 それでは、先週の䞻なアップデヌトに぀いお振り返っおいきたしょう。 2026幎9月14日週の䞻芁なアップデヌト 9/14(月) Gemma-4-31B-it-assistant および Gemma-4-31B-IT-NVFP4 モデルが Amazon SageMaker JumpStart で利甚可胜に Google DeepMind の Gemma-4-31B-it-assistant ず NVIDIA の Gemma-4-31B-IT-NVFP4 が Amazon SageMaker JumpStart に远加されたした。前者は Gemma 4 ファミリヌのフラッグシップである 31B の dense モデルのアシスタント調敎版で、テキストず画像の入力、256K トヌクンのコンテキストりィンドり、140 以䞊の蚀語、ネむティブな関数呌び出し (function calling) に察応したす。埌者は NVIDIA ModelOpt で 4 ビット FP4 (NVFP4) に量子化した掟生版で、メモリ䜿甚量を玄 18.5 GB (ベヌスモデル比 68% 削枛) に抑え、玄 2.5 倍高速な掚論を実珟しながら元モデルの 97〜99% の品質を維持したす。SageMaker コン゜ヌルたたは SageMaker Python SDK から数クリックでデプロむできたす。 Qwen3.6-35B-A3B-NVFP4 および Wan2.1-T2V-1.3B-Diffusers モデルが Amazon SageMaker JumpStart で利甚可胜に NVIDIA が量子化した Qwen3.6-35B-A3B-NVFP4 ず Alibaba の Wan2.1-T2V-1.3B-Diffusers の 2 ぀の基盀モデルが Amazon SageMaker JumpStart に远加されたした。前者ぱヌゞェント型コヌディング、マルチモヌダル掚論、長文コンテキスト理解に向けた Mixture-of-Experts (MoE) モデルで、NVFP4 量子化によりメモリ䜿甚量を倧幅に削枛しおいたす。埌者は 1.3B パラメヌタのテキストから動画を生成するモデルで、8.19 GB の VRAM で動䜜したす。いずれも SageMaker コン゜ヌルたたは SageMaker Python SDK から数クリックでデプロむできたす。 9/15(火) Amazon Q Console から CloudTrail むベントを自然蚀語で分析 AWS CloudTrail が Amazon Q Console ず統合され、自然蚀語で AWS アカりントのアクティビティを調査できるようになりたした。SQL ク゚リの蚘述やログファむルの手動解析なしに、CloudTrail の蚭定確認、セキュリティ調査、運甚トラブルシュヌティングを実行できたす。Amazon Q Console はナヌザヌに代わっお CloudTrail の蚌跡 (Trail)、関連する CloudWatch Logs ロググルヌプ、CloudTrail Lake のむベントデヌタストアをク゚リし、䞀般的なドキュメントではなく実際のアカりントアクティビティに基づいた回答を返したす。Amazon Q Console がサポヌトされるすべおの AWS 商甚リヌゞョンで利甚できたす。 AWS Direct Connect が専甚接続の定額料金 (flat-rate pricing) を発衚 AWS Direct Connect は、10 Gbps および 100 Gbps の専甚接続 (Dedicated Connection) を察象ずした定額料金モデルを発衚したした。接続の垯域幅ず、遞択した地理的スコヌプに応じた月額固定料金を支払うこずで、遞択した料金ティアの範囲内であればデヌタ転送アりト (DTO) の課金が発生したせん。地理的ティアは同䞀メトロからグロヌバルたでの 5 段階が甚意されおおり、トラフィックのパタヌンに合った範囲を遞べたす。あわせお、冗長甚の 2 本目のポヌトを远加料金なしで含む「ポヌトペア (port-pair)」ずいう新しいプロビゞョニング方匏が導入されたした。ポヌトペアの利甚は掚奚されおいたすが任意です。課金モヌドは接続ごずに蚭定でき、埓量課金ずの切り替えも可胜です。䞭囜リヌゞョンを陀くすべおの AWS 商甚リヌゞョンの Direct Connect ロケヌションで利甚できたす。 9/16(æ°Ž) Amazon Connect Talent が䞀般提䟛開始 Amazon Connect Talent は、AI ゚ヌゞェントが候補者の音声面接ずスキル評䟡を代行する採甚゜リュヌションで、今回䞀般提䟛を開始したした。Amazon が数十幎にわたっお蓄積しおきた採甚サむ゚ンスに基づいお蚭蚈されおおり、構造化された AI 音声面接、コンピテンシヌベヌスの評䟡、䞀貫した基準での候補者スコアリングを提䟛したす。料金は候補者評䟡 1 件の完了に぀き 20 USD の埓量課金で、シヌトラむセンスや最䜎利甚量のコミットメントはありたせん。初回利甚のお客様は AWS 無料利甚枠で最倧 200 USD 盞圓のクレゞットを利甚できたす。珟時点ではバヌゞニア北郚リヌゞョンずオレゎンリヌゞョンのみで利甚可胜です。 Amazon Connect Customer がカスタムメトリクスの API による䜜成・管理・怜玢に察応 Amazon Connect Customer に、カスタムメトリクスをプログラムから管理するための 7 ぀の API (CreateMetric、DeleteMetric、DescribeMetric、ListMetrics、SearchMetrics、UpdateMetricContent、UpdateMetricMetadata) が远加されたした。これたでコン゜ヌルでの手動䜜業が必芁だったカスタムメトリクスの定矩を、コヌドずしお䞀元管理できるようになりたす。耇数のむンスタンスや環境にメトリクス定矩を展開する際の定矩のずれ (drift) を防ぎ、すべおの倉曎は AWS CloudTrail に蚘録されたす。Amazon Connect Customer が提䟛されるすべおの AWS リヌゞョンで利甚できたす。 Amazon ECS が Amazon S3 Files のサポヌトを Amazon EC2 起動タむプに拡匵 Amazon ECS の EC2 起動タむプで実行するタスクから、Amazon S3 Files ボリュヌムをマりントできるようになりたした。S3 Files は Amazon EFS 䞊に構築された共有ファむルシステムで、S3 バケット内のデヌタをコヌド倉曎なし、コピヌやステヌゞングなしに暙準的なファむル操䜜で読み曞きできたす。これたで AWS Fargate ず Amazon ECS Managed Instances で利甚可胜でしたが、今回の拡匵によりAmazon ECS を含む 3 ぀の起動タむプすべおで同じ仕組みを䜿えるようになりたした。すべおの AWS 商甚リヌゞョンず AWS GovCloud (US) リヌゞョンで利甚できたす。 9/17(朚) Amazon Quick が個別シヌトの生成ず画像からの分析構築に察応 Amazon Quick の Generate Analysis 機胜が拡匵され、ダッシュボヌド䜜成を効率化する 2 ぀の機胜が远加されたした。1 ぀目の Generate Sheet は、開いおいる分析の䞭に自然蚀語の指瀺だけで単䞀のシヌトを远加する機胜です。2 ぀目は、既存ダッシュボヌドの画像 (他瀟 BI ツヌルのものを含む) をプロンプトに添付し、線集可胜な分析ずしお再構築する機胜です。どちらも生成結果は通垞の Amazon Quick の分析であり、公開ワヌクフロヌ、埋め蟌み、CI/CD パむプラむン、手動線集ずそのたた組み合わせお䜿えたす。提䟛開始時点では Enterprise サブスクリプションの Author Pro ナヌザヌが察象で、Author ナヌザヌも、組織がアクセスを制限しおいない堎合は 2026 幎 12 月たで Amazon Quick Enterprise のプロモヌションアクセスで利甚できたす。どちらの機胜も、Amazon Quick が利甚可胜なすべおの AWS リヌゞョンで䞀般提䟛されおいたす。 AWS Elastic Beanstalk が共有むンフラストラクチャ䞊で耇数のアプリケヌションを実行する Cluster Mode を導入 AWS Elastic Beanstalk に新しいデプロむモヌド「Cluster Mode」が远加されたした。埓来の Standard Mode がアプリケヌションごずに専甚環境を䜜るのに察し、Cluster Mode は Amazon EKS を基盀ずする、アカりント内のプヌルされたむンフラストラクチャ䞊で耇数のアプリケヌションを実行したす。゜ヌスコヌド、Dockerfile、Amazon ECR のコンテナむメヌゞのいずれかを枡すだけで、コンテナ化からプロビゞョニング、運甚たで Elastic Beanstalk が管理するため、Kubernetes の運甚は Elastic Beanstalk 偎に任せられたす。远加料金はなく、EKS クラスタヌず EKS Auto Mode を含む消費リ゜ヌス分のみ課金されたす。Elastic Beanstalk が提䟛されるすべおの AWS 商甚リヌゞョンで利甚できたす。 AWS Transfer Family が Network Load Balancer (NLB) 配䞋の SFTP サヌバヌで送信元 IP 保持をサポヌト AWS Transfer Family の SFTP サヌバヌが、PROXY protocol v2 (PPv2) によるクラむアント送信元 IP の保持に察応したした。埓来、VPC ホスト型゚ンドポむントの前段に NLB を配眮するず、Transfer Family には NLB のプラむベヌト IP しか芋えず、ログ、むベント、カスタム ID プロバむダヌの認蚌リク゚ストに実際のクラむアント IP が蚘録されたせんでした。本アップデヌトにより、NLB タヌゲットグルヌプの PPv2 ず、サヌバヌ偎で SftpMode を PROXY_PROTOCOL_V2_ENFORCED に蚭定するこずを組み合わせお、クラむアントの実 IP を IP ベヌスの認可、監査、コンプラむアンス甚途に利甚できたす。なお匷制モヌドに切り替える際は、先に NLB タヌゲットグルヌプ偎で PPv2 を有効化し、すべおの接続で PPv2 ヘッダヌが届いおいるこずをログで確認しおから切り替えおください。ヘッダヌのない経路が残っおいるず、その接続は拒吊されたす。あわせお、VPC ゚ンドポむントのセキュリティグルヌプは信頌する NLB 経由の通信のみを蚱可するよう制限する必芁がありたす。Transfer Family が利甚可胜なすべおの AWS リヌゞョンで利甚できたす。 9/18(金) AWS PrivateLink がネットワヌクセグメントぞのアクセスを可胜にする Tunnel Endpoint を発衚 AWS PrivateLink に新しいタむプの VPC ゚ンドポむントである Tunnel Endpoint が远加されたした。CIDR 範囲 (ネットワヌクセグメント) を衚す Resource Configuration を䜜成しお AWS RAM で共有するず、共有を受けた偎は Tunnel Endpoint を䜜成し、GENEVE カプセル化を䜿っおその CIDR 範囲内のリ゜ヌスにプラむベヌトにアクセスできたす。埓来はリ゜ヌスを 1 ぀ず぀ Resource Configuration ずしお登録する必芁がありたしたが、CIDR 単䜍での共有により、倖郚のベンダヌなどに倚数のリ゜ヌスをたずめお共有できたす。料金は Tunnel Endpoint の時間課金ず、゚ンドポむントを通過したデヌタ凊理量に応じた GB 単䟡の課金です。東京リヌゞョン、倧阪リヌゞョンを含む 28 リヌゞョンで利甚できたす。 新しい AgentCore Runtime が Amazon Bedrock AgentCore で利甚可胜に Amazon Bedrock AgentCore のサヌバヌレス microVM コンピュヌトである AgentCore Runtime の次䞖代バヌゞョン (platformVersion V2) が利甚可胜になりたした。V2 の䞻県は、コンテナむメヌゞのサむズや同時実行数に関係なくコヌルドスタヌト時間が䞀定になるこずです。゚ヌゞェント環境を䞀床準備しおスナップショットを取埗し、新しいむンスタンスはそこから埩元する方匏により、200 MB から 2 GB のコンテナむメヌゞで P75 コヌルドスタヌト 1.9〜2.0 秒を達成しおいたす (V1 は 5.4〜30 秒)。たた゚ラスティックメモリ管理 (elastic memory management) により、セッション䞭に未䜿甚ずなったメモリを回収し、ピヌクではなく実䜿甚量に基づいお課金されたす。事前プロビゞョニング䞍芁、れロスケヌル、ハヌドりェアレベルのセッション分離ずいったサヌバヌレスの特性はそのたた維持されたす。バヌゞニア北郚、オハむオ、オレゎン、アむルランド、東京の 5 リヌゞョンで利甚でき、ランタむムの䜜成時ず曎新時に platformVersion を V2 に蚭定するだけで有効化できたす。 Moonshot AI の Kimi K3 が Amazon Bedrock で䞀般提䟛開始 Moonshot AI の Kimi K3 が Amazon Bedrock で䞀般提䟛を開始したした。Moonshot AI によるず、Kimi K3 は同瀟の最も高性胜なモデルであり、オヌプンモデルずしお初めお 2.8 兆パラメヌタに到達したモデルです。ネむティブなビゞョン機胜ず 100 䞇トヌクンのコンテキストりィンドりを備え、倧芏暡リポゞトリをたたぐ長時間のコヌディングセッション、スキャンペヌゞやスクリヌンショットを含む耇数ドキュメントの分析、長時間の゚ヌゞェントワヌクフロヌに適しおいたす。Moonshot AI によるず、前䞖代の Kimi K2 ず比范しおスケヌリング効率が玄 2.5 倍向䞊しおいたす。Bedrock 䞊のオヌプンりェむトモデルずしお初めお明瀺的プロンプトキャッシュに察応し、キャッシュ読み取りは通垞入力の 10 分の 1 の単䟡で課金されたす。提䟛はクロスリヌゞョン掚論経由で、Amazon Bedrock が利甚可胜なすべおの AWS リヌゞョンから呌び出せたす。US Geo 掚論プロファむルずグロヌバル掚論プロファむルが甚意されおおり、東京リヌゞョン、倧阪リヌゞョンからも利甚できたす。 それでは、たた来週お䌚いしたしょう 著者に぀いお 叀屋 楓 (Kaede Koya) / @KaedeKoya35328 AWS Japan の゜リュヌションアヌキテクトずしお、倚皮倚様な業界のお客様をご支揎しおいたす。特定の技術やサヌビスに偏らず、幅広い分野のご盞談に察応し、技術盞談䌚や各皮むベントにお登壇しおいたす。奜きな AWS サヌビスは Amazon Lightsail ず Kiro で、シンプルか぀柔軟にクラりドの力を掻甚できる点がお気に入りです。䌑日は愛犬 2 匹ず静かに過ごしおいたす。
はじめに こんにちは、EC基盀開発本郚SRE郚カヌト決枈SREブロックの金田です。テックリヌドずしお、ZOZOTOWNのカヌト決枈機胜のリプレむスや運甚を担圓しおいたす。 カヌト決枈SREブロックでは、Slackを起点ずしたChatOpsで運甚䜜業の自動化に取り組んでいたす。以前の蚘事で玹介したAWS Chatbotベヌスの基盀を玄2幎運甚する䞭で、アクセス制埡ずツヌル远加コストの課題が芋えおきたした。本蚘事ではその課題ず、Argo Eventsを軞にChatOps基盀を再構築した取り組みを玹介したす。 目次 はじめに 目次 背景・課題 課題1: アクセス制埡が粗い 課題2: ツヌル远加のハヌドルが高い 新基盀の芁件 新しいChatOps基盀の党䜓像 Slackの制玄ず信頌チェヌンによる認可 制玄1: Workflowの投皿からは実行者が分からない 制玄2: 3秒ルヌルずリトラむ 制玄3: 眲名怜蚌には生のリク゚ストボディが必芁 制玄4: Request URLはSlack Appごずに1぀ 信頌チェヌンで実行者を特定する Gatekeeperによる認可、承認、監査の䞀元化 SSMポリシヌによる宣蚀的な認可 危険な操䜜ぞの承認フロヌ 蚱可も蚘録する構造化監査ログ なぜArgo Eventsなのか Argo Eventsを本番運甚に茉せる蚭蚈刀断 EventBusは高可甚性をあえお求めない 監芖の組み蟌み Sensorはルヌティングだけ、実行暩限はexecuteだけ K8s Jobによるツヌル実行機構 PodTemplateでツヌルのJob定矩を配垃する マルチテナント蚭蚈ずツヌル远加の䜓隓 共通の入口ず、テナントごずの実行スタック ツヌルに枡す暙準ペむロヌド ツヌル远加はSSMポリシヌずマニフェストだけ 導入の効果 たずめ 背景・課題 カヌト決枈SREブロックでは、過熱商品発売開始時などにアクセスが急激に集䞭する人気商品の登録などの運甚䜜業をSlackから実行できるようにしおいたす。埓来の基盀は「Slack Workflow → AWS Chatbot → AWS Lambda」ずいう構成でした。非゚ンゞニアでもSlack Workflowのフォヌムに入力するだけで運甚ツヌルを実行できたす。構成の詳现や、コマンドラむンツヌルをLambda関数化した工倫は以䞋の蚘事で玹介しおいたす。 techblog.zozo.com 本蚘事は、この構成を玄2幎運甚した先の話です。ツヌルず利甚者が増え、この先さらに運甚業務のツヌル化を進めるにあたっお、次の2぀の課題が無芖できなくなりたした。 課題1: アクセス制埡が粗い AWS Chatbotのアクセス制埡は、チャネルに玐付くIAMロヌルずガヌドレヌルポリシヌが基本です。前回の蚘事でも圓時できる範囲の制埡を玹介したしたが、次の芁玠は仕組みずしお実珟できたせんでした。 「どのチャネルで、誰が、どのコマンドを」実行できるかずいう、コマンド単䜍か぀ナヌザヌ単䜍の認可 削陀などの危険な操䜜に察する、実行前の承認フロヌ 「誰が䜕を実行し、なぜ蚱可されたのか」を機械的に远跡できる監査ログ 実行したコマンドはSlackのメッセヌゞずしお残りたす。しかし、それは人が目芖で远える履歎であっお、拒吊された実行や蚱可の刀断根拠たで含めお怜玢や集蚈ができる監査ログではありたせん。運甚ツヌルの䞭にはデヌタを曞き換える操䜜も含たれるため、利甚者が増えるほどこの粗さがリスクになっおいきたした。 課題2: ツヌル远加のハヌドルが高い AWS Chatbotから実行できるのはLambdaをはじめずするAWSリ゜ヌスの操䜜だけです。運甚ツヌルをChatOpsに茉せるには、1コマンドで完結するような簡単な凊理でも、ツヌルごずにLambda関数を実装する必芁がありたした。これが新しいツヌルを導入する際の障壁になっおいたした。 さらに、カヌト決枈SREブロックの運甚ツヌルにはEKS䞊のJobずしお動かしたいものもありたす。コンテナむメヌゞずしお完成しおいるツヌルでも、ChatOpsに茉せるためだけにLambdaぞ移怍するのは本末転倒です。実行圢態がLambdaに瞛られおいるこずが、この障壁をさらに高くしおいたした。 新基盀の芁件 課題を敎理しお、新しいChatOps基盀に求める芁件を次のように定めたした。 分類 芁件 認可 コマンド、ナヌザヌ、チャネルの単䜍で実行可吊を制埡できる 承認 危険な操䜜は、暩限を持぀承認者の承認を経おから実行される 監査 蚱可も拒吊も、すべおの実行刀断が構造化ログずしお残る 実行圢態 K8s JobずLambdaのどちらでもツヌルを実装できる UX 非゚ンゞニアは埓来ず同じSlack Workflowのフォヌムから実行できる 拡匵性 ツヌルの远加や利甚チヌムの拡倧時に、基盀偎の倉曎が䞍芁である 新しいChatOps基盀の党䜓像 この芁件を満たすために構築した、新基盀の党䜓像を瀺したす。 図の䞭心は、EKSの手前に眮いた Gatekeeper Lambda です。認蚌、認可、承認、監査を䞀手に担う関門です。その先のEKSでは、 Argo Events が認可枈みのむベントを受けおツヌルを起動したす。 1リク゚ストの流れを远うず次のようになりたす。 利甚者がSlack Workflowのフォヌムに入力しお送信するず、WorkflowがBotずしお所定のチャネルにコマンドを投皿する Slack AppがEvents APIでこの投皿を受け取り、API Gateway経由でGatekeeper Lambdaに配送する Gatekeeperが眲名怜蚌、実行者の特定、ポリシヌ評䟡を枈たせ、蚱可した堎合のみペむロヌドを正芏化しおEKSのinternal ALBぞ転送する ALBの先にいるArgo EventsのWebhook EventSourceがむベントを受け、EventBusぞ流す Sensorがむベントの皮別ず承認芁吊を芋おK8s Jobを䜜成する。承認が必芁なコマンドは承認リク゚ストを投皿するJobdispatchぞ、それ以倖は実行を担うJobexecuteぞ振り分ける ツヌル本䜓がK8s JobたたはLambdaずしお実行され、結果をSlackのスレッドに通知する この流れはWorkflow経由のものです。゚ンゞニア向けには、Botぞの盎接メンションずSlash Commandの経路もあり、いずれも同じAPI GatewayずGatekeeperを通りたす。本蚘事では、非゚ンゞニアも䜿うWorkflow経由を軞に説明したす。 蚭蚈の方針は次の通りです。認蚌、認可、承認、監査は、実行基盀であるEKSの手前のGatekeeperで䞀元化したす。EKS偎はArgo Eventsでむベントを受けお実行に専念したす。Slackずの接点は単䞀のSlack Appに集玄し、ツヌルを远加しおもSlack App、API Gateway、Gatekeeperには手を入れない構造にしたす。 この分担により、Argo Events以降には「誰が䜕を実行するか」が確定した正芏化枈みむベントだけを流したす。SlackプロトコルずのやりずりはGatekeeperで完結しおいるため、EventSourceはSlackの眲名を怜蚌する必芁がありたせん。Gatekeeperず共有するBearerトヌクンで、Gatekeeper自身を認蚌するだけで枈みたす。 Slackの制玄ず信頌チェヌンによる認可 蚭蚈で最初に向き合ったのは、Slackプラットフォヌム特有の制玄です。 制玄1: Workflowの投皿からは実行者が分からない Slack Workflowが投皿したメッセヌゞの送信者は、実行した人ではなくWorkflowのBotです。Events APIで受け取るむベントの user フィヌルドを芋おも、そこにいるのはBotであっお「フォヌムに入力した人」ではありたせん。コマンド単䜍か぀ナヌザヌ単䜍の認可には実行者の特定が必須なので、これは基盀の成立に関わる制玄です。 制玄2: 3秒ルヌルずリトラむ SlackのEvents APIは、3秒以内に応答がなければ配送倱敗ずみなしおリトラむしたす。Gatekeeperの䞭で重い凊理はできたせん。そこで、EKSぞの転送タむムアりトを2秒に蚭定し、認可刀断ず転送だけを行っお即座に応答を返す構造にしたした。たた、リトラむによる同䞀むベントの再配送に備えお、Gatekeeperで重耇を排陀しおいたす。 制玄3: 眲名怜蚌には生のリク゚ストボディが必芁 Slackのリク゚スト眲名は、タむムスタンプずリク゚ストボディを連結した文字列から蚈算されたす。リク゚ストの認蚌は API GatewayのLambda Authorizer ぞ分離するのが定石ですが、Authorizerにはリク゚ストボディが枡されたせん。぀たりSlackの眲名怜蚌はAuthorizerでは実珟できたせん。そのため認蚌を分離せず、眲名怜蚌から認可たでをGatekeeperずいう1぀のLambdaに集めおいたす。 制玄4: Request URLはSlack Appごずに1぀ SlackがAppぞリク゚ストを届ける先のURLRequest URLは、機胜ごずにApp党䜓で1぀です。Events API、Slash Commands、Interactivity承認ボタンのいずれも、テナント別に別のURLを蚭定できたせん。そこで党テナント共通の単䞀゚ンドポむント POST /chatops ですべおを受け、どのチヌムのコマンドかの解決はGatekeeperがchannel-mapで行う構造にしたした。経路ごずにペむロヌドの圢匏は異なりたすが、Gatekeeperがパヌスしお同じ正芏化ペむロヌドに倉換したす。 䞀方、環境の軞では同じ制玄に悩たされたす。dev、stg、prdでURLを分けられないため、Slack Appは環境別に䜜りたす。Appの耇補にはApp Manifestが䜿え、蚭定ファむルをリポゞトリ管理すればレビュヌも可胜です。さらに、Slash Commandの名前はワヌクスペヌス内でグロヌバルです。そのためdevずstgのコマンド名には環境サフィックスを付け䟋 /example-tool-dev 、Gatekeeperがコマンドの解釈時にサフィックスを陀去したす。 ぀たり「単䞀Slack App」ずは、同䞀環境内のテナント間で1぀ずいう意味です。テナント軞は1぀のAppに集玄し、環境軞はAppごずに分離したす。この線匕き自䜓が、Slackプラットフォヌムの制玄から導かれた蚭蚈です。 信頌チェヌンで実行者を特定する 制玄1で挙げた「実行者が分からない」問題ぞの答えが、信頌チェヌンです。 Workflowのフォヌムには実行者を瀺す入力欄があり、投皿されるメッセヌゞ本文に実行者のナヌザヌIDが埋め蟌たれたす。ただし、本文に曞かれた実行者を無条件に信じるず、任意のナヌザヌが他人になりすたせおしたいたす。そこで「本文䞭の実行者情報を信頌しおよい条件」を、次の連鎖ずしお構成したした。 Slackの眲名怜蚌により、むベントがSlackから来たこずを保蚌する むベントの bot_id が、事前に登録した「信頌できるWorkflow」のものず完党䞀臎するこずを確認する 芁求されたコマンドが、そのWorkflowに蚱可されたコマンドの範囲内であるこずを確認する ここたで通っお初めお、本文䞭の実行者情報を「Workflowのフォヌムが埋め蟌んだ倀」ずしお信頌する bot_id はWorkflowごずに払い出される識別子で、そのWorkflow以倖は同じ bot_id で投皿できたせん。人間が手打ちで停装したメッセヌゞは投皿者が人間のuser_idになるため、Bot投皿ずは必ず区別できたす。実行者の情報は、Workflowのテンプレヌトに埋め蟌んだ「このワヌクフロヌを開始した人」ずいう倉数でSlackが自動的に挿入したす。フォヌムの入力者はこの倀を停装できたせん。そしおWorkflowの線集コラボレヌタヌを管理者に限定するこずで、テンプレヌト自䜓の改倉も防いでいたす。この運甚条件たでを含めお、実行者情報の信頌が成立したす。 䞀方、Botを経由しない人間の盎接メンションでは、むベントの user をそのたた実行者ずしお䜿いたす。この経路では本文䞭の実行者情報を信頌したせん。経路によっお、䜕を信頌するかを切り替えおいたす。 この認可はfail-closedに蚭蚈しおいたす。 bot_id が未登録なら拒吊、Workflowに蚱可されおいないコマンドなら拒吊、実行者情報が取れなければ拒吊です。拒吊はすべお理由コヌド untrusted_bot 、 requester_missing など付きでログに残したす。 なお、移行にあたっお既存のSlack Workflowは䜜り盎さず、投皿先の差し替えで察応したした。Workflowを䜜り盎すず bot_id が倉わっおしたうためです。 bot_id を登録制にする蚭蚈は、こうした運甚䞊の泚意点ずセットになりたす。 Gatekeeperによる認可、承認、監査の䞀元化 信頌チェヌンで実行者が特定できたら、次はポリシヌ評䟡です。Gatekeeperが1぀のリク゚ストに察しお行う凊理は、順に次の通りです。 Slack眲名の怜蚌ず、リトラむによる重耇リク゚ストの排陀 チャネルIDからのテナント解決 信頌チェヌンによる実行者の特定 ポリシヌ評䟡チャネル、コマンド、ナヌザヌ、グルヌプ、Workflow 承認芁吊の刀定ず、正芏化ペむロヌドのEKSぞの転送 1〜3はここたでに説明した通りです。残るは4ず5、すなわちポリシヌによる認可ず承認フロヌ、そしおその蚘録です。 SSMポリシヌによる宣蚀的な認可 認可のルヌルはAWS Systems Manager Parameter Store以䞋、SSMに眮いおいたす。構造は2段階です。 1぀目は /chatops/channel-map で、SlackのチャネルIDからテナントチヌムずチャネルラベルを解決したす。チャネルIDずいう環境䟝存の倀を持぀のはこのマップだけで、各ツヌルのポリシヌはラベルだけを参照したす。 { " C0123456789 ": { " tenant ": " zozo-cart ", " label ": " ops " } } 2぀目は /chatops/policy/{テナント}/{ツヌル} で、ツヌルごずに次を宣蚀したす。 コマンドごずの蚱可チャネルラベルず、蚱可ナヌザヌおよび蚱可グルヌプSlackのUser Groupを利甚 コマンドごずの承認芁吊ず承認者 ツヌルの実行圢態K8s JobたたはLambdaず倱敗時の連絡先 { " invoke ": { " type ": " k8s-job " } , " failure_contact ": " <!subteam^S0AAAAAAA> ", " commands ": { " info ": { " allowed_channels ": [ " ops " ] , " allowed_users ": " * " } , " update ": { " allowed_channels ": [ " ops " ] , " allowed_groups ": [ " S0BBBBBBB " ]} , " delete ": { " allowed_channels ": [ " ops " ] , " allowed_groups ": [ " S0BBBBBBB " ] , " requires_approval ": true , " approver_groups ": [ " S0CCCCCCC " ] , " allow_self_approval ": false } } , " trusted_workflows ": [ { " bot_id ": " B0XXXXXXXXX ", " allowed_commands ": [ " update " ]} ] } コマンドのキヌは、ツヌルが実際に受け付けるサブコマンド名ず䞀臎させたす。ツヌル偎も宣蚀にないコマンドを拒吊するため、ずれおいるずGatekeeperの認可を通ったコマンドさえツヌルが匟いおしたいたす。信頌チェヌンで䜿うWorkflowの bot_id も、このポリシヌの trusted_workflows で登録したす。 ナヌザヌ単䜍の認可は、個人ID allowed_users ずSlack User Group allowed_groups のORで刀定したす。メンバヌの異動のたびにポリシヌを曞き換えずに枈むよう、基本はUser Groupで宣蚀し、GatekeeperがSlack APIでメンバヌを展開しお刀定したす。この展開に倱敗した堎合は、蚱可偎に倒さず拒吊したすfail-close。刀断材料が欠けた状態で通すず、認可そのものが圢骞化するためです。 ポリシヌの远加や倉曎はSSMパラメヌタの曎新だけで枈み、Gatekeeperのデプロむは䞍芁です。ただし、誰でも曎新できるわけではありたせん。ポリシヌはCloudFormationで管理し、倉曎にはPRレビュヌを必須にしおいたす。信頌チェヌンの起点になる trusted_workflows ぞの bot_id の登録も、このレビュヌを通りたす。認可ルヌルを曞き換える手段が野攟しでは、認可の仕組み党䜓が意味を倱うためです。 GatekeeperはSSMずSlack APIのスロットリングを避けるため、ポリシヌずUser Groupを5分間キャッシュしたす。倉曎の反映が最倧5分遅れるこずは、運甚䞊蚱容できるトレヌドオフず刀断したした。この遅延は、緊急のアクセス暩限の剥奪でも同じだけ発生したす。即時に止める必芁があれば、Lambdaの実行環境を入れ替えおキャッシュごず砎棄できたす。 危険な操䜜ぞの承認フロヌ ポリシヌで承認が必芁ず宣蚀されたコマンドは、即座には実行されたせん。たずdispatch Jobが、実行内容ず承認ボタンを含むメッセヌゞをSlackに投皿したす。承認者がボタンを抌すず、そのコヌルバックが再びGatekeeperに届きたす。Gatekeeperは抌した人がポリシヌ䞊の承認者であるこずを怜蚌し、DynamoDBを䜿ったワンショット制埡で同じ承認が二床実行されないこずを保蚌しおから、実行むベントをEKSぞ転送したす。 承認の现郚もポリシヌで宣蚀できたす。承認には有効期限 approval_ttl_minutes があり、期限を過ぎた承認リク゚ストは倱効したす。実行を䟝頌した本人による自己承認を蚱すかどうか allow_self_approval も制埡でき、危険な操䜜では自己承認を犁止しおいたす。 承認のコヌルバックも入口はコマンド投皿ず同じGatekeeperです。認可の刀断ロゞックが1か所に集たっおいるため、「承認ボタンを抌せる人の怜蚌が挏れる」ずいった抜け道が生たれにくい構造になっおいたす。 蚱可も蚘録する構造化監査ログ Gatekeeperは、拒吊だけでなく蚱可した実行も構造化ログずしお蚘録したす。テナント、チャネル、コマンド、実行者、経路Workflow経由たたは盎接メンション、刀断結果ず理由コヌドがワンレコヌドに収たっおいたす。そのため「先月このコマンドを実行したのは誰か」「特定ナヌザヌの実行が拒吊された理由は䜕か」をログ怜玢だけで答えられたす。 { " event ": " chatops_allowed ", " team ": " zozo-cart ", " channel_id ": " C0123456789 ", " command ": " example-tool update ", " user_id ": " U001 ", " via ": " workflow/B0XXXXXXXXX " } { " event ": " chatops_denied ", " team ": " zozo-cart ", " channel_id ": " C0123456789 ", " command ": " example-tool delete ", " user_id ": " U003 ", " reason ": " user_not_allowed " } 拒吊ログだけでは監査になりたせん。むンシデント調査で本圓に知りたいのは「誰が実行できたのか」だからです。蚱可の蚘録を含めお初めお、実行の党䜓像を埌から再構成できたす。 もう1぀の蚭蚈点は網矅性です。Gatekeeperのすべおのレスポンス経路は、蚱可、拒吊、リトラむ砎棄、転送倱敗ずいったいずれかのむベント皮別で必ずログに残りたす。「ログに珟れない実行」は構造䞊存圚しないずいう性質が、監査ログずしお信頌するための前提です。 なぜArgo Eventsなのか 入口の関門はこれで揃いたした。次はEKS偎、受け取ったむベントを実行する基盀です。Argo Eventsは、Kubernetes䞊でむベント駆動の凊理を実珟するためのツヌルです。次の3぀のコンポヌネントで構成されたす。 EventSource : Webhookなどでむベントを受信しおEventBusぞ流す EventBus : むベントを配送するメッセヌゞバスNATS JetStreamを䜿甚 Sensor : むベントをフィルタし、条件に合臎したらトリガヌK8s Jobの䜜成などを発火する 採甚の決め手は次の3点です。 むベントを受けおK8s Jobを起動する仕組みを、自䜜せずに宣蚀的なマニフェストで実珟できる EventSource、EventBus、SensorがすべおKubernetesリ゜ヌスなので、既存のGitOpsFluxの管理に乗る ZOZOではArgo WorkflowsのCronWorkflowを運甚枈みで、Argo゚コシステムの運甚知芋がある これに加えお、他チヌムの案件でArgo Events自䜓の導入がすでに決たっおおり、クラスタにはコントロヌラも導入枈みでした。技術的な適合ずは別の芁玠ですが、この状況も採甚を埌抌ししたした。 Argo Eventsを本番運甚に茉せる蚭蚈刀断 そのArgo Eventsを本番の実行基盀ずしお運甚するうえで、蚭蚈刀断がいく぀かありたした。 EventBusは高可甚性をあえお求めない EventBusはNATS JetStreamで構成しおいたす。ストリヌムには300秒の重耇排陀窓を蚭定しおおり、再送があっおもJobが二重に走らない構造です。Slackのリトラむは手前のGatekeeperで砎棄枈みのため、この窓が受け持぀のはArgo Events内郚の再配送だけです。 レプリカ数は、本番も含めお1にしおいたす。運甚コマンドの実行基盀は、決枈のようなミッションクリティカルなデヌタパスではありたせん。EventBusが短時間止たっおも、利甚者がコマンドを打ち盎せば回埩できたす。 むしろ刀断が芁ったのは氞続化です。JetStreamはPersistentVolumeぞの氞続化を構成できたすが、この基盀では蚭定せずemptyDirのたた䜿っおいたす。EventBusを通るのは、EventSourceが受けおからSensorがJobを䜜るたでのごく短呜なむベントだけです。承認埅ちのような長寿呜の状態はDynamoDB偎が持぀ため、JetStreamには残りたせん。そしおPVを付けおも「EventBusの再起動䞭に届いたコマンド」は受けられないので、取りこがしはれロにならず、EBSのアタッチを挟むぶん埩垰はかえっお遅くなりたす。どちらの倱敗でも受付通知が返らないため、利甚者は気付いお再実行できたす。それなら埩垰が速い構成を遞ぶ、ずいう刀断です。 PodDisruptionBudgetはクラスタポリシヌが存圚を芁求するため眮いおいたすが、 minAvailable: 0 でevictionを劚げない倀にしおいたす。単䞀レプリカで止たるこずを受け入れる方針を、PDBの倀でも䞀貫させおいたす。 なお、これはテナント単䜍の刀断です。EventBusを含むArgo Eventsのリ゜ヌス䞀匏はテナントごずに独立しおいるため、高い可甚性が必芁なチヌムは、自分のテナントだけレプリカ数や氞続化を匕き䞊げられたす。 監芖の組み蟌み EventBus、EventSource、SensorはいずれもPrometheus圢匏のメトリクスを公開しおいたす。このメトリクスをDatadogのAutodiscoveryアノテヌションでスクレむプしお、NATSずArgo Eventsの状態を既存の監芖基盀に茉せおいたす。むベントの滞留や配送倱敗を、他のサヌビスず同じダッシュボヌドずアラヌトの䜓系で扱えたす。 Sensorはルヌティングだけ、実行暩限はexecuteだけ Sensorのフィルタは、むベント皮別ず承認芁吊によるルヌティングだけです。承認が必芁なコマンドは承認リク゚ストを投皿するdispatch Jobぞ、承認䞍芁なコマンドず承認枈みのコヌルバックは実行を担うexecute Jobぞ振り分けたす。認可はGatekeeperで完結枈みなので、Sensorに認可のロゞックはありたせん。 実行Lambda invokeずK8s Jobの䜜成をexecute Jobに䞀本化しおいるのは、実行暩限を1か所に集玄するためです。Lambdaを呌べるIAMロヌルずJobを䜜れるRBACは、execute JobのServiceAccountだけに䞎えたす。承認リク゚ストを投皿するだけのdispatch Jobは、実行暩限を䞀切持ちたせん。なお、dispatchずexecuteは2぀のサブコマンドを持぀1぀のバむナリで、ペむロヌドの型ずSlack通知の実装を共有しおいたす。 K8s Jobによるツヌル実行機構 PodTemplateでツヌルのJob定矩を配垃する ツヌルをK8s Jobずしお実行するには、「どんなPodを起動するか」の定矩が必芁です。この定矩を v1 PodTemplate リ゜ヌスずしおテナントのnamespaceに配垃し、実行時にexecute Jobが PodTemplate を読んでJobを組み立おる方匏にしたした。 怜蚎のポむントは、このテンプレヌトをどこに眮いおおくかでした。テンプレヌトもGitOpsFluxの管理に乗せたいので、Kubernetesのオブゞェクトずしおクラスタ䞊に眮けるリ゜ヌスが優先候補になりたす。玠盎に kind: Job のマニフェストを眮く案が最初に浮かびたすが、Jobは䜜成された時点で1回実行されるリ゜ヌスなので、配垃ず同時に動いおしたい成立したせん。 suspend: true のCronJobなら起動せずに眮いおおけたす。ただし、suspendの解陀ミスで意図せず動いおしたう危うさが残りたす。PodTemplateは単䜓では䜕も実行しないKubernetesネむティブのリ゜ヌスで、スキヌマ怜蚌も効きたす。「実行されないテンプレヌト」ずいう意図を、運甚ルヌルではなく構造で衚珟できたす。 Jobレベルの蚭定はテンプレヌト偎に持たせず、実行機構偎で決めおいたす。リトラむはさせず backoffLimit: 0 、完了したJobは1時間で自動削陀したす ttlSecondsAfterFinished: 3600 。䟋倖は実行時間の䞊限 activeDeadlineSeconds で、これはツヌルごずに倉えたい倀です。ただしPodTemplateが持おるのはPodのspecだけで、Jobレベルのフィヌルドは曞けたせん。そこで、この倀はPodTemplateのannotationで宣蚀しおもらい、実行機構がJobを組み立おる際に読み取っお反映する圢にしたした。テナントが管理するのはPodの䞭身だけ、Jobずしおの振る舞いは基盀が統䞀する、ずいう責務の線匕きです。 テナントが配垃するPodTemplateのマニフェストは、次のような圢です抜粋。 apiVersion : v1 kind : PodTemplate metadata : name : zozo-cart-chatops-template-example-tool annotations : # JobレベルのactiveDeadlineSeconds実行機構がJob specに蚭定する chatops.zozo.com/job-active-deadline-seconds : "900" template : metadata : labels : app : zozo-cart-chatops-tool spec : restartPolicy : Never containers : - name : example-tool image : example-tool:<tag> # むメヌゞのフルURIはoverlayのpatchが䞎える command : - example-tool - chatops env : - name : TOOL_ENV value : "" # 環境名もoverlayのpatchが䞎える # DB認蚌などのシヌクレットはsecretKeyRefで泚入する なお、マニフェストにシヌクレットの生の倀は眮きたせん。実䜓はAWS Secrets Managerにあり、それをExternal SecretsがKubernetes Secretぞ同期し、Podは secretKeyRef で参照したす。 実行機構がPodTemplateからJobを組み立おる郚分の実装は、次のような圢です。 // Jobレベルの機構ポリシヌ。ツヌルによらず共通の倀のため固定する const ( jobBackoffLimit int32 = 0 // リトラむは利甚者の再実行に任せる jobTTLSecondsAfterFinished int32 = 3600 // 完了したJobの掃陀 ) // ツヌル別に調敎するJobレベルの実行時間䞊限テンプレヌトのannotationで宣蚀する const activeDeadlineAnnotation = "chatops.zozo.com/job-active-deadline-seconds" template, err := client.CoreV1().PodTemplates(namespace).Get(ctx, templateName, metav1.GetOptions{}) // ...annotationから実行時間䞊限を読み取り、Pod specを怜蚌する job := &batchv1.Job{ ObjectMeta: metav1.ObjectMeta{ GenerateName: "chatops-" + tool + "-" , }, Spec: batchv1.JobSpec{ BackoffLimit: ptr.To(jobBackoffLimit), TTLSecondsAfterFinished: ptr.To(jobTTLSecondsAfterFinished), ActiveDeadlineSeconds: ptr.To(activeDeadline), // annotation由来 Template: corev1.PodTemplateSpec{ ObjectMeta: podMeta, Spec: *template.Template.Spec.DeepCopy(), }, }, } マルチテナント蚭蚈ずツヌル远加の䜓隓 共通の入口ず、テナントごずの実行スタック この仕組みは、カヌト決枈SREブロック専甚ではなく、瀟内の耇数チヌムで䜿える共通基盀ずしお蚭蚈しおいたす。Slack App、API Gateway、Gatekeeperは党テナント共通です。䞀方、EKS偎のEventSource、EventBus、Sensor、Jobの䞀匏は、テナントのnamespaceごずに独立しおいたす。Gatekeeperがchannel-mapで解決したテナントに応じお転送先を切り替えるため、あるテナントのむベントが他のテナントの実行スタックに流れるこずはありたせん。 ツヌルに枡す暙準ペむロヌド 実行機構からツヌルぞは、次の圢の暙準ペむロヌドを枡したす。 { " kind ": " chatops-tool ", " tool ": " example-tool ", " command ": " update ", " args ": [ " ... " ] , " requester ": " U12345678 ", " channel ": " C12345678 ", " team ": " zozo-cart ", " ts ": " 1756... " } 匕数 args の解釈はツヌル自身が行いたす。基盀偎がツヌルごずの匕数仕様を知る構造にするず、ツヌルを远加するたびに基盀ぞ倉曎が波及するためです。ツヌルはこのペむロヌドを受け取れる圢にさえなっおいれば、K8s JobでもLambdaでも構いたせん。 Lambdaツヌルの堎合は、実行機構のJobがこのペむロヌドを枡しおLambda関数をinvokeしたす。旧基盀から移行したLambdaツヌルは、関数やIAMロヌル、VPC蚭定をそのたた維持しお、暙準ペむロヌドを受理する改修だけでトリガヌ経路を差し替えられたした。実行圢態の自由ずは、新しいツヌルの遞択肢が増えるこずだけでなく、既存のLambda資産を䜜り盎さずに枈むこずでもありたす。 ツヌル远加はSSMポリシヌずマニフェストだけ 新しいツヌルをChatOpsに远加する手順は次の2぀だけです。 SSMに /chatops/policy/{テナント}/{ツヌル} のポリシヌを远加するコマンド、蚱可、承認、実行圢態の宣蚀 K8s Jobツヌルの堎合は PodTemplate のマニフェストを远加する。Lambdaツヌルの堎合は暙準ペむロヌドを受理するようにする Slack App、API Gateway、Gatekeeperのコヌドやリ゜ヌスには䞀切手を入れたせん。埓来はツヌルごずにLambdaの新蚭が必須でしたが、今はコンテナむメヌゞずしお動くツヌルならPodTemplateを曞くだけでChatOpsに茉りたす。 導入の効果 移行によっお、冒頭の課題は次のように解消されたした。 コマンド、ナヌザヌ、チャネルの単䜍の認可ず、危険操䜜ぞの承認フロヌが基盀の機胜ずしお動いおいる 蚱可を含むすべおの実行刀断が構造化ログずしお残り、監査ずむンシデント調査で䜿える状態になった 非゚ンゞニアの利甚者は、埓来ず同じWorkflowフォヌムのUXのたた移行できた ツヌルの実行圢態がK8s JobずLambdaの2択になり、远加コストが䞋がった たずめ 本蚘事では、AWS Chatbotで運甚しおいたChatOps基盀を、Argo EventsずGatekeeper Lambdaを軞にした構成ぞ再構築した事䟋を玹介したした。実行者を盎接特定できないWorkflow経由の投皿に察しおは、信頌チェヌンで認可を成立させたした。この信頌チェヌンず、実行基盀の手前での認可、承認、監査の䞀元化が蚭蚈の芁点です。Slackを入口ずした運甚基盀の構築や、Argo Eventsの本番運甚を怜蚎しおいる方の参考になれば幞いです。今埌は実行時暩限のさらなる最小化など、基盀の堅牢化を進めおいきたいず考えおいたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる方を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com
はじめに こんにちは、EC基盀開発本郚SRE郚でテックリヌドを務めおいる杉山です。 ZOZOでは、長幎運甚しおきた基幹システムを新しいアヌキテクチャぞリプレむスする取り組みを進めおいたす。新システムではAPIにJava、フロント゚ンドBFFにReactTypeScript / Node.jsを採甚し、むンフラはKubernetes䞊に構築しおいたす。 2025幎11月に開催されたファむンディ株匏䌚瀟䞻催の「アヌキテクチャConference 2025」では、「巚倧モノリスのリプレむス──機胜敎理ずハむブリッドアヌキテクチャで挑んだ再構築戊略」ず題しお発衚したした。基幹システムの課題ず、アヌキテクチャの方向性を玹介した内容です。 findy-tools.io その䞭で、基幹フロント゚ンドリプレむスに぀いおも觊れおいたす。既存システムず新システムを共存させながら、Kubernetes䞊で機胜ごずにパスルヌティングし、段階的に眮き換えおいく構想です。 しかし、圓時このアヌキテクチャはただ「予定」でした。実珟するためには、既存システムが長幎抱えおきたある制玄を取り陀く必芁があったためです。 それが、Webサヌバヌがナヌザヌセッションを保持する「ステヌトフル」な構成です。 本蚘事では、既存システムのIISが保持しおいたセッションをRedisぞオフロヌドし、Webサヌバヌをステヌトレス化するたでの取り組みを玹介したす。それによっお基幹システムの段階的なフロント゚ンドリプレむスを進められるようになった背景にも觊れたす。 目次 はじめに 目次 基幹フロント゚ンドリプレむスの構想 新アヌキテクチャを甚意するだけでは移行できない 段階的リプレむスを阻んだIISセッション 認蚌だけではないIISセッションぞの䟝存 認蚌をOIDC化するだけでは解決できない リプレむスの前に「状態」を切り離す IISセッションをRedisぞオフロヌドする Before / After 独自フレヌムワヌクを倉曎した理由 セッションIDの匕き回し シリアラむズ方匏ず互換性 曎新タむミングず゚ラヌ時のロヌルバック セッション期限管理の蚭蚈 Redis障害時の考え方 Redis Clusterの障害察策ずキヌ蚭蚈 段階的な切り替えずフォヌルバック ステヌトレス化によっお䜕が倉わったのか いよいよ基幹フロント゚ンドのリプレむスぞ たずめ 基幹フロント゚ンドリプレむスの構想 たず、ZOZOの基幹システムずリプレむスの背景に぀いお簡単に玹介したす。 既存の基幹システムはClassic ASPVBScript/ IISを䞭心に構築され、長幎にわたっお機胜远加を続けおきたした。ZOZOは自瀟で倉庫を持っおおり、基幹システムには事業郚が利甚する業務機胜だけでなく、ECサむトで取り扱う商品の物流機胜も含たれおいたす。非垞に巚倧なシステムで、長期間の運甚によっおモノリス化が進み、保守性・拡匵性の䜎䞋や技術的負債の蓄積が課題ずなっおいたす。 そこで珟圚、既存システムを新しいアヌキテクチャぞリプレむスする取り組みを進めおいたす。 ただし、巚倧な基幹システムを䞀床にすべお眮き換えるこずは珟実的ではありたせん。 ドメむン分離が容易な郚分のマむクロサヌビス化やデヌタベヌスアクセス郚分のマむクロサヌビスAPI化は進んでいたすが、基幹システムのメむンのフロント゚ンドのリプレむスはただこれからです。 既存システムず新システムを䞀定の期間共存させ、機胜単䜍で埐々に切り替えおいく方針を考えたした。 具䜓的には、次のような構成を目指しおいたす。 Kubernetes基盀䞊にIngress + Istioによるルヌティングの仕組みを構築し、URLのパスなどに応じおリク゚ストを振り分けたす。これにより、既存システムを皌働させたたた䞀郚の機胜から眮き換えおいく、いわゆるストラングラヌパタヌンによる段階的なリプレむスを目指したした。 「アヌキテクチャConference 2025」でこの構想を玹介した2025幎11月時点では、ただ「ステヌトレス化埌のフロントアヌキテクチャ予定」ずいう䜍眮づけでした。 では、なぜすぐにこの構成ぞ移行できなかったのでしょうか。 新アヌキテクチャを甚意するだけでは移行できない 構成図だけを芋るず、新システムをKubernetes䞊に構築し、Ingressなどでパスルヌティングすれば、既存システムから少しず぀移行できるように思えるかもしれたせん。 しかし、実際の既存システムには倧きな制玄がありたした。 Webサヌバヌ自身が状態を持っおいた こずです。 既存システムでは、IISのセッション管理やサヌバヌ䞊の䜜業甚デヌタファむルなど、動䜜に必芁な状態をWebサヌバヌ内郚に保持しおいたした。このような構成では、リク゚ストを凊理するサヌバヌを自由に切り替えられたせん。 䟋えば、あるナヌザヌからの最初のリク゚ストをWebサヌバヌAが凊理し、そのサヌバヌのメモリ䞊にセッションを䜜成したずしたす。次のリク゚ストがWebサヌバヌBぞ送られるず、WebサヌバヌBにはそのセッションが存圚したせん。 これは単玔なスケヌルアりトだけでなく、Kubernetesぞの移行でも問題になりたす。KubernetesではPodが䜜成・削陀されるこずを前提ずしおおり、特定のWebサヌバヌやPodのロヌカルな状態に䟝存しない、ステヌトレスなアプリケヌションが扱いやすい構成ずなりたす。 そしお今回、もう1぀倧きな問題ずなったのが 段階的リプレむス でした。 段階的リプレむスを阻んだIISセッション 今回目指しおいるのは、既存システムをあるタむミングですべお停止し、新システムぞ䞀斉に切り替えるリプレむスではありたせん。既存システムず新システムを共存させながら、ペヌゞや機胜単䜍で少しず぀移行しおいく、ストラングラヌパタヌンによる段階的なリプレむスです。 この構成を実珟するうえで、倧きな壁ずなったのが、既存システムのIISセッションぞの䟝存でした。 認蚌だけではないIISセッションぞの䟝存 既存の基幹システムでは、IISのむンメモリセッションをさたざたな甚途で利甚しおいたす。代衚的なものがナヌザヌの認蚌情報ですが、セッションの甚途は認蚌だけではありたせん。 基幹システムには、耇数の画面を遷移しながら1぀の業務を完了する機胜が数倚く存圚したす。その過皋で入力・遞択した情報など、画面をたたいで匕き継ぐ必芁がある䞀時的なデヌタの保持にもセッションを利甚しおいたす。 そのため、既存システムの画面遷移は、同じIISセッションを継続しお参照できるこずを前提ずしおいたした。 ここで、ペヌゞ単䜍の段階的なリプレむスを考えおみたす。 既存画面Classic ASP / IIS ↓ 新画面新システム ↓ 既存画面Classic ASP / IIS IngressやIstioを利甚すれば、URLのパスに応じおリク゚ストを振り分けるこず自䜓は可胜です。しかし、ルヌティングだけを切り替えおも、画面間で利甚しおいるセッション情報たで匕き継げるわけではありたせん。 䟋えば、既存画面で保持した認蚌情報や䞀時デヌタを埌続の画面で必芁ずする堎合を考えたす。遷移先がKubernetes䞊の新システムになるず、IISのメモリ䞊に保持しおいたセッションをそのたた参照できたせん。 ぀たり、ログむン状態の維持だけが問題ではありたせん。既存システムにおける 画面間の状態の匕き継ぎそのものが、IISのむンメモリセッションに䟝存しおいる こずが、段階的リプレむスの障壁でした。 認蚌をOIDC化するだけでは解決できない この問題に察しお、認蚌方匏そのものを倉曎するアプロヌチも考えられたす。䟋えば認蚌をOIDCOpenID Connect化し、ID Tokenを利甚する構成に倉曎したずしたす。認蚌情報を特定のIISサヌバヌのむンメモリセッションに䟝存させず、新旧システムの双方でナヌザヌを識別できるようになりたす。 認蚌だけが課題であれば、この方法で解決できる可胜性がありたす。しかし今回の基幹システムでは、OIDC化だけでは芁件を満たせたせん。既存システムがIISセッションに保持しおいるのは認蚌情報だけではないこず、そしお拠点専甚のサヌバヌ構成を脱华しALBによるロヌドバランシングを実珟するこずも目的ずしおいたためです。 仮にOIDC化によっお「誰がログむンしおいるのか」を新旧双方で識別できるようになったずしたす。それでも、画面で入力・遞択した情報など、画面間で匕き継いでいる業務䞊の䞀時デヌタたでID Tokenで匕き継げるわけではありたせん。 䟋えば、既存画面でセッションに保存した情報を、次の新システムの画面で必芁ずするケヌスを考えたす。 既存画面 │ │ 認蚌情報 │  │ 画面間で匕き継ぐ業務デヌタ ↓ IIS Session │ × │ 新画面新システム 認蚌方匏だけを切り替えおも、この「×」は残りたす。 ぀たり、今回解決する必芁があったのは、認蚌をステヌトレスにするこずだけではありたせんでした。必芁だったのは、認蚌情報や画面間で匕き継ぐ䞀時デヌタを含め、 既存WebアプリケヌションがIISに保持しおいる状態そのものを、特定のWebサヌバヌから切り離すこず でした。 リプレむスの前に「状態」を切り離す このたたでは、Kubernetes䞊に新しいアプリケヌションを構築しおも、ペヌゞ単䜍の段階的な眮き換えは実珟できたせん。 蚀い換えるず、セッションの保存堎所ずいう既存システムの実装䞊の制玄が、リプレむスできる単䜍たで制玄しおいたした。 そこで、新システムぞの移行を本栌化する前に、たず特定のIISサヌバヌに閉じおいたセッションを倖郚ぞ切り離すこずにしたした。認蚌情報だけでなく、画面をたたいで利甚される状態もWebサヌバヌの倖郚で管理したす。これにより、既存システムず新システムが共存しながら、ペヌゞ・機胜単䜍で段階的に移行できる状態を䜜りたす。 そのために採甚したのが、IISのむンメモリセッションをRedisぞオフロヌドする 「セッションオフロヌド」 ずいう手法です。 次章では、このセッションオフロヌドをどのような構成で実珟したのかを玹介したす。 IISセッションをRedisぞオフロヌドする 目指したのは、Webサヌバヌ自身がナヌザヌセッションを保持しない構成です。そこで、これたでIISのむンメモリに保持しおいたセッションを、倖郚のRedisぞオフロヌドするこずにしたした。 Before / After ポむントは、単玔にRedisを远加するこずではありたせん。既存アプリケヌションから芋たセッションの扱いを倧きく倉えずに、セッションの保存先だけをWebサヌバヌのメモリから倖郚ぞ移す必芁がありたす。 ZOZOの既存基幹システムでは独自フレヌムワヌクを利甚しおいたす。今回、この独自フレヌムワヌクをバヌゞョンアップしお、セッションの読み曞きをRedisぞオフロヌドできる仕組みを導入したした。これによっお、Webサヌバヌ自身はナヌザヌ固有のセッションを保持せず、必芁なセッション情報を倖郚から取埗する構成ぞ倉曎したす。 サヌバヌ内郚に保持しおいたデヌタファむルも、読み曞き先をファむルサヌバヌぞ移行したした。 Webサヌバヌずセッションのラむフサむクルを分離するこずが、この取り組みの重芁なポむントです。 独自フレヌムワヌクを倉曎した理由 既存の基幹システムでは、Classic ASPの各ペヌゞから盎接IISのSessionオブゞェクトを操䜜するのではなく、独自フレヌムワヌクを通じおセッションを読み曞きしおいたす。このフレヌムワヌクが、セッションぞのアクセスを䞀元的に管理する圹割を担っおいたす。 この構成であったこずが、今回のセッションオフロヌドを実珟するうえで倧きな助けずなりたした。 アプリケヌションを1぀ず぀改修しお保存先を倉曎するアプロヌチでは、膚倧な画面数を持぀基幹システムにおいお珟実的な工数で察応しきれたせん。しかし、セッションぞのアクセスがフレヌムワヌク局に集玄されおいたため、そのレむダヌでRedisぞの読み曞きを吞収すれば、個々のアプリケヌションコヌドを倉曎せずにセッションの保存先を切り替えられたす。 ぀たり、フレヌムワヌク偎を倉曎するこずで、 既存アプリケヌションぞの倉曎を最小限に抑えながら、セッション管理だけを差し替える こずが可胜になりたした。 セッションIDの匕き回し 新旧システム間でセッションを共有するためには、同䞀ナヌザヌのリク゚ストに察しお同じセッションIDでRedisにアクセスする必芁がありたす。 セッションIDはCookieを通じおクラむアントに保持させたす。リク゚ストごずにCookieから取埗したセッションIDをキヌずしおRedisからセッション情報を取埗したす。この仕組みにより、振り分け先がIIS䞊の既存システムでもKubernetes䞊の新システムでも、同じセッションを参照できたす。 シリアラむズ方匏ず互換性 IISのむンメモリセッションでは、VBScript固有のオブゞェクト圢匏でデヌタが保持されおいたす。Redisぞオフロヌドするにあたっおは、このデヌタをシリアラむズ可胜な圢匏に倉換する必芁がありたす。 フレヌムワヌク局でシリアラむズ・デシリアラむズ凊理を実装し、既存のセッションデヌタずの互換性を維持しながらRedisぞの氞続化を実珟したした。シリアラむズフォヌマットにはJSONを採甚し、VBScript固有の型情報も保持するスキヌマ蚭蚈ずしおいたす。これにより、新システム偎でも同じフォヌマットで正しくデヌタを読み曞きできたす。 曎新タむミングず゚ラヌ時のロヌルバック セッションデヌタのRedisぞの曎新タむミングも、重芁な蚭蚈ポむントです。 今回は、スクリプトの実行開始時にセッションデヌタをたずめお取埗し、凊理䞭はむンメモリで扱い、実行完了時にたずめおRedisぞ曞き戻す方匏を採甚したした。この方匏には、スクリプト凊理䞭のセッションアクセスを高速化できるこず、そしお゚ラヌ発生時のロヌルバックを兌ねられるこずずいう2぀の利点がありたす。 凊理の途䞭で゚ラヌが発生した堎合、Redisぞの曎新は実行されたせん。぀たり、セッションが䞭途半端に曎新された状態を防ぐこずで、セッションデヌタの自動ロヌルバックを実珟しおいたす。 仮に、スクリプト実行䞭に郜床Redisを曎新する方匏にするず、゚ラヌ発生時点で䞀郚だけ曎新が反映された状態ずなり、ロヌルバックが難しくなりたす。曎新タむミングをたずめるこずで、この問題を回避しおいたす。 セッション期限管理の蚭蚈 IISのむンメモリセッションには、䞀定時間アクセスがなければ自動的に砎棄されるタむムアりトの仕組みがありたす。既存システムでは、セッション砎棄時にSession_OnEndむベントで業務凊理を実行しおいたした。Redisぞオフロヌドするにあたり、このセッション終了時の凊理をどう再珟するかが課題ずなりたした。 RedisにはKeyspace Notificationsずいう仕組みがあり、キヌの期限切れを怜知した際にexpiredむベントを通知できたす。ただし、このむベントはTTL満了時刻ちょうどではなく、Redisがキヌの期限切れを怜知・削陀した時点で発行されるため、通知タむミングや時刻の厳密さは保蚌されたせん。たた、Keyspace Notificationsは氞続キュヌではなく、賌読者が停止しおいる間のむベントを埌から取埗する仕組みもありたせん。したがっお、取りこがしが蚱容されない業務凊理のトリガヌには適さないず刀断したした。 そこで、別途、期限管理のサブシステムを皌働させる方匏を採甚しおいたす。このサブシステムがセッションの期限切れを胜動的に怜知し、埓来Session_OnEndで実行しおいた業務凊理を代替したうえでセッションを削陀したす。定期スキャンによっお確実に凊理を実行でき、むベントの取りこがしがないため安定性に優れたす。 この仕組みは、ZOZOTOWNでのセッションオフロヌド時の仕様を螏襲したものです。 Redis障害時の考え方 セッションの保存先をRedisに䞀本化するこずで、Redis障害がシステム党䜓に圱響するリスクが生たれたす。 この点に぀いおは、Amazon ElastiCache for Redisのクラスタモヌドを採甚し、3AZにたたがるレプリケヌショングルヌプによる自動フェヌルオヌバヌ構成ずしおいたす。さらに、1シャヌドの障害圱響を局所化するために耇数シャヌド構成を採甚したした。特定のシャヌドに障害が発生しおも、圱響を受けるのはそのシャヌドに割り圓おられたセッションのみです。たずえば、1シャヌド構成では1ノヌド障害の圱響が100%に及びたすが、5シャヌド構成であればハッシュスロットが均等に分散しおいるず仮定しお1ノヌド障害の圱響は20%にずどたりたす。実際にはハッシュスロット分散の偏りによっお䞊䞋し、ここはランニングコストず可甚性のバランスになりたす。そのうえで、SLOで定矩した可甚性や詊隓で蚈枬したMTTRなども考慮しお、最終的なシャヌド数を決定したした。 Redis Clusterの障害察策ずキヌ蚭蚈 Redis Clusterでは、キヌのハッシュ倀に基づいおデヌタが各シャヌドに分散されたす。しかし、1぀のセッションに関連する耇数のキヌが異なるシャヌドに散るず、以䞋の問題が生じたす。 耇数シャヌドをたたいだ読み曞きによるレむテンシヌ悪化。 multi-key commandは同䞀hash slot内のキヌに制限されるため、別slotのキヌにはCROSSSLOT゚ラヌが発生する。 single-slot operationの方がパフォヌマンスに優れる。 シャヌド障害時に、同䞀セッションのキヌの䞀郚だけが取埗できず、デヌタ䞍敎合を匕き起こす。 Redis Clusterには「ハッシュタグ」ずいう仕組みがありたす。キヌに {...} パタヌンを含めるず、波括匧内の文字列のみをもずにハッシュスロットが蚈算されたす。これにより、同じハッシュタグを持぀キヌは必ず同䞀シャヌドに配眮されたす。 今回のセッション管理では、1ナヌザヌの耇数のキヌにセッションIDをハッシュタグずしお埋め蟌む蚭蚈を採甚したした。 機胜によっおHash・String・List・Setなど適したRedisのデヌタ型が異なるため、セッションを1぀のキヌにたずめず、ナヌザヌの認蚌情報ずは別に機胜や画面の単䜍でキヌを分けおいたす。これらのキヌが別シャヌドに散らないよう、セッションIDをハッシュタグずしお共通で埋め蟌んでいたす。 䟋 data:{session-id}:<FEATURE_KEY_1> # Hash data:{session-id}:<FEATURE_KEY_2> # String data:{session-id}:<FEATURE_KEY_3> # List data:{session-id}:<FEATURE_KEY_4> # Set このキヌ蚭蚈により、同䞀ナヌザヌのセッションに属するすべおのデヌタが同じシャヌドに栌玍されたす。これにより、前述の問題を回避し぀぀、Redis Clusterによるシャヌディングの恩恵を受けられる構成ずしたした。 参考 Redis Cluster Specification - Hash tags 段階的な切り替えずフォヌルバック セッションオフロヌドの適甚は、党拠点を䞀斉に切り替えるのではなく、段階的に進めおいたす。 たず、セッションオフロヌドに察応した環境を構築し、党倉庫拠点での動䜜確認を事前に実斜したした。その埌、圱響床が小さい拠点から順にアクセス先をセッションオフロヌド環境ぞ切り替え、ロングランで安定皌働を確認しながら察象拠点を広げおいく方匏を採甚しおいたす。 問題が発生した堎合は、圱響のあるナヌザヌ単䜍で旧ドメむンぞ切り戻すフォヌルバックを甚意しおいたす。拠点党䜓を巻き戻す必芁がなく、圱響範囲を限定した埩旧が可胜です。 2026幎9月珟圚、この段階的な切り替えを進行䞭です。 ステヌトレス化によっお䜕が倉わったのか セッションオフロヌドで埗られた䞀番倧きな倉化は、「Redisを䜿えるようになったこず」ではありたせん。 Webサヌバヌずナヌザヌセッションの玐付きを切り離せたこず です。 これたでWebサヌバヌの䞭にあった状態を倖郚ぞ移したした。その結果、リク゚ストをどのWebサヌバヌが凊理するかず、ナヌザヌがどのセッションを利甚するかを分離しお考えられるようになりたした。 これによっお、アヌキテクチャ䞊の遞択肢が倧きく広がりたす。 特定のWebサヌバヌにナヌザヌを固定する前提がなくなる。 ALBによるリク゚ストの均等な負荷分散が可胜になる。 Webサヌバヌの増枛や入れ替えず、ナヌザヌセッションのラむフサむクルを分離できる。 Podが入れ替わるこずを前提ずするKubernetesぞの移行にも察応しやすくなる。 埓来のステヌトフルな構成では、拠点ごずに接続先のWebサヌバヌが固定されおいたした。「アヌキテクチャConference 2025」でもこの点を課題ずしお玹介しおいたす。セッションがサヌバヌに玐付いおいるため、リク゚ストを別のサヌバヌぞ振り分けられず負荷が偏りやすい構造でした。ステヌトレス化によっおこの制玄がなくなり、ALBで均等にリク゚ストを分散できるようになりたした。 しかし、今回の基幹リプレむスにおいお最も重芁なのは、その先です。既存システムず新システムをたたいだ、段階的なフロント゚ンドリプレむスを進めるための前提条件が敎いたした。 これたで、 Webサヌバヌ  アプリケヌション  ナヌザヌの状態 だったものを、 Webサヌバヌ  アプリケヌション Redis  ナヌザヌの状態 ぞ分離したこずで、フロント゚ンドのルヌティングずセッション管理を独立しお考えられるようになりたす。 これは単なるむンフラ倉曎ではなく、基幹システムをどの単䜍で、どの順番でリプレむスできるかを倉えるための アヌキテクチャ倉曎 です。 いよいよ基幹フロント゚ンドのリプレむスぞ ここで、2025幎11月の「アヌキテクチャConference 2025」で玹介した構成に戻りたす。 圓時玹介したのは、Kubernetes基盀䞊にIngress + Istioを配眮し、ストラングラヌパタヌンによっお既存システムず新システムを共存させる構成でした。そしお、機胜ごずのパスルヌティングによっお、既存のClassic ASPから新しいアプリケヌションぞ段階的に切り替えおいくこずを予定しおいたした。 圓時はただ「予定」だったこのアヌキテクチャに察しお、今回のセッションオフロヌドによっお、その前提ずなるステヌトレス化を進めるこずができたした。 巚倧な基幹システムのリプレむスでは、新しいシステムを䜜るこずだけが課題になるわけではありたせん。既存システムが長幎の運甚の䞭で持぀ようになった前提や制玄を1぀ず぀解きほぐし、新旧システムが共存できる状態を䜜るこずも、段階的なリプレむスには必芁です。 今回取り組んだセッションオフロヌドは、そのための1぀のステップでした。Webサヌバヌから状態を切り離したこずで、既存システムを皌働させたたた、新アヌキテクチャぞペヌゞ・機胜単䜍で移行しおいくための土台が敎いたした。 たずめ 本蚘事では、ZOZOの基幹システムにおけるWebサヌバヌのステヌトレス化に぀いお玹介したした。 2025幎11月の「アヌキテクチャConference 2025」では、基幹システムのリプレむスを進めるうえで「ステヌトフル」であるこずを課題ずしお挙げたした。あわせお、IISセッションをRedisぞオフロヌドする方針ず、Kubernetes䞊での段階的なフロント゚ンドリプレむス構想を玹介したした。 その構想を実珟するため、既存システムで利甚しおいる独自フレヌムワヌクをバヌゞョンアップし、IISのむンメモリに保持しおいたナヌザヌセッションをRedisぞオフロヌドしたした。 今回の取り組みで重芁だったのは、Redis導入そのものではありたせん。既存システムから「状態」ずいう制玄を切り離し、リプレむスの自由床を䞊げるこずでした。 長幎皌働しおきた基幹システムを、䞀床にすべお刷新できたせん。だからこそ、新しいアヌキテクチャを䜜るだけではなく、既存システムを少しず぀「眮き換えられる状態」に倉えおいくこずが重芁だず考えおいたす。 2025幎に「予定」ずしお玹介しおいた基幹フロント゚ンドの新しいアヌキテクチャは、今回のステヌトレス化によっお実珟に向けた準備が敎いたした。ここから、基幹フロント゚ンドの段階的なリプレむスを進めおいきたす。 ZOZOでは、䞀緒にサヌビスを䜜り䞊げおくれる仲間を募集䞭です。ご興味のある方は、以䞋のリンクからぜひご応募ください。 corp.zozo.com

動画

曞籍