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 を選定する理由のひとつ
おまけ
- terraform は HashiCorp の製品
- Golang で書かれている
- tfenv を利用することで、複数バージョンに対応しやすくなる
- direnv を利用することで、環境別のクレデンシャルも管理しやすくなる
- Ansible とは棲み分けが大事
- Twitter と slack でユーザコミュニティやってるので活用してね(宣伝)
念のため
- 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
Author And Source
この問題について(terraform について), 我々は、より多くの情報をここで見つけました https://qiita.com/raki/items/9a2d27831ea225f73602著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .