↓の本の「4章 モジュールで再利用可能なインフラを作る」のメモを残します。
前章のメモ
Terraformのモジュールとは?
コードを再利用するための仕組み。
プログラミング言語でいうところのライブラリみたいなイメージ。
自分で作ったモジュールでもネットに公開されている誰かが作ったモジュールでも使える
モジュールの基本
モジュール=Terraformファイルを集めたもの
であり、
ルートモジュール=直接terrarform applyするモジュール
再利用可能なモジュール=他のモジュールから参照されているモジュール
新しくモジュールを参照したり、sourceパラメータの変更時にはterraform initを実行する
2種類の変数
variable:外部から値を指定する変数。モジュールの入力変数になる。
locals:モジュール内のみで使う変数。外部から値を変更できない。
出力
outputブロックを使って、モジュール内の値を他のモジュールで参照できるようにできる。
モジュールの注意点
ファイルパス
モジュール内で相対パスを使うと、
×:そのモジュールのディレクトリから見た相対パス
〇:terraform applyを実行したディレクトリから見た相対パス
になる。
なので、モジュールでは相対パスではなくパス参照(path.<TYPE>)を使う。
path.module | そのモジュールのパスを返す |
path.root | ルートモジュールのパスを返す |
path.cwd | カレントディレクトリ(terraformを実行したディレクトリ)のパスを返す。 多くの場合はpath.rootと同じになる |
インラインブロック
1 2 3 4 5 6 7 |
resource "xxx" "yyy" { # ↓がインラインブロック <NAME> { [CONFIG...] } # ここまで } |
インラインブロックを使用するとモジュールの柔軟性が下がる。
例えば、セキュリティグループを↓のようにインラインブロックを使うとルールを追加できない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
resource "aws_security_group" "sg" { name = "sg" ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } egress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } # インラインブロックの場合は、↓を使ったルールの追加が不可 resource "aws_security_group_rule" "sg_ingress_https" { security_group_id = aws_security_group.sg.id type = "ingress" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } |
もしステージング環境だけ許可したい通信要件があった場合に困ってしまう。
なので、インラインブロックは使わず別リソースを使うようにする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
resource "aws_security_group" "sg" { name = "sg" } resource "aws_security_group_rule" "sg_ingress_http" { security_group_id = aws_security_group.sg.id type = "ingress" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } resource "aws_security_group_rule" "sg_ingress_https" { security_group_id = aws_security_group.sg.id type = "ingress" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } resource "aws_security_group_rule" "sg_egress" { security_group_id = aws_security_group.sg.id type = "egress" from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } |
モジュールのバージョン管理
・モジュールを使うときの課題
複数の環境から同じモジュールを参照していると、そのモジュールの変更が複数の環境へデプロイされてしまう。
・解決策
- モジュールを別リポジトリで管理しGitタグでバージョンをつけます。
- Terraformファイルからモジュールを参照する際にはバージョンを含めて指定する。
このようにすれば、環境ごとに別バージョンを参照でき安全です。
まとめ
- Terraformにはコードを再利用できるようモジュールという仕組みがある
- 入出力の変数やローカルな変数が設定できる
- ファイルパスに注意し、インラインブロックの使用は控える
- モジュールにバージョンを付与し、環境ごとに適切なバージョンを使う
次章のメモ
コメント