©Sony Interactive Entertainment PlayStation™Network とコンテナ, CICD ソニー・インタラクティブエンタテインメント 西海持 雅隆
©Sony Interactive Entertainment
PlayStation™Network とコンテナ, CICD ソニー・インタラクティブエンタテインメント 西海持 雅隆
©Sony Interactive Entertainment
はじめに スライドは後日公開予定です そのこともあり、プレゼンを 2PPM 目標で進めます サクサク進む、プレゼン・エンタテインメント
©Sony Interactive Entertainment
自己紹介
西海持 雅隆 (さいかち まさたか)
• 10 年近い開発経験 • 10 年近いインフラ・運用経験 • PlayStation™Network 東京拠点の CICD チームのリード
AWS Summit Tokyo 2014
PlayStation®4 (PS4®) のロンチ時に、PlayStation™Network 東京拠点のサービスでAWS を全面採用した話のセッションを持つ
©Sony Interactive Entertainment
会社紹介
ソニー・インタラクティブエンタテインメント (SIE) は PlayStation®を作っている会社です。
©Sony Interactive Entertainment
会社紹介
SIE では PlayStation®の遊びを広げるオンラインサービス PlayStation™Network (PSN) をご提供しております。
PSN の開発・運用は
• グローバルに広がる複数拠点で実施 • 各拠点がゲーム、コマース、ストアなどの単位で機能を分担 • 各拠点がグローバルにサービスを提供
私の所属している東京拠点は、オンライン対戦やトロフィー、メッセージなど、ゲーム向けのネットワーク機能を開発・運用しています。
©Sony Interactive Entertainment
数字で見る PS4® と PSN
全世界累計実売台数 PS4®ゲームプレイ MAU 展開国・地域
7,360 万台 8 億時間 以上/週
8,000 万 以上
70 カ国
(2017年12月31日時点) (2017年12月最終週) (2018年3月末時点) (2018年3月末時点)
© Sony Interactive Entertainment Inc. All rights reserved. Design and specifications are subject to change without notice.
©Sony Interactive Entertainment
お話しする内容 PSN 東京拠点で、フルスクラッチでコンテナ基盤と CICD を実現し、サービスインした話
コンテナ基盤 CICD サービスイン
©Sony Interactive Entertainment
コンテナと CICD “私達のケース” 企画から導入、運用まで、何をどのように考え、判断し進めたか。
• 今回、尖ったことや斬新なことは行わなかった • 先進的から教科書的まで、多くの情報が Web にある
それでも実現に約二年を要した、その内容をご紹介します。 同じテーマに取り組んでいる方のご参考となれば幸いです。
©Sony Interactive Entertainment
目次 1. 2016 | 出発前 2. 2016 | 出発点 3. 方針 4. アーキテクチャ 5. 設計のポイント 6. 進め方 7. 組織の協業
8. 広める! 9. サービスイン 10. 2018 | 達成 11. 困難 12. 今後 13. 結び
©Sony Interactive Entertainment
2016 | 出発前 本セクションには、後の成果を目立たせるために悲壮感の演出があります
©Sony Interactive Entertainment
東京拠点の規模
• 数十サービス (二桁後半)
• 数千インスタンス • ほぼ AWS 上 • EC2 インスタンスと Chef
©Sony Interactive Entertainment
いわゆる Dev と Ops と Sec
! “DevOps” ! “DevOpsSec”
組織
Dev Ops sec
©Sony Interactive Entertainment
サービスデリバー 組織の構造 = システムの構造 (コンウェイの法則)
CI リリース D 準備
進む 個別最適化
“リリース” と “準備” そして “デプロイ”
Ansible Chef
©Sony Interactive Entertainment
既存の仕組み
Dev と Ops それぞれの努力の成果 ちゃんと機能する
でも、サービス数が多く大変
リリースからデプロイに一日以上かかることも…
©Sony Interactive Entertainment
2016 | 出発点
©Sony Interactive Entertainment
PSN のお客様に、より多くの体験を届けたかった。
©Sony Interactive Entertainment
新しい部署の発足 サービスデリバリーを扱う部署が Dev に発足。 三人のエンジニアが立候補して参加し、私はチームリードを担当。 今は 10 名程度のチームです。
©Sony Interactive Entertainment
企画 “速度” にフォーカスした CICD の仕組みを作る。
• アベイラビリティを下げること無く、迅速かつ効率的にサービスを デリバーすることで一日 100 回のリリースとデプロイができ、 本番運用可能な基盤構築を目指す
• 開発から運用までの全体最適化を図る
• セキュリティを全てにおいて 1st class citizen として扱う
©Sony Interactive Entertainment
Project Haste 加速しそう!
©Sony Interactive Entertainment
Haste CICD とは Haste CICD はコンテナの作成、開発、デプロイから運用に至る すべてを提供します。 継続的インテグレーション + 継続的または手動デプロイ + コンテナ実行環境 (開発と本番) + Docker BaseImage + セキュリティ + オペレーションエクセレンス (Auto-scaling やログ、監視、メトリクスなど)
Haste CICD
©Sony Interactive Entertainment
セキュリティは本当に重要 セキュリティを全てにおいて 1st class citizen として扱う。 セキュリティの問題が起きると、お客様にゲームを楽しんでいただけなくなってしまう。
何時でも、安心してゲームを遊んでいただけるよう、お客様のプライバシー、お預かりしている情報を全力で守る。
©Sony Interactive Entertainment
方針
©Sony Interactive Entertainment
シンプルかつ必要最小限 本当に必要なものだけを作る • 10 行のコードであっても、何かを作れば必ず運用が発生する • 作る前に 「最後まで面倒を見れるか」 を考えてみる
極力 AWS のサービスを活用 • 制約を受け入れる
– できないことも多いが、そもそも不要なこと、代替できることも多い • ベンダロックインのリスクは常に意識
– 作り込まずに、なるべくそのまま使う
AWS サービスの薄い “ラッパー” や “フレームワーク” を作る事が多い
©Sony Interactive Entertainment
迷ったら 目標を思い出す • 速度にフォーカスしているか • それは一日に 100 回以上デプロイできる選択肢か • セキュリティをなによりも大切にしているか
まずやってみる • 動かして、体験することはとても大事 • 100点を目指して、分析や設計中毒にならない
©Sony Interactive Entertainment
なぜコンテナか コンテナ
• ○ 80% のサービスが提供可 • ○ 秒単位 (起動)
当初 Apache +Tomcat の 普通の HTTP サービスのみを対象に
インスタンス • ○ ほぼ 100% のサービスが提供可 • × 分単位 (起動)
すでに一定の仕組みを構築済み
ファンクション • × 特定の目的のみで利用可(当時) • ○ 秒単位
いずれ AWS が仕組みを揃えてくれる
©Sony Interactive Entertainment
アーキテクチャ 何を、どう実現しようとしたか
©Sony Interactive Entertainment
コンテナ基盤
アーキテクチャ (コンテナ基盤) ECS, ECR, ALB, S3 と Route53 など標準的な AWS スタックを極力利用
Amazon Route 53 Service Discovery は現在未使用
Amazon ECR
ACM
Amazon ECS Artifact Bucket Public Service A
Internal Service B
©Sony Interactive Entertainment
2016 年の判断 Orchestration Tool ECS Kubernetes や Docker Swarm ではなく? • シンプル:学習コストが低い、機能は限られる • 高品質:本番環境での利用事例、SPOF レス • AWS サービスとの密な連携と、強力なサポート • 当時の Kubernetes や Docker Swarm は発展途上に思えた
今大切なこと それは コンテナ化 • コンテナ化されていれば、必要な時に他のソリューションへも移行できると考えた
©Sony Interactive Entertainment
データを Kinesis, S3, CloudWatch に集約し、極力 Serverless で処理。
ログ
メトリクス
アーキテクチャ (運用・監視)
アプリケーション 集約と蓄積
監視 ツール
Kinesis: 損失を最小限に抑えるログ / S3: 一定の損失を許容するログ
ホストとコンテナ
ログ ツール
Event Processing
©Sony Interactive Entertainment
CICD (ステージング環境まで)
アーキテクチャ (CICD) Github の裏で動く、CodePipeline を中心とした軽量フレームワーク
github
ステージング
Build
Inspect
Test
Auto re-deploy
Register Image
Feed Baaaaaaaaaaaaaaaaaack!
Hook Kick AWS CodePipeline CodeBuild に 万能感
©Sony Interactive Entertainment
設計のポイント
©Sony Interactive Entertainment
AWS Well-Architected Framework
AWS SA の荒木さんが激推し • クラウドアーキテクチャのベストプラクティス集 • 設計の良い目次になる • 見逃しているポイントに気がつける • 会社から営業活動のプレッシャーがあるのかと
勘ぐるも、杞憂に終わる (流石です)
©Sony Interactive Entertainment
気がつけることの例 データの保護より • AWS 側でデータの暗号化をサポートしているサービスに何があるか • その実現手段
S3 のサーバ側暗号化 SSE-KMS と KMS API の制限 • AWS で暗号化の鍵管理といえば KMS • S3 のサーバ側暗号化には SSE-S3 と SSE-KMS がある • SSE-KMS では、オブジェクトのダウンロード毎に Decrypt API が呼ばれる • Decrypt API はアカウント単位 1,200 Req/Sec のスロット制限がある • デフォルト暗号化に SSE-KMS を選択し、暗号化されたオブジェクトのダウンロード数が 1,200
Req/Sec を越えると… • アカウント全体で KMS の API がスロットルされて大変だ!
©Sony Interactive Entertainment
基盤: 環境構成 同一構成のステージング環境と本番環境 • インスタンス数の差異のみ • 環境に起因する問題を早期に見つけられる • CloudFormation で容易に構築
ステージング環境 本番環境
©Sony Interactive Entertainment
基盤: Subnet 設計はコンテナを十分考慮 AWS サービス毎の差異 • アタッチできる Subnet 数が異なる
• ECS Task は 10 Subnet
• ELB は 1AZ あたり 1 Subnet
IP アドレス (ENI) 大量消費 • “awsvpc” モードではインスタンス数
+ コンテナ数 ENI を消費 • Lambda VPC も配慮
NAT Gateway の分散 • NAT の障害対策として、1つの ECS
Service や AutoScaling Group が複数の NAT を使うように
ECS Task
©Sony Interactive Entertainment
基盤: ホスト 高速かつ安定した起動を優先
AMI • AmazonLinux AMI • 必要最小限の種類 • Golden AMI • Packer と Ansible • Serverspec • Hardening
ECS クラスタ • 単一の共用クラスタ
AutoScaling • Scale-in/out • CPU 予約率 • Memory 予約率 • 消費 ENI 数
©Sony Interactive Entertainment
コンテナ: ECS Task 全サービスで共通のリソース設定 • Tomcat は CPU: 1024, メモリ: 2GB など • チューニングやサイジングを容易に • 性能はスケールアウトで確保し、最適化は後日
Service AutoScaling • CloudWatch カスタムメトリクス
– TCP Connection, ミドルウェアのスレッド数やコネクション数 – コンテナ単位のメトリクス
• 慎重なスケールイン – “すべて” の CloudWatch アラームが収束したらスケールイン
httpd
Tomcat
fluentd
©Sony Interactive Entertainment
CICD: サービス開発用に三種のパイプライン Pull Request パイプライン • アプリケーションのビルドとテスト • Docker Image の作成と、開発環境への登録
Push パイプライン • Pull Request パイプラインの作業 + さらなるテスト • ステージング環境への Docker Image の登録と自動デプロイ
Release パイプライン • 本番環境への Docker Image の登録
他にCICD インフラ用もある • AMI 用 • Docker BaseImage 用
©Sony Interactive Entertainment
“Git flow” でうまく動くよう主要ブランチごとのパイプライン
なお CodePipeline は同一パイプラインで追い越しができない
CICD: Git Branching Model への適合
for develop branch for master branch
©Sony Interactive Entertainment
CICD: Developer へのフィードバック Developer が大好きな Github や Slack に情報を集約 というのも AWS Management Console は正直使いにくい…
Developer 向けの適切に限定された IAM 権限の設定も難しい…
デベロッパー体験のため、CI の処理状況や詳細を AWS サービスの UI にあまり頼らず、これらに集めた。
• Github - Pull Request や Comment など • Slack
AWS Management Console は今後に期待!
©Sony Interactive Entertainment
CICD: サービスデリバー 役割により、異なるニーズ、異なるソリューション ステージング環境までの “CD” パイプライン
本番環境へのデプロイツール (ステージング環境でも使用)
Github でのマージでデプロイ Code Pipeline + ECS Service Update 速度と頻度 Dev 作業
既存の変更管理プロセスのサポート マニュアルで扱う独自実装ツール
信頼性 ガバナンス Ops 作業
©Sony Interactive Entertainment
CICD: 本番環境へのデプロイツール 信頼性とガバナンス重視の、手動で操作する独自実装デプロイツール CLI が StepFunctions のワークフローを開始。実行される ECS Task や Lambda Function が CloudFormation などで ECS Service, ALB, Alarm を操作。
• Canary testing • Blue-Green Deployment • AutoScaling (scale-in / out) のサポート • 承認者による承認プロセスや監査への対応 • トラブル時のロールバック • 任意のバージョンの ECS Task へのロールバック • など
©Sony Interactive Entertainment
進め方
©Sony Interactive Entertainment
進め方
• Haste 開発 • Test Bed : 社内利用サービスを移行 (1サービス、切り戻し可)
• 既存移行 : 本番サービスを移行 (3サービス、切り戻し可)
• Native 開発 : サービスを最初からコンテナで開発
Native 開発 Tune 既存
移行 Tune Test Bed
Haste 開発
©Sony Interactive Entertainment
かかった時間は約二年
• Haste 開発 : 9カ月 • Test Bed : 10カ月 評価とチューニング • 既存移行 : 7か月 最初のサービスの Dockerize から移行まで • Native 開発 : 2か月 最初のサービスのステージング導入まで
Native 開発 Tune 既存
移行 Tune Test Bed
Haste 開発
©Sony Interactive Entertainment
Ops Team
Dev Team
役割に変化
最初は自分たちで 次に使ってもらう そして作ってもらう Haste 開発 パイプライン構築 コンテナ化 パイプライン利用 サービス構築 サービス運用
CICD Team
Native 開発 Tune 既存
移行 Tune Test Bed
Haste 開発
©Sony Interactive Entertainment
組織の協業 たくさんの人との連携と協力
©Sony Interactive Entertainment
Ops Team
Dev Team
Docker で複雑・曖昧になる役割の境界
CICD Team
コンテナに OS や ミドルが含まれる、デプロイを一部 Dev が行うといった点で、Dev と Ops の境界が複雑かつ曖昧に。 • 多くの人との議論 • 多くの人の理解と協力
Haste 開発 パイプライン構築 コンテナ化 パイプライン利用 サービス構築 サービス運用
©Sony Interactive Entertainment
多くの人を巻き込んだ
©Sony Interactive Entertainment
開発マネジメントによる工数確保の支援と、積極的なスクラムチームの参加。
• パイプラインや Dockerize の設計支援 • 既存のプロセスやサービスに精通 • 海外拠点とのアライン
Dev の人は新しいチャレンジに積極的
• パイプラインや Dockerize の設計支援 • 最初の Dockerize サービスの担当 • サービスのレクチャやパイプラインの評価とフィードバック • コードの修正
• パイプラインや Dockerize の設計支援 • フレームワークの対応、環境変数や ECS Task IAM Role など
©Sony Interactive Entertainment
運用マネージャのアドバイスで、サービス運用チームでは有志の参加者を募った。 8名のエンジニアが参加する WG が発足し、モチベーション高くタスクを遂行。
• インフラの設計支援 • 設計レビュー
Ops の人もコンテナに興味津 々
• サービス構築・運用・監視と移行 • インフラ構築・運用と監視 • プロセスの整備 • ドキュメント・Runbook の整備 • AutoScaling (Host / Task) の実現 • 調査手段や HotFix の実現
©Sony Interactive Entertainment
• 採用予定の AWS サービスについて質疑 • アーキテクチャレビュー
AWS の皆さんはいつも頼りになる
• サービスイン時のサポート • 各種トラブルのフォローアップ
©Sony Interactive Entertainment
Sec の人は最初から協力的
開発から運用まで、 新基盤に最初から適切な セキュリティを導入できることは、Sec としても効率的
成果 協業 • セキュリティ対策の立案 • セキュリティポリシーへの準拠 • インフラやパイプラインへの
セキュリティツールの組み込み • パイプラインのガバナンス整備 など
• セキュリティレビュー • ツールの導入支援 • 攻撃事例の調査 • 各種相談 • 定例開催
©Sony Interactive Entertainment
セキュリティは難しい セキュリティは専門知識が必要。
• インスタンスとコンテナで Hardening はどう異なる? • Forensic のために何が必要? • コンテナへの攻撃事例にはどのようなものがある? • Security オペレーションにどのような変更が生じる?
プロジェクトの立ち上げ当初から協力を依頼し、一緒に取り組んだ。
©Sony Interactive Entertainment
タイミング
Native 開発
既存 移行
Test Bed
Haste 開発
最初からカラフル、最初から Dev, Ops, Sec, AWS!
©Sony Interactive Entertainment
広める! 伝え、応える
©Sony Interactive Entertainment
Demo Day の開催 Monthly で、Dev と Ops の参加者に状況や機能を紹介 1. CI パイプライン とデバッグ機能 2. 結合テスト手法 3. AMI と Docker BaseImage のパイプライン
4. Haste を使った開発とデバッグのトライアル
5. メトリクス 6. CD のプロトタイプ 7. コンテナに移行を容易にする結合テストの設定 8. パイプラインに必要な資材の Scaffolding 9. ログの調査手法
開発スクラムと共催
©Sony Interactive Entertainment
Slack Channel
©Sony Interactive Entertainment
On-boarding Program サービス開発スクラムチームの学習コストを下げる
• パイプラインを容易に設定する Scaffolding ツールの提供 • コンテナ開発を行うための Hands-on の開催
©Sony Interactive Entertainment
サービスイン 大きなリスクを積極的にとるのではなく リスクを小さくしながら進める
©Sony Interactive Entertainment
移行サービス
テストベット お知らせ系 トロフィー系 フォロー系
12 Task 20 Task 300 Task 200 Task 社内利用サービス CICD Team 主導
本番サービス Ops Team 主導
2017-04 完了 2018-03 完了 2018-05 完了 In progress 11ヶ月
©Sony Interactive Entertainment
進め方 ステージング環境 (複数) からはじめ本番環境へ • コンテナのサイズは全環境同じ、タスク数が異なる • アプリケーションの設定やネットワーク設定には差異がある
ステージング環境 本番環境
©Sony Interactive Entertainment
本番サービス移行 by Ops お客様に影響を発生させないために
やったこと • 移行手順の整備、レビュー • サイジングと余剰キャパシティの設置 • カットオーバークライテリアの設定と、移行前後のエラー、性能計測 • EC2 基盤への切り戻し手段の整備
やらなかったこと • オートスケーリング ( in / out )
©Sony Interactive Entertainment
結果
お客様に影響なし 性能劣化なし
エラーの変動なし
©Sony Interactive Entertainment
トラブル お客様に影響のあるトラブル無し
ステージング環境で解消 • コンテナが落ちる (チューニング誤り、スクリプトのバグ)
• コンテナが生成できない • 特定クライアントからの接続 NG • 移行前後のサービスが別 VPC にあり両方を ALB に登録できない
本番環境で解消 • 低頻度でコンテナが落ちる (チューニング誤り) リトライ+自動復旧
©Sony Interactive Entertainment
2018 | 達成
©Sony Interactive Entertainment
速度 ステージング環境へのデプロイ 本番環境へのデプロイ
1日 → 20 分 2.5 倍高速 Github でのマージからステージング環境でのデプロイ終了まで Ops の手動作業、資材の準備からデプロイ完了まで
サービスの起動
分 単位 → 秒 単位 ALB のヘルスチェックに要する時間を除く
©Sony Interactive Entertainment
PSN のお客様に、より多くの体験を届けたい。
一歩前進!
©Sony Interactive Entertainment
エンジニアの輪
Docker 楽しい !
Contribute!
-- snip --
©Sony Interactive Entertainment
たくさんの Docker Image
Amazon ECR
©Sony Interactive Entertainment
困難
©Sony Interactive Entertainment
難しさ 開発者の「開発の加速」の体感 • ラップトップ PC 上での開発はまだ加速していない • AWS はラップトップ PC 上での開発には、まだ十分にリーチできていない • Kubernetes ?
アプリケーションアーキテクチャの課題 • 依存サービスもコンテナ化し、自分専用の開発環境を立ち上げたかった • 既存のサービスは非常に依存関係が複雑「依存サービスもコンテナ化」が困難 • サービスの Decoupling, コンテナデザインパターンや、サービスメッシュなど、コン
テナを活用するアプリケーションアーキテクチャも必要か
©Sony Interactive Entertainment
難しさ (Cont.) AWS Managed Service の CI への組み込み • 求む AWS Managed Service の公式コンテナ、代替ソリューションは互換性に課題 • テスト毎に Managed Service を立ち上げるのは遅いよね
“調査” の難易度 • 調査で見るべき箇所が増え、調査の難易度が上がったとのフィードバック • Docker レイヤの追加や、コンテナの生存期間の短命化なども原因に
コスト管理 • 共用クラスタ上の複数のサービスに、どのようにコストを配分するか
©Sony Interactive Entertainment
難しさ (AWS Managed Service) 膨大かつ進歩の早い AWS Managed Service をどう理解し、どう使うか AWS の提供/推奨機能は簡素なことが多い • どうしても必要な機能がなければ作る
AWS の世界の部品は多く便利 • AWS の世界の外側、たとえば Docker の世界では、もちろん別途作り込みが必要 • 似たような部品もあるので迷うことも
AWS の提供するサービスは “部品” が多い • 複数の部品を組み合わせて使う場合には、Glue コードが必要なことが多い
AWS の世界の変化は速い • 継続的にキャッチアップしてゆく必要
©Sony Interactive Entertainment
難しさ (AWS Managed Service) (Cont.) コンテナ周りは作り物が多かった • コンテナの Bootstrap 処理、安全な環境変数の受け渡し • Deployment Tool, Canary Testing や Blue Green Deployment • ラップトップ PC からテスト用の ECS Task を起動するツール • セキュリティインテグレーション • 多くのカスタムメトリクスやログまわり • Docker Image - 例えばテスト用の DynamoDB Local Container • など
©Sony Interactive Entertainment
今後 私の経験、私の視点より 変化への対応
©Sony Interactive Entertainment
未来の予測は難しい 2014 インスタンスと Chef の世界
2018 コンテナ、CICD の世界
©Sony Interactive Entertainment
未来の予測は難しい
予測できたか • Docker 本体に Kubernetes
予測できるか • 今後コンテナとファンクションの
どちらが優勢になるか
©Sony Interactive Entertainment
変化を受け入れる、変化する前提で進める 変化しにくいものに “最初に” 投資する • 本件で言えば ECS, Kubernetes ではなく “Docker”
作りすぎない • 作れば、そこから運用が始まる
捨てる勇気をもつ • 作ったものと同等機能の Managed Service がでたら思い切って乗り換える • 新しいデファクトスタンダードがでたら思い切って乗り換える
©Sony Interactive Entertainment
DevOpsSec / CICD の流れと人の変化 DevOpsSec の流れ • Dev, Ops, Sec 全ての要素が必要、一つも欠かせない
CICD の流れ • Dev, Ops, Sec の境界は今後さらに複雑かつ曖昧になる
変化に備える、特に人の変化には時間がかかる 一緒に取り組む仲間を見つける
©Sony Interactive Entertainment
結び
©Sony Interactive Entertainment
More Dev, Less Ops
お客様により多くの価値を届けるために 方向性は More Dev, Less Ops
そのためにも、
もっと コンテナ、もっと Serverless
©Sony Interactive Entertainment
We are hiring!
登場人物になりませんか?
SIE では、グローバルに広がる開発拠点と協業しながら、 PSN の開発・運用を行うエンジニアを募集中しています。
©Sony Interactive Entertainment
本日はご清聴いただき、誠にありがとうございました。
©Sony Interactive Entertainment