terraform について


はじめに

  • みんな大好き terraform をさくっと教えることになったのでさっと説明する資料。
  • クラウドやインフラにあまり明るくないとのことなのでイメージだけ。
  • PlantUML の練習も兼ねてる。Qiita ネイティブで書けると楽なんだけど。PlantUMLを書くツール

過去

一人でやってるうちは自己責任だしどうにでもなる。

  • マネジメントコンソールを使う
  • 再現性はない
  • サンプルのCloudFormationやドキュメントの手順

PlantUML コード
@startuml
actor UserA
UserA --> (Cloud)
@enduml

現在

複数人になると問題が出やすくなる。

  • 俗人化
  • 変更内容や日時が残らない(誰かの実施した変更がわからない)
  • 元に戻すのが困難になる
  • クラウド側も日々変更される
  • 再現性に乏しい(似たようなのをもう1つ作って)
  • セキュリティや機能面で複雑性が増す

PlantUML コード
@startuml
actor UserA
actor UserB
actor UserC
UserA --> (Cloud)
UserB --> (Cloud)
UserC --> (Cloud)
@enduml

未来

terraform により宣言的コードによるクラウドの抽象化が可能になった

  • コード管理(git)によって変更内容の記録が取りやすくなる
  • state の存在によってコードとリソースの差分が取得可能になる
  • 定期的な更新への追従で安定してリソースの管理が可能になる

PlantUML コード
@startuml

actor UserA
actor UserB
actor UserC

database Git
database State

UserA --> [terraform]
UserB --> [terraform]
UserC --> [terraform]

Git -right- [terraform]
State -left- [terraform]

[terraform] --> (Cloud)

@enduml

大事なこと

  • terraform (code) == state(状態) == クラウドリソース
  • あるべき状態を管理することができる
  • terraform が宣言的という理由であり、Pulumi や CDK/SDK/ベンダー提供のスタッキングツールとの違い
  • 実際のリソースからコードにフィードバックすることで状態を維持することもできる(Ansible の宣言的とは異なる部分)
  • Ansible は基本的に一方的であり、Ansible を使用して差分を取得してコード側を合わせるといった運用には向いていない
  • CloudFormation 等のベンダー提供ツールによるロックインを避け、適度に抽象化することでコマンド差異を軽減させることができ、マルチクラウド展開等に有利であることも terraform を選定する理由のひとつ

おまけ

念のため

  • Cloud 部分は AWS, GCP, Azure の他、terraform のプラグインの一部になる Provider が対応できればなんでもいい
  • コード管理ができているからといっていつでもどうにでもロールバックできるとは限らない(不可逆な変更はたくさんある)
  • pulumi は状態持ってるらしい?知らんけど
  • Provider は各クラウドのAPIやSDKを利用しているので、常に最新の機能が使えるとは限らない

おまけのおまけ

Ansible

PlantUML コード
@startuml

actor UserA

database Git
database Config


Git -right- [Ansible]

UserA --> [Ansible]

Config -left- [Ansible]
note top of Config
  Inventory
  Playbook
  Role
endnote

[Ansible] --> (Host)

note right of Host
  常に上書きされて
  最新になる
endnote

@enduml

Packer と Ansible

PlantUML コード
@startuml

actor UserA

database Git

# あー、ツールが古くて frame 形状にならなかった
package PackerAnsible <<Frame>> {
  [Packer]
  [Ansible]
}

Git -- PackerAnsible

UserA --> PackerAnsible

Packer -> Ansible

PackerAnsible --> (AMI)

note right of AMI
  常に上書きされて
  最新になる
endnote

@enduml


2018年にAnsible NightでLTした内容