kenjuの日記

About Programming, Mathematics and Security

TerraformでModulesを用いてResourcesの保守性UP

Terraformでは、Modulesを使うと、リソースを分割管理することができる。 保守性・メンテナンス性が向上するので、Terraformで複数リソースを管理している場合にはおすすめ。

www.terraform.io

メリット

  • main.tfの肥大化を避けられる
  • git submodulesに切り出したりもできるので、社内で同一リソースを共通することもできる
  • リソースごとにファイル単位で責任が分離されるので、保守性・メンテナンス性が向上する

デメリット

  • 特にないのでは

具体例

例えば、以下のようなディレクトリ構成が考えられる。

main.tf
variables.tf # main.tfで使う変数
modules/
└── aws
    ├── elb.tf
    ├── iam.tf
    ├── s3.tf
    ├── variables.tf # aws/ modulesで使う変数
    └── vpc.tf

1 directory, 10 files

この状態でterraform getコマンドを発行した上で、↓のように書くと、ルートのmain.tfがローカルディレクトリにあるmodules/aws/*.tfファイルを読み込んでくれる。

main.tf:

modules "aws" {
  source = "./modules/aws"

  some_variables = '***'
}

ポイント

この場合、「垂直分割」と「水平分割」の二つの分割で分けられる。

先ほどの具体例で考えてみる。

「垂直分割」は、機能単位で。 「水平分割」は、リソース単位で。

例えば、AWSの場合、security_groupをそれぞれのリソースごとに設定することになると思う。 「垂直分割」の場合は、それぞれのセキュリティグループの設定は各リソースのファイルにまとめる。 例えば、s3.tfファイルには、以下のような設定になる。

s3.tf:

resource "aws_s3_bucket" "bucket" {
}

resource "aws_security_group" "s3" {
}

一方、「水平分割」の場合は、security_group.tfファイルを使って、そこに全てのリソースのセキュリティグループの設定をまとめてしまう。

security_group.tf:

resource "aws_security_group" "s3" {
}
resource "aws_security_group" "elb" {
}
resource "aws_security_group" "ssh" {
}

この場合どちらもメリット・デメリットがある。個人的には、機能単位である「垂直分割」の方が「ファイル単位で作業が分割できる」というメリットが活きてくるので好ましいと考えているが、ここらへんはチームごとの方針で決定すれば良い。