45.8K Views
March 20, 23
スライド概要
CI/CD Conference 2023 での発表資料です
https://event.cloudnativedays.jp/cicd2023/talks/1777
経済ニュースアプリのSREの仕事をしています。
最高の開発者体験を目指して AWS CDKでCI/CDパイプラインを 改善し続けている話 株式会社ニューズピックス 安藤 裕紀 2023.3.20@CI/CD Conference 2023 by CloudNative Days
00 自己紹介 安藤裕紀 / Yuki Ando NewsPicks SRE SREチームのマネージャー兼テックリード 好きなAWSのサービス:ECS、Cost Explorer 、CDK ©NewsPicks Inc. All Rights Reserved.
00 目次 1. NewsPicksと開発者体験について 2. NewsPicksのインフラ構成とリリースに伴う課題 3. 安全かつ高速にデプロイできるCI/CDパイプライン構築の取り組み 4. 開発者体験への効果と今後の展望 パートへ ©NewsPicks Inc. All Rights Reserved.
01 NewsPicksと開発者体験について ©NewsPicks Inc. All Rights Reserved.
01 ソーシャル経済メディア NewsPicksについて タイトルタイトルタイトルタイトルタイトルタイトルタイト ルタイトルタイトルタイトル テキストテキストテキストテキストテキストテキストテ キストテキストテキストテキストテキストテキストテキ ストテキストテキストテキストテキストテキストテキスト テキストテキストテキストテキストテキストテキストテ キストテキストテキストテキストテキストテキストテキ ストテキストテキストテキストテキストテキストテキスト テキストテキストテキストテキストテキストテキストテ キストテキスト ©NewsPicks Inc. All Rights Reserved.
01 サービスのユーザー数・プレミアム会員ともに成長中 ©NewsPicks Inc. All Rights Reserved.
01 ユーザーに価値を届けることを重視するNewsPicksの文化 ユーザーに価値を届けるためにも効率化・自動化は重要 開発者はフルサイクルの問題解決を自走する過程で何度もデプロイを繰り返すことになる 誰でも安全かつ高速に開発・リリースできる状態を追求することが ユーザーに価値を届けることにつながるというスタンスで常に改善を続けている ©NewsPicks Inc. All Rights Reserved.
01 NewsPicksは最高の開発者体験を目指しています NewsPicksエンジニア向け採用サイト※1の 「働く環境/福利厚生」の1stビューに 「最高の開発者体験の追求」を掲げています 「Findy Team+ Award 2022」において、 NewsPicksが「エンジニア組織の生産性指標が高い 企業」として選出されました※2 ※1 https://tech.newspicks.com/ ※2 https://tech.uzabase.com/entry/2022/10/25/151838 ©NewsPicks Inc. All Rights Reserved.
02 NewsPicksのインフラ構成と デプロイに伴う課題 ©NewsPicks Inc. All Rights Reserved.
02 NewsPicksはEC2インスタンスが中心のサービスだった システム概略図 (〜2021) AWS Cloud Application Integration, Management & Governance EC2インスタンスが100台以上 SQS SNS CloudWatch Parameter Store Analytics services Redshift Glue OpenSearch Service EC2 instances スマホアプリ Auto Scaling group 社内・法人向けシステム Database services … … Aurora DynamoDB Web newspicsks-server RDS ECS containers ElastiCache Lambda functions feed services … … search batch billing services … ©NewsPicks Inc. All Rights Reserved. Storage S3 S3 Glacier
02 2年かけて、現在ユーザー向けのサービスはコンテナ化がほぼ完了 システム概略図 (2023〜) AWS Cloud ECS containers Application Integration, Management & Governance Analytics services web services … bff services スマホアプリ … SQS SNS CloudWatch Parameter Store Redshift Glue 社内・法人向けシステム Database services api services … Web … Aurora DynamoDB RDS batch services … ECS containers ElastiCache Lambda functions feed services EC2 instances search (ECS&OpenSearch Service化予定) ©NewsPicks Inc. All Rights Reserved. OpenSearch Service … … billing services … Storage S3 S3 Glacier
02 スマホアプリ/Webのバックエンドは盛んに開発が行われている システム概略図 (2023〜) AWS Cloud ECS containers Analytics services web services … bff services スマホアプリ … api services 最も多くの開発者がデプロイ … する共通バックエンドサービス Web Application Integration, Management & Governance SQS SNS CloudWatch Redshift Glue … Aurora DynamoDB RDS ECS containers ElastiCache Lambda functions feed services EC2 instances search (ECS&OpenSearch Service化予定) ©NewsPicks Inc. All Rights Reserved. OpenSearch Service 社内・法人向けシステム Database services batch services … Parameter Store … … billing services … Storage S3 S3 Glacier
02 複数のチームが開発するため開発環境もチーム数以上に必要 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services 本番 Aurora DynamoDB リポジトリ (GitHub) 開発者 コード ElastiCache preview1 preview2 preview3 preview4 本番環境 preview環境 × 4 dev環境 × 14 ChatOps (Slack) RDS bastion AWS Cloud (Development) EC2 instances Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) Slackにデプロイコマンド実行 (本番環境) ChatOps (Slack) EC2 instances Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services bastionからgit pull & build 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) EC2 instances ChatOps (Slack) Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) ビルドしたモジュールを EC2 instances 配付してサーバー再起動 Database services 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) EC2 instances ChatOps (Slack) Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) Slackにデプロイコマンド実行 (dev-1環境) ChatOps (Slack) EC2 instances Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) bastionからgit pull & build EC2 instances ChatOps (Slack) Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 EC2時代は、ビルド・デプロイが同じタイミングだった 本番/開発環境構成図(EC2時代) AWS Cloud (Production) EC2 instances Database services 本番 リポジトリ (GitHub) 開発者 Aurora DynamoDB RDS ElastiCache bastion preview1 preview2 preview3 preview4 コード AWS Cloud (Development) ビルドしたモジュールを 配付してサーバー再起動 EC2 instances ChatOps (Slack) Database services dev-1-bastion dev-1-server Aurora DynamoDB RDS ElastiCache dev-2-bastion dev-2-server Aurora DynamoDB RDS ElastiCache ビルド・デプロイ … × 14 ©NewsPicks Inc. All Rights Reserved.
02 安全かつ高速なデプロイとは言い難かった 安全面の課題 ○ リリースは全サーバーに一斉に展開されるため、バグがあった場合に 全ユーザーが影響を受けてしまう ○ シェルスクリプトによるモジュール配付&サーバー再起動のローリングアップデートが雑な ので、リリースのたびにパフォーマンス低下につながりやすい 速度面の課題 ○ デプロイする段階でビルドが実行されるためデプロイしようとしても ビルドの待ち時間が発生する ○ 環境間でアセットを共有していないため、同じリビジョンでも別環境に デプロイする時は再度ビルドの待ち時間が発生する ©NewsPicks Inc. All Rights Reserved.
03 安全かつ高速にデプロイできる CI/CDパイプライン構築の取り組み ©NewsPicks Inc. All Rights Reserved.
03 インフラ環境・CI/CDパイプラインの構築にはAWS CDKを採用 AWS Cloud Development Kit (AWS CDK) AWS CDK(TypeScript)の採用 AWSのマネージドサービスを最大限に活用し、 最高の開発者体験を追求するために、 NewsPicksではAWS CDKを全面採用 [AWS Black Belt Online Seminar] AWS Cloud Development Kit (CDK) https://d1.awsstatic.com/webinars/jp/pdf/services/2020 0303_BlackBelt_CDK.pdf ©NewsPicks Inc. All Rights Reserved. NewsPicksの開発者は普段からDynamoDBやSQS をアプリケーションから利用していて、AWSの SDKやサービスの開発知識を持っているので、 TerraformなどのDSLよりも、プログラミング言 語からSDKを使う感覚で利用できるCDK with TypeScriptの方が読みやすく書きやすいと判断
03 安全かつ高速にデプロイできるよう、課題を取り除く 安全面の課題 ○ リリースは全サーバーに一斉に展開されるため、バグがあった場合に 全ユーザーが影響を受けてしまう ○ シェルスクリプトによるモジュール配付&サーバー再起動のローリングアップデートが雑な ので、リリースのたびにパフォーマンス低下につながりやすい 速度面の課題 ○ デプロイする段階でビルドが実行されるためデプロイしようとしても ビルドの待ち時間が発生する ○ 環境間でアセットを共有していないため、同じリビジョンでも別環境に デプロイする時は再度ビルドの待ち時間が発生する ©NewsPicks Inc. All Rights Reserved.
03 ECSサービスを2つ用意し、動作確認可能なCanaryを構築 AWS Cloud (Production) 本番構成図(ECS化後〜) ECS containers Database services スマホアプリ・Web api service 通常のユーザーは 1/タスク数だけ Canaryに接続 開発者 E2Eテスト Headerをつけて アクセスすると Canaryに接続 … Application Load Balancer Aurora DynamoDB RDS ElastiCache Canary api service AWS Cloud (Development) ECS containers Database services dev-1 api service ※dev環境は Canaryなし ©NewsPicks Inc. All Rights Reserved. … Application Load Balancer … × 14 Aurora DynamoDB RDS ElastiCache
03 ECSサービスを2つ用意し、動作確認可能なCanaryを構築 AWS Cloud (Production) 本番構成図(ECS化後〜) ECSサービスの登録ターゲット ECS containers グループを同一に指定する スマホアプリ・Web Database services api service 通常のユーザーは 1/タスク数だけ Canaryに接続 開発者 E2Eテスト Headerをつけて アクセスすると Canaryに接続 … Application Load Balancer ElastiCache AWS Cloud (Development) dev-1 api service ©NewsPicks Inc. All Rights Reserved. RDS Canary api service ECS containers ※dev環境は Canaryなし Aurora DynamoDB … Application Load Balancer … × 14 Database services 登録済みターゲット のうち1台がCanary になる Aurora DynamoDB RDS ElastiCache
03 ECSサービスを2つ用意し、動作確認可能なCanaryを構築 AWS Cloud (Production) 本番構成図(ECS化後〜) ALBのリスナールールでHTTP ECS containers ヘッダーベースのルール追加 Database services スマホアプリ・Web api service 通常のユーザーは 1/タスク数だけ Canaryに接続 開発者 E2Eテスト Headerをつけて アクセスすると Canaryに接続 … Application Load Balancer Aurora DynamoDB RDS ElastiCache Canary api service 登録済みターゲット1台のみの Canary専用ターゲットグループに接続する AWS Cloud (Development) ECS containers Database services dev-1 api service ※dev環境は Canaryなし ©NewsPicks Inc. All Rights Reserved. … Application Load Balancer … × 14 Aurora DynamoDB RDS ElastiCache
03 CDKを利用して、環境ごとの要件に対応可能なConstructを作成 ALB1つにつきリスナー2、リスナールール 15〜18、ターゲットグループ4〜7を 単一のConstructの呼び出しで作成できる 例:環境ごとにCanaryを作成するかどうかを Propsとして指定して、必要なら作成する ©NewsPicks Inc. All Rights Reserved.
03 ChatOps + Step Functionsによる安全なリリースの自動化 ChatOpsでリリースの心理的安全性を向上 Step Functionsでリリースのワークフローを制御 Canaryで事前E2Eテスト・リリース判断ができる 上に、ロールバックもボタン一つで自動化 詳細は 「NewsPicks ChatOps」 で検索して ブログ記事をどうぞ ©NewsPicks Inc. All Rights Reserved.
03 安全かつ高速にデプロイできるよう、課題を取り除く 安全面の課題 ○ リリースは全サーバーに一斉に展開されるため、バグがあった場合に 全ユーザーが影響を受けてしまう ○ シェルスクリプトによるモジュール配付&サーバー再起動のローリングアップデートが雑な ので、リリースのたびにパフォーマンス低下につながりやすい 速度面の課題 ○ デプロイする段階でビルドが実行されるためデプロイしようとしても ビルドの待ち時間が発生する ○ 環境間でアセットを共有していないため、同じリビジョンでも別環境に デプロイする時は再度ビルドの待ち時間が発生する ©NewsPicks Inc. All Rights Reserved.
03 ECSとASGの機能でローリングアップデートの安全性を制御 NewsPicksのアプリケーション特性として起動直後から十全の性能ではない ○ インメモリキャッシュを利用しているため、ある程度リクエストを受け付けないとキャッシュが 温まらない ○ Server-Side Kotlinのアプリケーションは JVMで動いている。 JITコンパイラにより、 処理が実行されるたびプロファイルが蓄積され動的にバイトコードを変換していくので、起 動直後は最適な処理性能を発揮できない可能性がある ローリングアップデートの安全性を制御 ○ 急激にタスクが入れ替わって起動直後のタスクばかりにならないようにする ○ タスクを増やしすぎて DBのコネクションを張りすぎないようにする ©NewsPicks Inc. All Rights Reserved.
03 ECSとASGの機能でローリングアップデートの安全性を制御 ECSのデプロイメントの設定・デプロイメントサーキットブレイカー ○ 最大実行タスクの制限と、デプロイが失敗した時の自動ロールバックを有効化 ECS on EC2なら、Auto Scaling Groupの設定でEC2の台数にも上限を設定できる ○ ECSのデプロイメントの最大実行タスクは Auto Scalingでの必要数の変動によって 変わるため、明確な台数制限がしたければ ©NewsPicks Inc. All Rights Reserved.
03 ECSとASGの機能でローリングアップデートの安全性を制御 CDKで最大ECSタスク数に対する加算でASGの最大キャパシティを設定 ○ これにより、タスク数が少ない時は 150%で程よくローリングアップデートしつつ、 ○ タスク数が最大の時は +2台までに制限して低速のローリングアップデートで DBコネクションの張りすぎを防ぐ ©NewsPicks Inc. All Rights Reserved.
03 安全かつ高速にデプロイできるよう、課題を取り除く 安全面の課題 ○ リリースは全サーバーに一斉に展開されるため、バグがあった場合に 全ユーザーが影響を受けてしまう ○ シェルスクリプトによるモジュール配付&サーバー再起動のローリングアップデートが雑な ので、リリースのたびにパフォーマンス低下につながりやすい 速度面の課題 ○ デプロイする段階でビルドが実行されるためデプロイしようとしても ビルドの待ち時間が発生する ○ 環境間でアセットを共有していないため、同じリビジョンでも別環境に デプロイする時は再度ビルドの待ち時間が発生する ©NewsPicks Inc. All Rights Reserved.
03 CIでECRにイメージを作成し、いつでもデプロイできるようにした 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード ChatOps (Slack) デプロイ ©NewsPicks Inc. All Rights Reserved. Database services featureブランチにpushするとCIが走り コミットIDタグでコンテナイメージがECRに登録される Aurora DynamoDB RDS ElastiCache
03 CIでECRにイメージを作成し、いつでもデプロイできるようにした 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード API Gateway Step Functions ChatOps (Slack) デプロイ ChatOpsで「@deploybot release」すると Step Functionsが起動 ©NewsPicks Inc. All Rights Reserved. Database services Aurora DynamoDB RDS ElastiCache
03 CIでECRにイメージを作成し、いつでもデプロイできるようにした 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード API Gateway ChatOps (Slack) デプロイ ©NewsPicks Inc. All Rights Reserved. Database services Aurora DynamoDB RDS ElastiCache Step Functions 対象のコミットIDタグで作成されたECRイメージが 存在するかを確認し、次のステートへ CodeBuildのCIが実行中でも 失敗しないよう、Wait→Checkの繰り返しでCIの完了待機
03 DB作業もコードレビューでチェックして自動化 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード API Gateway Database services Aurora DynamoDB RDS ElastiCache Step Functions CodeBuild ChatOps (Slack) デプロイ ©NewsPicks Inc. All Rights Reserved. DBの更新がある場合はflywayのDB Migrationを実行
03 Canaryを先にリリースして全ユーザーの数%に新バージョン解放 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード デプロイ ©NewsPicks Inc. All Rights Reserved. Aurora DynamoDB RDS Canary api service API Gateway ChatOps (Slack) Database services Step Functions Canaryのサービスのみを更新。 LambdaからECSタスク定義登録・ECSサービス更新 ElastiCache
03 開発者の動作確認と並行してE2Eテストが自動で実行される 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード デプロイ ©NewsPicks Inc. All Rights Reserved. Aurora DynamoDB RDS ElastiCache Canary api service API Gateway ChatOps (Slack) Database services Step Functions Canaryのサービスが更新されるとE2Eテストが実行される Slackに通知が来るのでE2Eテスト結果を確認しながら、 開発者もCanaryにアクセスして動作確認ができる。
03 全ての確認後、全体適用ボタンで展開 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) ECS containers CodeBuild ECR api service … リポジトリ (GitHub) 開発者 コード Database services Aurora DynamoDB RDS ElastiCache Canary api service API Gateway Step Functions 問題がなければ全体適用ボタンを押すと本番のサービスも 更新する。問題があればCanaryをロールバックする ChatOps (Slack) デプロイ ©NewsPicks Inc. All Rights Reserved.
03 安全かつ高速にデプロイできるよう、課題を取り除く 安全面の課題 ○ リリースは全サーバーに一斉に展開されるため、バグがあった場合に 全ユーザーが影響を受けてしまう ○ シェルスクリプトによるモジュール配付&サーバー再起動のローリングアップデートが雑な ので、リリースのたびにパフォーマンス低下につながりやすい 速度面の課題 ○ デプロイする段階でビルドが実行されるためデプロイしようとしても ビルドの待ち時間が発生する ○ 環境間でアセットを共有していないため、同じリビジョンでも別環境に デプロイする時は再度ビルドの待ち時間が発生する ©NewsPicks Inc. All Rights Reserved.
03 dev環境でも同じECRのイメージを参照し全環境でアセットを共有 本番/開発環境構成図 (ECS化後〜) AWS Cloud (Production) Database services ECS containers CodeBuild ECR api service … Aurora DynamoDB リポジトリ (GitHub) 開発者 RDS ElastiCache コード AWS Cloud (Development) dev環境では環境名とデプロイしたいブランチを指定 ECS containers ChatOps (Slack) Database services dev-1 api service デプロイ … × 14 API Gateway Aurora DynamoDB RDS ElastiCache Step Functions Canaryはないのでビルドが終わっていれば即デプロイされる ©NewsPicks Inc. All Rights Reserved.
04 開発者体験への効果と今後の展望 ©NewsPicks Inc. All Rights Reserved.
04 安全かつ高速にデプロイできるCI/CDパイプライン 安全面 ✅ Canaryを別のECSサービスとして用意したことで、手動での動作確認・自動 E2Eテストを 行った後で自信を持ってリリースできるようになった。入社間もないメンバーのリリースに対 する不安や覚えることを減らすのに役立った ✅ ECSのマネージドなローリングアップデートに任せて、サイトに負荷が集中するタイミングを 意識せずに好きな時間でリリースできるようになった 速度面 ✅ リモートブランチに pushやmergeをしていれば、裏で CIのビルドが動いて デプロイしたいタイミングで即座にビルドできるようになった ✅ 本番とdevで同じコンテナイメージを使うことで全体でビルド時間が削減された ©NewsPicks Inc. All Rights Reserved.
04 共通バックエンドのCI/CDによって他のサービスにも良い影響が 入社半年のメンバーが法人サービスの管理画面のリリースをChatOps化 > こちらの方法でもすでにかなり簡単なのですが、何せNewsPicks のバックエンドはSlackのコマンドほぼ1つで リリースできてしまうので、管理画面ももっと簡単にしたい!と思い、 下記のように変更してみました。 https://tech.uzabase.com/entry/2023/01/27/164302 ©NewsPicks Inc. All Rights Reserved.
04 ● まとめ よかったこと ○ 安全かつ高速にデプロイできるCI/CDパイプラインを構築するために、Code PipelineやCode Deployの機能では不足していたためStep FunctionsとLambdaで作り込むことになったが、 CDKのおかげで開発はとてもしやすく、メンテナンスもスムーズにできている ○ ● 良い開発者体験は、メンバーの意識を高め新たな良い開発者体験を作る 今後の改善点 ○ ビルドの時間の高速化、自動E2Eテストの安定化など超快適というにはまだ課題がある ○ CI/CDパイプラインの改善に開発者が積極的に参加するには仕組みの認知負荷も高いので、 CDKやAWSサービスの活用方法のナレッジ共有をはじめ組織として習熟度を上げたい ©NewsPicks Inc. All Rights Reserved.
ご清聴ありがとうございました! NewsPicksではエンジニアを積極採用中です! https://tech.newspicks.com ©NewsPicks Inc. All Rights Reserved.