【terraform】Data Sourceを使うならModuleではなく呼び出し元で

Summary - 要旨

terraformのData Sourceを使うと外部リソースを参照できるためとても便利である。

が、moduleの中で直接呼ぶよりは、呼び出し元で呼ぶほうが使いまわしやすくてよさそうだ。

Detail - なんのこっちゃ

Data Sourceをmoduleの中で呼ぶと、それに依存したコードを書くことになると思う。

たとえばmoduleの中で以下のようにしていると

  1. dataで最新のAmazon Linux AMIのIDを得る
  2. そのAMIでEC2を立てる
data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]
  (省略)

}

resource "aws_instance" "example" {
  ami           = data.aws_ami.amazon_linux.id
  (省略)
}

後になって一部AmazonLinux以外を使いたいと思ったらmoduleを書き直さないといけなくなる。

が、variableで渡されていればmoduleをそのまま使いまわすことができる。

variable "ami_id" {}

resource "aws_instance" "example" {
  ami           = var.ami_id
  (省略)
}

Module内でData Sourceを呼ぶと外部に強く依存してしまうので、依存性の注入のようにvariableで渡したほうがモジュールの独立性が高まっていい、ということ。