Slide 1

Slide 1 text

AWS CodePipelineで実現するCI/CD自動化 〜コミットからデプロイまで〜 2019/7/4 スペースマーケット 藤田勇希

Slide 2

Slide 2 text

2 自己紹介 ● 藤田 勇希 ● バックエンドエンジニア ● 2018年11月にスペースマーケット入社 ● 最近は1日1本映画見てる ● 好きな AWS サービス ○ AWS Lambda ○ AWS Dynamodb ○ AWS Batch ○ AWS CodePipeline

Slide 3

Slide 3 text

3 今日お話すること ● AWS CodePiepeline とは? ● CI/CD の基本 ● スペースマーケットの CI/CD の事例 ○ CodePipeline 導入前の課題 ○ CodePipeline 導入後に解決したこと ● AWS CodePipeline 導入に取り組んで得たノウハウ ○ 様々なシナリオへの応用 ○ CI/CD の仕組みを横展開するためには

Slide 4

Slide 4 text

4 今日お話しないこと ● CI/CD の細かいお話 ● 発表に登場する AWS 各サービスの細かい説明 ● AWS CodePipeline の具体的な設定方法 ○ スペースマーケットの tech ブログに書きました! ○ 「AWS CodePipeline で CI/CD の仕組みを構築したお話」で検索!

Slide 5

Slide 5 text

5 AWS CodePipeline とは

Slide 6

Slide 6 text

6 AWS の公式説明より

Slide 7

Slide 7 text

7 もうちょっと詳しく AWS CodePipeline は完全マネージド型の継続的デリバリーサービスで、 素早く確実性のあるアプリケーションとインフラストラクチャのアップデートのための、パ イプラインのリリースを自動化します。 ー AWS 公式ドキュメントより

Slide 8

Slide 8 text

8 つまり AWS CodePipeline は ● 面倒くさい部分は AWS が管理してくれて ● 継続的にプロダクトの自動的なリリースを実現する CI/CD プロダクトなのです。 「自動化」・・・好きですよね?

Slide 9

Slide 9 text

9 CI/CD の基本

Slide 10

Slide 10 text

10 突然ですが・・・ Web サービスを作ったので 代わりにインターネット上に 公開してくれませんか? ソースコードは に push しておきましたので。 どうする?

Slide 11

Slide 11 text

11 一例 push pull 必要があれば Build Amazon EC2 Amazon S3 配置 配置 配置

Slide 12

Slide 12 text

12 場合によっては バグが見つかりました。 修正しましたので、再度 デプロイしてくれませんか? ソースコードは に push しておきましたので。 どうする?

Slide 13

Slide 13 text

13 やることは一緒(再掲) push pull 必要があれば Build Amazon EC2 Amazon S3 配置 配置 配置

Slide 14

Slide 14 text

14 更には 品質も大事なので テストコードを追加しました。 テストコードも実行してください。 ソースコードは例の通り に push しておきましたので。 どうする?

Slide 15

Slide 15 text

15 テストコードの実行が必要 push pull 必要があれば Build Amazon EC2 Amazon S3 配置 配置 配置 テストコード 実行 +

Slide 16

Slide 16 text

16 何回もやるとなる面倒くさい!

Slide 17

Slide 17 text

17 しかし、何回も繰り返す必要があるんです! ● 開発の単位を小さくして早いペースで 実装 > テスト > デプロイ を繰り返す ○ スピードは上がりそうだけど、品質の担保は必要 ○ テストを繰り返し実行する必要がある ○ デプロイ作業が増える ● 実装 > テスト > デプロイ をできるだけ自動化したい! プロダクトの成長にスピードと品質の両立が求められる昨今(アジャイル開発) CI/CD

Slide 18

Slide 18 text

18 CI/CD のフェイズ概念

Slide 19

Slide 19 text

19 ざっくりと図で表すと

Slide 20

Slide 20 text

20 Continuous Integration(CI) Code > Build > Test > Code > Build > Test ・・・ のサイクルを高速に回して開発スピードと品質の担保を実現するのが Continuous Integration(CI)

Slide 21

Slide 21 text

21 Continuous Delivery, Deploy(CD) CI に加えて変更内容をステージング環境などに自動的に反映して リリース可能な状態に持っていくのが Continuous Delivery(CD) CD の中でも自動的に本番環境にリリースを行うのが Continuous Deploy(CD)

Slide 22

Slide 22 text

22 スペースマーケットの CI/CD 事例

Slide 23

Slide 23 text

23 スペースマーケットの CI/CD 概要

Slide 24

Slide 24 text

24 CodePipeline 導入前の課題 ● Circle CI でビルド・テスト・デプロイのパイプラインを構築していた ○ フロントエンド・バックエンドの複数のシステムが Circle CI を使っていた ○ ジョブの同時実行数の上限の関係で CI/CD の待ち時間が増えてきた ● (AWS ECS へのデプロイも自前で作る必要があった) CI/CD は構築していたけど、デプロイされるまでの待ち時間が問題に・・ Job Job Job Job Job

Slide 25

Slide 25 text

25 新しい CI/CD への要求

Slide 26

Slide 26 text

26 CI/CD の開始の合図はリポジトリへの Push で! ビルドやデプロイの実行のために AWS のコンソールに入って・・・ みたいなことは避けたいな GitHub への push は必ず行うから それ以降は自動がいいな CodePipeline の GitHub Webhook 連携

Slide 27

Slide 27 text

27 Webpack の実行や Docker のビルドも自動的にやって! jsトランスパイルや画像の最適化 は自動的にやってほしいし ECS で動かすために Docker イメージの ビルドとかはいい感じに やっててほしいな CodeBuild の buildspec.yml で指定

Slide 28

Slide 28 text

28 テストコードの実行とかもできないとね! ローカルで単体テストコードを 実行することはできるけど QA用のカバレッジレポート等は リモート上で共有できるようにしたい CodeBuild の buildspec.yml で指定

Slide 29

Slide 29 text

29 ビルド・テストまで自動でやってくれるならば、デプロイも! CI を自動化してくれるならば CD もやってくれると嬉しいな ECS のタスクの置き換えを手動でやるの は事故が怖いしね CodePipeline×ECS の シームレス連携

Slide 30

Slide 30 text

30 導入前の課題とCI/CD への要求を踏まえて 頑張ってみました

Slide 31

Slide 31 text

31 新しい CI/CD(再掲)

Slide 32

Slide 32 text

32 CodePipeline 導入後に解決したこと ● CodePipeline による実行の時間だけで、他の要因はなくなった ○ (before) 最大1時間近く待つ -> (after) 安定して 20分ぐらい ● AWS ECS へのデプロイも CodePipeline の標準の機能でカバーできる ● CloudWatchEvent などの他の AWS サービスとの連携が楽なので夢が広がる ○ デプロイ完了後の Slack への通知も設定 CI/CD が独立したので Circle CI の制限に引っかからなくなった

Slide 33

Slide 33 text

33 CI/CD を構築する側も使う側もハッピー!

Slide 34

Slide 34 text

34 AWS CodePipeline 導入に取り組んで得たノウハウ

Slide 35

Slide 35 text

35 設定次第で様々な自動化が可能 ● 開発環境のアプリケーションを現在の本番環境に追従させる ○ 毎日決まった時間に、各システムの master ブランチに対して CI/CD 回す ○ デプロイ先を開発環境に向けた version の CodePipeline を作るだけ ○ CloudWatchEvent で定期スケジュールで CodePipeline の実行設定可能 ● バッチや migration 用のタスクの CI 構築 ○ バッチや migration の実行内容の実装 > ビルド > テストだけ自動化 ○ 実行は AWS Batch で設定 or 手動で実行などなど ○ バッチや migration の内容の CI と、実行のサイクルを分離 カスタマイズ次第で色々なシナリオに対応できる

Slide 36

Slide 36 text

36 こんな使い方も

Slide 37

Slide 37 text

37 こんな使い方も Aの Pipeline Bの Pipeline Cの Pipeline Dの Pipeline Eの Pipeline 複数システムの CI/CD を同時に並列で 実行する Pipeline を作る

Slide 38

Slide 38 text

38 CI/CD の仕組みを横展開するには ● コード化すると設定の変更・変遷を Git 管理&レビューできる ● 横展開する際もコードの一部の値を書き換えて実行するだけで、安全&確実 ○ AWS CloudFormation ○ Terraform(今回私はこちらを使って横展開しています) 構築した AWS CodePipeline の設定をコード化する 構文やルールを理解するために 多少の学習コスト入りますが・・・

Slide 39

Slide 39 text

39 ちなみに・・・ 前回私が投稿した tech ブログのエントリーより抜粋 Terraform を使ったコード化のお話も記事にしますので 興味のある方はチェックしてみてください!

Slide 40

Slide 40 text

40 CodePipeline で素敵な CI/CD ライフを!

Slide 41

Slide 41 text

41 ご清聴ありがとうございました! 「踏み込んだ CI/CD 論を語りたい」「今回使った AWS サービスの話などをもっと聞きたい」 という方はこの後の懇親会で是非お声掛けください!

Slide 42

Slide 42 text

No content