DevOps

改めて DevOps についておさらい。
DevOps のメリットや仕組み、あと適用する際の注意点などについて。

# DevOps とは

DevOps とは、開発者 (Development) と運用者 (Operation) の業務を統合し自動化することで、開発効率化と迅速なリリースを実現し、高品質なよりよいサービスを提供していく仕組みです。

# DevOps のメリット

DevOps の直接的なメリットは先ほど記載した通り開発の高速化と迅速なリリースです。
また、モニタリングを行えることによりシステム運用の安定化にもつながります。

## 品質の向上

テストを継続的かつ頻繁に行うことにより、ソフトウェアの品質を上げることができます。

## デリバリーの迅速性

ソフトウェアのデプロイを自動化するとにより、迅速なリリースが可能になります。また、テストを頻繁に行うことも、品質が保証されたソフトウェアを高頻度でリリースできることになり、デリバリーの迅速性に貢献します。

## 開発とシステム運用のコストメリット

開発とシステム運用の垣根を取り去り、一つのチームで簡略化されたプロセスを利用して仕事をすることにより、 DevOps を採用しなかった場合より低コストでシステムの開発から運用までを運営することができます。

# DevOps の仕組み

## CI/CD

CI (継続的インテグレーション、 Continuous Integration) は、ソフトウェアを継続的に統合 (構築) する仕組みです。
ソフトウェアをビルドし、ビルドした成果物に対してテストを行うまでを自動的に繰り返し行います。
ビルドとテストを定期的に繰り返し行うことにより、ソフトウェアの品質を上げ、不具合が発生するリスクを低減します。

CD (継続的デリバリー、Continuous Delivery) は、 CI で構築したソフトウェアを継続的に環境にリリースする仕組みです。
CI で構築された高品質なソフトウェアを、高頻度にリリースできる仕組みを用意することにより、ユーザーから要求された機能を迅速に提供できるようになります。

CI/CD では、ビルドからテスト、リリースまでを自動化したシステムの上で継続的に実施することにより、高品質なアプリケーションを高頻度かつ迅速に提供することができるようになります。

### Pipeline

CI/CD を実現するために、テストやデプロイを自動化する仕組みとしてPipeLineがあります。
Pipeline は、リリースまでに必要な作業を計画し、設定を行うことによって自動化することができます。

Pipeline では、アプリケーションのビルドとテストを行い、問題がなければそれらを対象の環境にデプロイします。

```mermaid
flowchart TB
  subgraph Operation[作業]
    Development([Development])
    Merge([Merge])
    subgraph Pipeline
      Build([Build])
      Test([Test])
      Deploy([Deploy])
    end
  end

  subgraph Environment[環境]
    GitRepository[(Git Rpository)]
    BuidEnvironment[ビルド環境]
    TestEnvironment[テスト環境]
    ReleaseEnvironment[リリース環境]
  end

  Development==>Merge
  Merge==>|Mergeを検知してPipelineを実行| Build
  Build==>Test==>Deploy

  Merge-->GitRepository
  Build-->BuidEnvironment
  Test-->TestEnvironment
  Deploy-->ReleaseEnvironment

  GitRepository-.->BuidEnvironment
  GitRepository -.-> Build
  BuidEnvironment-.->TestEnvironment
  BuidEnvironment-.->ReleaseEnvironment

  BuidEnvironment ~~~ Test
  TestEnvironment ~~~ Deploy
  
  style Operation fill: #ffffff
  style Environment fill: #ffffff
```

## デプロイの方式

### IaC (Infrastructure as Code)

IaC は、ソフトウェア開発のプラクティスをインフラのオートメーションに活かすアプローチです。[^1]
変更の容易性や、生成された成果物の同一性など、プログラムのコードの利点をインフラ構築に利用します。そのため、インフラの設定はコードとして定義され、その定義に即してインフラが構築されます。

### コンテナ化

DevOps ではコンテナ化の技術を利用することにより、統一された構成の環境を提供し、バージョンアップ時の瞬間的なリリースの実現や、スケーリングによる可用性や拡張性の機能を提供します。

## モニタリングとロギング

DevOps を実現するにあたって、モニタリングとロギングによる監視は安定したシステムを提供し、ユーザーが体験するサービスの提供状況を把握するために必要不可欠です。
そのため、 DevOps 環境ではサーバーの死活監視や負荷状況、サービス提供状況を監視し、フィードバックを迅速に環境に適用する必要があります。
また、大量に集まるログを一括管理し、得られた課題を開発や運用で把握し、迅速に対応して適用できる能力も持ちます。

## 共同作業とコミュニケーション

DevOps では開発と運用の円滑なコミュニケーションが不可欠です。
モニタリングやログインから得られた課題、ユーザーからのフィードバックを Issue 管理で管理し、継続的に対応することにより、安定性が高くユーザー要求に答えていくサービスを提供していくことができます。

# DevOps の注意点

## DevOps の向き不向きを考える

DevOps は迅速なリリースが顧客の期待に応えることに貢献する環境において有益です。
リリース期間が長いものや、リリース規模が大きいものは、リリース後のフィードバックを迅速に開発に反映しても次のリリースまで時間がかかるため、適切にフィードバックループを回すことができません。

## スモールスタートの原則

DevOpsの適用においてもすもーすスタートの原則は有効です。
一部のサービスや小さい機能から始め、徐々に適用範囲を広げていく方法がよいでしょう。

## DevOps の文化の醸成

DevOps は自動化のツールや開発プロセスだけではなく、 DevOps という文化のことを指します。
DevOps の文化に合意しコミットメントすることが、 DevOps によるサービス提供を成功させるためには不可欠です。
開発と運用の間の垣根を取り払い、継続的かつ迅速なリリースに向けてチーム全員で取り組んでいく姿勢が望まれます。

[^1]:[Infrastructure 
as Code クラウドにおけるサーバー管理の原則とプラクティス Kief Morris 著、宮下 剛輔 監訳、長尾 高弘 訳](https://amzn.to/3UVxNvU)