↓の本の「1章 なぜTerraformを使うのか」のメモを残します。
DevOpsとは?
DevOpsとは、
開発(Dev)チーム:新機能追加などデプロイをどんどんしたい
運用(Ops)チーム:本番障害などを考慮するとあまりデプロイをしたくない
逆の考え方を持つ、2つのチームが協力して仕事をすることを指します
ゴール
この本では↓のようにDevOpsのゴールを定義しています
ソフトウェアのデリバリを今までよりはるかに効率的にすること
メリット
- 耐障害性が増す、そもそもの障害が減る
- リードタイム(アイデアを思いついてからデプロイするまでの時間)の短縮
- 運用にかけるコストが減り、開発にコストをかけられる
- デプロイの回数をあげられる etc…
コアバリュー
- 文化(Culture)
- 自動化(Automation)
- 計測(Measurement)
- 共有(Share)
の4つがDevOpsのコアバリューになります。
今回は自動化に焦点を当てており、実現する考え方としてInfrastructure as Codeがあります
Infrastructure as Codeとは?
Infrastructure as Code = コードを通じてインフラを管理すること
5つのカテゴリ
- アドホックなスクリプト
BashやPythonなどでスクリプトを作成しサーバ上で実行。
スクリプトを書いた人に属人化してしまい管理が大変。 - 設定管理ツール
サーバの設定をコードで管理するツール。
ex) Ansible, Chef, Puppet - サーバテンプレーティングツール
サーバのスナップショットを使ったイメージを作成するツール。
インストールはAnsibleなど別のツールを使用する。
ex) Docker, Packer, Vagrant - オーケストレーションツール
仮想マシンやコンテナを管理するツール。
ex) Kubernetes, ECS, Docker Swarm - プロビジョニングツール
サーバ、LBなどあらゆるインフラに関するリソースを作成するツール。
ex) Terraform, CloudFormation, Pulumi
Infrastructure as Codeのメリット
インフラをコードで管理する利点は何でしょうか?
例えば、
- 安全で高速なデプロイができる
- 属人化がなくなる
- バージョン管理できるのでコミット履歴が追える
- コードへテストやLintを適用できる
- 再利用できるので毎度0からインフラを構築する必要がなくなる
- 手動で作業するよりもコードを書く方が楽しい!!
などが挙げられます。
Terraformはどう動くのか
- .tfという拡張子のファイルに作成したインフラリソースを定義
- 「terraform apply」 というコマンドをうつ
- 1. で定義した内容で各クラウドプロバイダなどのAPIをたたいてくれる
ex) EC2やALBを作成したい ⇒ AWSのAPIをたたいて作成
Terraformと他のIaCツールとの比較
ミュータブルなインフラか、イミュータブルなインフラか
ミュータブルなインフラ:既存のリソースに変更を加える
イミュータブルなインフラ:変更を適用したリソースを新規に作成し、既存と入れ替える
⇒Terraformはおおよそこっち
手続き型言語か、宣言型言語
手続き型言語:手順を1つずつ書いていく。現在のリソースの状況把握やコードの再利用性に乏しい
宣言型言語:リソースの最終的な状態を書いていく。
⇒Terraformはこっち
汎用言語か、ドメイン特化言語か
・汎用言語
Java, Python, JavaScriptなど一般的なプログラミング言語。
既習の言語で書ける、ライブラリやテストなどツールが豊富、複雑な処理が書ける
などのメリットあり
・ドメイン特化言語
HCLやYAMLなど特定の分野にのみ特化した言語。
学習コストが低い、見やすい、書き方が属人化しにくいなどのメリットあり。
TerraformはHCLというドメイン特化言語を使用する。
マスタサーバやエージェントが必要か
マスタサーバ:インフラの状態を保存したり、クライアントに更新を反映する
エージェント:バックグラウンドで動作し、最新の設定に自動で更新してくれる
一見、便利に見えるマスタサーバやエージェントですが、
- 余計なインフラリソースを管理しなければならない。
- バージョンなどの保守をしなければならない。
- マスタサーバやエージェント用に通信を許可しなければならない。
- 不具合時に原因の切り分けが大変。
などデメリットもあり。
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の学習コストが高い
次章のメモ
コメント