Upgrade to Pro — share decks privately, control downloads, hide ads and more …

テレビ・レコーダーのバックエンドにおけるCI/CDへの取り組み

Shun Satou
December 03, 2018

 テレビ・レコーダーのバックエンドにおけるCI/CDへの取り組み

Shun Satou

December 03, 2018
Tweet

More Decks by Shun Satou

Other Decks in Technology

Transcript

  1. 自己紹介 2 • 佐藤 瞬 • 所属 – ソニーネットワークコミュニケーションズ株式会社 Metaチーム

    • 経歴 – 2011-2016 SIとして受託開発 – 2016- 転職し、現在の会社へ • 過去のスライド – https://www.slideshare.net/tenbo07 – https://speakerdeck.com/tenbo07
  2. Meta Service Overview 4 TV SideView Music Center • テレビ番組、ビデオ、音楽のコンテンツメタデータの配信

    や 関連する機能の提供を行う,ソニー社内のクラウドサービスプラットフォーム • ソニーのホーム機器 (BRAVIA / BDRE / BDP) 上のアプリ や モバイルアプリ (TV SideView / Music Center) 向けにサービスを提供 • フロントエンドの Web API サービス、およびバックエンドのデータアグリゲーション/検索/推薦などのサブコンポーネントで構成 BRAVIA BD Recorder BD Player 300,000,000 request / day Meta Service
  3. • Metaサービスから以下を配信 – 番組表 – 予約ランキング – リアルタイム視聴数 – 番組検索

    – 番組詳細 – 人物詳細 – VoDコンテンツ検索 • YouTube、ニコニコ動画など – おすすめ番組 – ブックマーク機能 6 Video & TV Side View
  4. Data Store Worker/ Batch job HTTP API 全体構成 9 app

    A Proxy Batch A Client app B Batch B DB B DB A DB C Analysis Batch Scheduler app C ・ ・ ・ ・ ・ ・ ・ ・ ・
  5. Data Store Worker/ Batch job HTTP API 全体構成 10 app

    A Proxy Batch A Client app B Batch B DB B DB A DB C Analysis Batch Scheduler app C ・ ・ ・ ・ ・ ・ ・ ・ ・ 主にこの部分の話
  6. Agenda • CI/CD パイプライン構築 – Pipeline / Build /Test /

    Deployをどのように行っているか • CodePipelineの導入経緯と使い勝手 • Canary Deploymentへの取り組み • 継続的デリバリーについて • まとめ • 今後やっていきたいこと 11
  7. Agenda • CI/CD パイプライン構築 – Pipeline / Build /Test /

    Deployをどのように行っているか • CodePipelineの導入経緯と使い勝手 • Canary Deploymentへの取り組み • 継続的デリバリーについて • まとめ • 今後やっていきたいこと 12
  8. コンテナの更新Pipeline パイプラインの流れ(Staging) 16 Commit 起動 Developer Build Staging Deploy Staging

    Test Staging Switch 新バージョンの起動 新バージョンのテスト 新バージョンへ切り替え Clean up 旧バージョンの停止 Docker Imageの作成
  9. コンテナの更新Pipeline パイプラインの流れ(Prod) 17 Commit 起動 Developer Copy Image Prod Deploy

    Prod Test Prod Switch 新バージョンの起動 新バージョンのテスト 新バージョンへ切り替え Clean up 旧バージョンの停止 StagingのECRからDocker Imageのコピー Copy Staging Prod
  10. コンテナの更新Pipeline • Deploy~Clean Up – ECSとALBを使ったBlue/Greenデプロイ 19 Target Group Target

    Group default.example.com Deploy時(新バージョンの起動) new.example.com 新バージョンにアクセスできる サブドメインを作成
  11. コンテナの更新Pipeline • Deploy~Clean Up – ECSとALBを使ったBlue/Greenデプロイ 21 Target Group Target

    Group Switch(新バージョンへ切り替え) Client default.example.com Listener Rule の切り替え
  12. という感じで作ってましたが AWS CodeDeploy による AWS Fargate と Amazon ECS での

    Blue/Greenデプロイメントの実装 – https://aws.amazon.com/jp/blogs/news/use-aws-codedeploy-to- implement-blue-green-deployments-for-aws-fargate-and-amazon- ecs/ 23 ほぼ同じなので 今からやるならCodeDepoyですかね
  13. ServerlessアプリケーションのDeploy Pipeline パイプラインの流れ(Staging/Prod) 28 Commit 起動 Developer Deploy Test Switch

    新バージョンのStage/aliasを作成 新バージョンのテスト 新バージョンへ切り替え Clean up 旧バージョンのStageを削除 (5世代前) SAMでLambda functionのデプロイ Build AWS SAM Custom Domainの 向き先を新バージョンへ変更
  14. Agenda • CI/CD パイプライン構築 – Pipeline / Build /Test /

    Deployをどのように行っているか • CodePipelineの導入経緯と使い勝手 • Canary Deploymentへの取り組み • 継続的デリバリーについて • まとめ • 今後やっていきたいこと 34
  15. CodePipelineの導入経緯 • Jenkinsの除外 – Jenkins自体のブラックボックス化が進み管理が難しくなっていたので、 これ以上Jenkinsに役割を増やしたくない – 将来的にはBuild等もマネージドサービスに移管したい • Jenkins資産も活用したい

    – Pipelineの構築前、Build・Testなどの各ジョブはJenkinsで実行 – Jenkins環境に依存している部分が大きかったので、 まずはそのまま使ってPipelineを構築したかった • コスト管理 – CircleCIなど別サービスを使う場合は支払先が増える – CodePipelineであればAWSのコストが増えるだけでコスト管理が楽 40
  16. CodePipelineを導入してみて良かった点 • AWSの他サービスとの連携 – CodeBuild / ECS / CloudFormation /

    Lambdaなど – 最初は便利だが、最終的にはCodeBuild やLambdaで APIを叩いていることが多い • DeployやBuildといった作業自体が繊細なものなので、 サービスやアプリケーションによって変えたいことが多いため – CodePipelineの利点ではあるが、他のCI/CDサービスと比較して 大きな優位性というわけではないと思う • API叩けば他でもできてしまうため 43
  17. CodePipelineで困りごと ありましたが、改善されてきている • CodeBuildにInputを一つしか渡せない – CodeBuildのMulti Input Sourcesで改善 • 2018/9/4

    Update • Githubトリガーがポーリングなので起動が遅い – AWS Codepipeline Supports Push Events from GitHub via Webhooks • 2018/5/1 Update • Stage間の遷移が遅い – AWS Codepipeline Now Executes Faster • 2018/11/19 Update 45
  18. CodePipelineで困りごと ありましたが、改善されてきている • CodeBuildにInputを一つしか渡せない – CodeBuildのMulti Input Sourcesで改善 • 2018/9/4

    Update • Githubトリガーがポーリングなので起動が遅い – AWS Codepipeline Supports Push Events from GitHub via Webhooks • 2018/5/1 Update • Stage間の遷移が遅い – AWS Codepipeline Now Executes Faster • 2018/11/19 Update 46 (一番ストレスだった部分が改善されてしまって、今あまり思いつかない)
  19. CodePipelineで困りごと 現状ワークアラウンド的なことをしている部分 • SourceでGit Tagを指定できない(Branchのみ) – JenkinsでTagを取ってきてZipで固めてS3へUploadし、 S3 TriggerでPipelineを起動している •

    リリースブランチを切るという選択もある • CodePipelineの実行時にパラメーター指定ができない – (そもそも、その運用が正しいかはありますが) – S3にパラメーターを置いたり、Pipelineの途中でLambdaで生成している – 環境名(dev/staging/prod)などを渡したい 48
  20. Agenda • CI/CD パイプライン構築 – Pipeline / Build /Test /

    Deployをどのように行っているか • CodePipelineの導入経緯と使い勝手 • Canary Deploymentへの取り組み • 継続的デリバリーについて • まとめ • 今後やっていきたいこと 49
  21. Canary Deploymentへの取り組み • Canary Deploymentとは – 新バージョンを本番環境の一部にリリースし、少しずつトラフィックを流していく デプロイ手法 • 基本的にはBlue/Green

    Deploymentですが、 一部でCanary Deploymentを導入して運用中 – 試験的な部分があるので、今後どうするかは未定 – 負荷を見るために実施しているのみで、A/Bテスト的なことはしていない – ALB(Target Group)の機能を使って実施 • 同じTarget Groupに複数のECS Serviceを登録すると、 コンテナ数比に応じてトラフィックが分散される 51
  22. カナリアリリース方式 52 ECS Cluster Target Group • ECSで新バージョンのImageを 指定したServiceを起動 •

    既存のTarget Groupに起動 したServiceを追加 • ALBがコンテナ数比に応じて各 Serviceにリクエストを振り分け る ①Service起動 ②Target Groupへ追加
  23. Agenda • CI/CD パイプライン構築 – Pipeline / Build /Test /

    Deployをどのように行っているか • CodePipelineの導入経緯と使い勝手 • Canary Deploymentへの取り組み • 継続的デリバリーについて • まとめ • 今後やっていきたいこと 55
  24. SLI/SLO・エラーバジェット • SLI/SLO – Service Level Indicator (SLI) • サービスレベルを計測するための値

    例) HTTPリクエスト成功率 – Service Level Objects(SLO) • SLO = SLI + objective(目標) 例) HTTPリクエスト成功率 > 99% • エラーバジェット – リスクとして許容可能な範囲を示す値 • SLOが99%であれば、1%はエラーを許容できる 1% = エラーバジェット 69
  25. SLI/SLO・エラーバジェット • SLI/SLO – Service Level Indicator (SLI) • サービスレベルを計測するための値

    例) HTTPリクエスト成功率 – Service Level Objects(SLO) • SLO = SLI + objective(目標) 例) HTTPリクエスト成功率 > 99% • エラーバジェット – リスクとして許容可能な範囲を示す値 • SLOが99%であれば、1%はエラーを許容できる 1% = エラーバジェット 70 エラーバジェットを満たしているかが、 デプロイに問題がないかの指標になる
  26. 今後やっていきたいこと • クライアントも含めたCI/CD – Pipelineにクライアントアプリも含める形でリリースしたい • クライアントとの連結は別途テストを行っている • Service meshの導入

    – App meshも出たのでアーキテクチャを再設計していきたい • アプリ作り直したい – それなりに歴史を重ねてきたのでレガシーな部分が多い 76