【読書メモ】【1章】詳解 Terraform 第3版 ―Infrastructure as Codeを実現する

技術書

 

↓の本の「1章 なぜTerraformを使うのか」のメモを残します。

 

DevOpsとは?

 

DevOpsとは、

開発(Dev)チーム:新機能追加などデプロイをどんどんしたい

運用(Ops)チーム:本番障害などを考慮するとあまりデプロイをしたくない

逆の考え方を持つ、2つのチームが協力して仕事をすることを指します

 

ゴール

 

この本では↓のようにDevOpsのゴールを定義しています

ソフトウェアのデリバリを今までよりはるかに効率的にすること

 

メリット

 

  • 耐障害性が増す、そもそもの障害が減る
  • リードタイム(アイデアを思いついてからデプロイするまでの時間)の短縮
  • 運用にかけるコストが減り、開発にコストをかけられる
  • デプロイの回数をあげられる  etc…

 

コアバリュー

 

  1. 文化(Culture)
  2. 自動化(Automation)
  3. 計測(Measurement)
  4. 共有(Share)

の4つがDevOpsのコアバリューになります。

 

今回は自動化に焦点を当てており、実現する考え方としてInfrastructure as Codeがあります

 

Infrastructure as Codeとは?

 

Infrastructure as Code = コードを通じてインフラを管理すること

 

5つのカテゴリ

 

  1. アドホックなスクリプト
    BashやPythonなどでスクリプトを作成しサーバ上で実行。
    スクリプトを書いた人に属人化してしまい管理が大変。
  2. 設定管理ツール
    サーバの設定をコードで管理するツール。
    ex) Ansible, Chef, Puppet
  3. サーバテンプレーティングツール
    サーバのスナップショットを使ったイメージを作成するツール。
    インストールはAnsibleなど別のツールを使用する。
    ex) Docker, Packer, Vagrant
  4. オーケストレーションツール
    仮想マシンやコンテナを管理するツール。
    ex) Kubernetes, ECS, Docker Swarm
  5. プロビジョニングツール
    サーバ、LBなどあらゆるインフラに関するリソースを作成するツール。
    ex) Terraform, CloudFormation, Pulumi

 

Infrastructure as Codeのメリット

 

インフラをコードで管理する利点は何でしょうか?

例えば、

  • 安全で高速なデプロイができる
  • 属人化がなくなる
  • バージョン管理できるのでコミット履歴が追える
  • コードへテストやLintを適用できる
  • 再利用できるので毎度0からインフラを構築する必要がなくなる
  • 手動で作業するよりもコードを書く方が楽しい!!

などが挙げられます。

 

Terraformはどう動くのか

 

  1. .tfという拡張子のファイルに作成したインフラリソースを定義
  2. terraform apply」 というコマンドをうつ
  3. 1. で定義した内容で各クラウドプロバイダなどのAPIをたたいてくれる
    ex) EC2やALBを作成したい ⇒ AWSのAPIをたたいて作成

 

Terraformと他のIaCツールとの比較

ミュータブルなインフラか、イミュータブルなインフラか

 

ミュータブルなインフラ:既存のリソースに変更を加える

イミュータブルなインフラ:変更を適用したリソースを新規に作成し、既存と入れ替える
 ⇒Terraformはおおよそこっち

 

手続き型言語か、宣言型言語

 

手続き型言語:手順を1つずつ書いていく。現在のリソースの状況把握やコードの再利用性に乏しい

宣言型言語:リソースの最終的な状態を書いていく。
 ⇒Terraformはこっち

 

汎用言語か、ドメイン特化言語か

 

汎用言語
Java, Python, JavaScriptなど一般的なプログラミング言語
既習の言語で書ける、ライブラリやテストなどツールが豊富、複雑な処理が書ける
などのメリットあり

・ドメイン特化言語
HCLやYAMLなど特定の分野にのみ特化した言語
学習コストが低い、見やすい、書き方が属人化しにくいなどのメリットあり。

 

TerraformはHCLというドメイン特化言語を使用する。

 

マスタサーバやエージェントが必要か

 

マスタサーバ:インフラの状態を保存したり、クライアントに更新を反映する

エージェント:バックグラウンドで動作し、最新の設定に自動で更新してくれる

 

一見、便利に見えるマスタサーバやエージェントですが、

  1. 余計なインフラリソースを管理しなければならない。
  2. バージョンなどの保守をしなければならない。
  3. マスタサーバやエージェント用に通信を許可しなければならない。
  4. 不具合時に原因の切り分けが大変。

などデメリットもあり。

 

Terraformはマスタサーバ、エージェントどちらも不要。

 

複数のツールの組み合わせ

Terraform+Ansible

 

Terraformでインフラリソースを作成し、Ansibleでサーバ上の設定をする。

 

メリット

  • AnsibleとTerraformは組み合わせやすい
  • 追加のインフラが不要

 

デメリット

  • 規模が大きくなると、Ansibleを使うのが難しくなる

 

Terraform+Packer

 

Packerで仮想マシンのイメージを作成し、Terraformでインフラリソースをデプロイする。

 

メリット

  • 追加のインフラが不要
  • 組み合わせやすい

 

デメリット

  • 仮想マシンのビルドとデプロイに時間がかかる
  • Terraformでのデプロイ戦略に限りがある

 

Terraform+Packer+Docker+Kubernetes

 

Terraform:インフラリソースの作成

Packer:DockerやKubernetesを使えるサーバのイメージを作成

Docker:アプリケーションをコンテナ化

Kubernetes:アプリケーション全体の管理

 

メリット

  • 高機能なKubernetesを使える
  • コンテナの入れ替えなので、デプロイが速い

 

デメリット

  • 使うツールが多く複雑
  • Kubernetesの学習コストが高い

 

 

次章のメモ

 

コメント

タイトルとURLをコピーしました