はじめに
こんにちは、インフラエンジニアをしています。@hayaosatoです。
現在ディップではインフラのクラウドリソースの管理にTerraformを取り入れようと日々検証を行なっております。
その中でTerraformの環境分割はどのようにやるのか、自分なりに考えてみたので共有しようと思います。
参考程度に読んでいただけると幸いです。
よろしくお願い致します。
結論
早速結論ですが、Terraformの環境分割はModule
を用いて行いました。
ディレクトリ構成は以下のようになっております。
こちらのディレクトリ構成はこちら(https://qiita.com/shogomuranushi/items/e2f3ff3cfdcacdd17f99)を参考にさせていただきました。
├── provider.tf
│
├── production
│ ├── serviceA
│ │ ├── variables.tf
│ │ ├── outputs.tf
│ │ └── main.tf
│ ├── serviceB
│ └── serviceC
├── staging
├── development
│
├── examples
│ ├── variables.tf
│ ├── outputs.tf
│ └── main.tf
│
└── modules
└── resourceA
├── main.tf
├── outputs.tf
└── variables.tf
なぜこうしたか
Terraformの環境分割には大きくWorkspace
, Module
, ディレクトリ分割
があると思います。
今回、Module
での環境分割を選定した理由としては、
誤った環境へのリソース変更の適用を避けるためです。
terraformでのリソース変更では破壊的変更も起きるので一歩間違えると即、サービス障害となってしまいかねません。
なので環境分割方式の選定時はこれだけは担保しようと思っていました。
もちろん、気をつけなければどの環境分割方法でもミスは起こりますし、どの環境方法でもミスを起こさない事も可能です。
その中で比較ミスを起こしにくいものとして選定しました。
なぜModuleにしたのか
上記のように、環境をディレクトリ分割する事で、どの環境にいるのかがプロンプトに常に表示されるので
Module
かディレクトリ分割
にしようと思いました。
その中で、Module
を利用した方が共通部分のソースコード管理がしやすいのでModule
を利用することにしました。
サーバレス
現在は管理しているリソースの種類が少ないので現状の構成となっておりますが、
今後サーバレスなアーキテクチャを管理するとなると現状の構成のままでは上手くいかないのではないかと思います。
サーバレスなアーキテクチャはアプリケーションのソースコードと親和性が高いので、
現状の構成のようにインフラ定義のみのリポジトリに配置するよりDockerfileのような感じで
アプリケーションのリポジトリに配置するのが良いのではないかと思っています。
最後に
今回の構成は現状のリソース管理における管理構成として考えてみました。
今後のリソース状況によってはかなり変化するのかなと思っています。
引きづつきどのように管理することがより楽な運用を実現するか、考えて行きたいと思います。