Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Terraformディレクトリ構成のベスプラを考えてみた

 Terraformディレクトリ構成のベスプラを考えてみた

TatsuyaYamashita

April 12, 2022
Tweet

More Decks by TatsuyaYamashita

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 ⼭下 達也 - Work at - 技術開発本部 / 技術開発第⼆部⾨

    - エンジニア - Skill - AWS / Ruby(Ruby on Rails) / Terraform - SNS - Github︓https://github.com/tatsuya4150 - Qiita︓https://qiita.com/tatsuya4150 - Certificate 2
  2. モノリスな状態からの脱却 14 さらにリソース別で分けておく ./ ├── main.tf ├── outputs.tf ├── providers.tf

    └── variables.tf ./ ├── aws_ec2.tf ├── aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf 02 最初にやること
  3. モジュール毎の分割 19 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──

    aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
  4. モジュール毎の分割 20 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──

    aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
  5. モジュール毎の分割 21 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──

    aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf
  6. モジュール毎の分割 22 04 構造化その1 モジュール毎の分割 例えば… ./ ├── aws_ec2.tf ├──

    aws_iam_role.tf ├── aws_internet_gateway.tf ├── aws_rds.tf ├── aws_route.tf ├── aws_route_table.tf ├── aws_route_table_association.tf ├── aws_security_group.tf ├── aws_subnet.tf ├── aws_vpc.tf ├── outputs.tf ├── providers.tf └── variables.tf ./ ├── aws_ec2.tf ├── … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
  7. モジュール毎の分割 23 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── aws_ec2.tf ├──

    … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
  8. モジュール毎の分割 24 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── aws_ec2.tf ├──

    … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
  9. モジュール毎の分割 25 04 構造化その1 モジュール毎の分割 さらに残りのファイルもモジュール化 ./ ├── main.tf ├──

    modules │ ├── ec2 │ │ └── aws_ec2.tf │ │ └── variables.tf │ ├── iam_role │ │ └── aws_iam_role.tf │ │ └── variables.tf │ ├── rds │ │ └── aws_rds.tf │ │ └── variables.tf │ ├── security_group │ │ └── aws_security_group.tf │ │ └── variables.tf │ └── vpc │ └── … │ └── variables.tf ├── outputs.tf └── providers.tf ./ ├── aws_ec2.tf ├── … ├── modules │ └── vpc │ └── aws_internet_gateway.tf │ └── aws_route.tf │ └── aws_route_table.tf │ └── aws_route_table_association.tf │ └── aws_subnet.tf │ └── aws_vpc.tf │ └── variables.tf ├── main.tf ├── outputs.tf └── providers.tf
  10. モジュール毎の分割 29 04 構造化その1 モジュール毎の分割 • モジュールは下記を意識して設計する - 疎結合︓他のモジュールに依存しないようにまとめる -

    ⾼凝集︓同じタイミング、同じ理由で変更するリソースをまとめる - 認知的負荷︓モジュールの⼊⼒値から必須項⽬を減らして、オプション項 ⽬を増やす
  11. 環境毎の分割 36 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──

    modules │ └── … ├── outputs.tf └── providers.tf
  12. 環境毎の分割 37 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──

    modules │ └── … ├── outputs.tf └── providers.tf
  13. 環境毎の分割 38 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├──

    modules │ └── … ├── outputs.tf └── providers.tf
  14. ./ ├── environments │ ├── development │ │ ├── main.tf

    │ │ ├── outputs.tf │ │ └── providers.tf │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── staging │ ├── main.tf │ ├── outputs.tf │ └── providers.tf └── modules └── … 環境毎の分割 39 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├── modules │ └── … ├── outputs.tf └── providers.tf
  15. ./ ├── environments │ ├── development │ │ ├── main.tf

    │ │ ├── outputs.tf │ │ └── providers.tf │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── staging │ ├── main.tf │ ├── outputs.tf │ └── providers.tf └── modules └── … 環境毎の分割 40 例えば… 05 構造化その2 環境毎の分割 ./ ├── main.tf ├── modules │ └── … ├── outputs.tf └── providers.tf
  16. コンポーネント毎の分割 45 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │

    ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
  17. コンポーネント毎の分割 46 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │

    ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
  18. コンポーネント毎の分割 47 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │

    ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
  19. ./ ├── environments │ ├── production │ │ ├── vpc

    │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── app │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── mysql │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ └── providers.tf │ └── … └── modules └── … コンポーネント毎の分割 48 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
  20. ./ ├── environments │ ├── production │ │ ├── vpc

    │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── app │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ ├── mysql │ │ │ ├── main.tf │ │ │ └── outputs.tf │ │ └── providers.tf │ └── … └── modules └── … コンポーネント毎の分割 49 例えば… 06 構造化その3 コンポーネント毎の分割 ./ ├── environments │ ├── production │ │ ├── main.tf │ │ ├── outputs.tf │ │ └── providers.tf │ └── … └── modules └── …
  21. コンポーネント毎の分割 56 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく •

    そうしないと、循環参照の状態になり、環境が壊れてしまう可能性がある • 循環参照が起こっているかの確認は、依存グラフの出⼒コマンドがある ・`terraform graph -draw-cycles | dot -Tpng > graph.png`
  22. コンポーネント毎の分割 57 06 構造化その3 コンポーネント毎の分割 • 注意点 • 各コンポーネントの依存関係を⼀⽅向にしておく •

    そうしないと、循環参照の状態になり、環境が壊れてしまう可能性がある • 循環参照が起こっているかの確認は、依存グラフの出⼒コマンドがある ・`terraform graph -draw-cycles | dot -Tpng > graph.png`
  23. まとめ 62 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく

    - 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割
  24. まとめ 63 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく

    - 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割 • 3つのポイントがあるが、絶対ではない。
  25. まとめ 64 07 まとめ • 単⼀ファイルからリソース以外分ける • リソース毎にファイルを分ける • 構造化していく

    - 1. モジュールへの分割 - 2. 環境毎への分割 - 3. コンポーネント毎への分割 • 3つのポイントがあるが、絶対ではない。 • 結局は「関⼼毎による分離」を意識すれば問題ない︕