1. はじめに
Terraformを触るのが楽しくて、VPC、EC2、ALBを構築してました。
しかし、コードは公式ドキュメントなどを見て書けるものの「なぜその設定が必要なのか」を自らの言葉で説明できないことに気付きました。
本当に理解してTerraformを使ったAWS構築ができているのかが不安でした。
そこで今回、Terraformのmodule化に挑戦しながらAWSの通信経路やリソース同士の関係を整理してみました。
2. 今回の構成
学習のため、冗長化構成にします。
Internet
↓
ALB
↓
Target Group
↓
EC2-1a
EC2-1c
VPC
├─ Public Subnet 1a
│ └─ EC2-1a
└─ Public Subnet 1c
└─ EC2-1c
ALB
Target Group
Listener
3. module化した構成
今回は、network、ec2、albに分けてモジュール化していきます。
modules/
├── network
├── ec2
└── alb
下記、リソースの配置
network
・VPC
・Subnet
・Route Table
・Internet Gateway
ec2
・EC2
・IAM Role
・Instance Profile
・Security Group
alb
・ALB
・Target Group
・Listener
4. ハマったポイント
説明する上での理解が難しかったポイントをいくつか紹介します。
まず、
No declaration found for var.instance_type
原因
variables.tf に定義が無かった。
var.xxx を使うなら variable "xxx" が抜けていた。
学び
variables.tfやoutput.tfなど、どこに何を書いたか混乱してしまうことがある。
次に、
string required, but have object
原因
iam_instance_profile = aws_iam_instance_profile.ec2_ssm_profile
末尾の.nameがぬけている。これだとオブジェクト全体を渡していたことになっていた。
学び
参照する場合は、それに対応した属性(Attribute)がある。
次に、
module内でSubnet参照できない
原因
aws_subnet.public_1a.id
moduleは独立した部品であり、他moduleのリソースを直接参照できない。
そのため、
var.public_1a_subnet_id
学び
variables.tfを参照したコードを書く。module化するとvariables.tfが3〜4つほどになるので記述を習慣づけるようにする。
5. 一番の学び
今回のmodule化を通して感じたのは、Terraformの文法を覚えることよりもAWSの通信経路や、そのリソースごとの関連性や依存関係を理解することの方が重要だということです。
network
├─ vpc_id
└─ subnet_id
↓
ec2
└─ web_1a_id
└─ web_1c_id
↓
alb
以前は、
「ALBを作る」
「Target Groupを作る」
という作業としてTerraformを書いていました。
しかしmodule化を進める中で、
・なぜALBにはSubnetが必要なのか
・なぜTarget GroupにはVPC IDが必要なのか
・なぜTarget Group AttachmentでEC2を登録するのか
を考えるようになりました。
TerraformはAWSをコードで表現するためのツールであり、AWSの仕組みを理解していなければ正しく書くことができません。
今回のmodule化で、Terraformを書く力だけでなく、AWSの通信の流れを考える力も必要だということだとわかりました。
今後は
・Auto Scaling Group
・RDS module化
・HTTPS化(ACM)
・CloudWatch監視
にも挑戦したいと思います。