参照式の完全ガイド — path.module / terraform.workspace / self など

1. 概要

  • リソース参照式(resource_type.name.attribute
  • データソース参照(data.resource_type.name.attribute
  • path.module / path.root / path.cwd
  • terraform.workspace
  • var.<em> / local.</em> / module.*
  • self — lifecycle内での自己参照

Terraformの参照式(References)は、リソース・変数・モジュール・実行環境の情報にアクセスするための式です。


2. リソース参照

# 書式: <リソースタイプ>.<名前>.<属性>
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "private" {
  # aws_vpc.main.id でVPCのIDを参照
  vpc_id     = aws_vpc.main.id
  cidr_block = "10.0.1.0/24"
}

3. データソース参照

terraform {
  required_version = ">= 1.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

variable "environment" {
  description = "環境名"
  type        = string
  default     = "dev"
}

# データソースの定義
data "aws_ami" "amazon_linux_2023" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

data "aws_caller_identity" "current" {}
data "aws_region" "current" {}

# データソースの参照: data.<タイプ>.<名前>.<属性>
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${var.environment}-web"
    Environment = var.environment
    ManagedBy   = "terraform"
    AccountId   = data.aws_caller_identity.current.account_id
    Region      = data.aws_region.current.name
  }
}

4. path.* — パス参照式

locals {
  # path.module: このファイルが属するモジュールのディレクトリ
  # path.root: ルートモジュールのディレクトリ
  # path.cwd: terraform実行時のカレントディレクトリ

  # モジュール内でファイルを参照する際はpath.moduleを使う
  user_data = file("${path.module}/scripts/setup.sh")

  # ルートモジュールからの共有設定
  global_config = "${path.root}/config/global.yaml"
}

5. terraform.workspace — ワークスペース名の参照

locals {
  # 現在のworkspace名を取得
  env = terraform.workspace

  instance_type = {
    default = "t3.micro"
    dev     = "t3.micro"
    stg     = "t3.small"
    prd     = "t3.medium"
  }
}

resource "aws_instance" "app" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = lookup(local.instance_type, local.env, local.instance_type["default"])

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${local.env}-app"
    Environment = local.env
    ManagedBy   = "terraform"
  }
}

6. self — lifecycle内での自己参照

selfprovisionerlifecycleブロック内で現在のリソースを参照します。

resource "aws_instance" "bastion" {
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    Name        = "${var.environment}-bastion"
    Environment = var.environment
    ManagedBy   = "terraform"
  }

  # selfでこのリソース自身の属性を参照
  provisioner "remote-exec" {
    connection {
      host = self.public_ip  # ← このインスタンスのパブリックIPを参照
      type = "ssh"
      user = "ec2-user"
    }
    inline = ["echo 'Setup complete'"]
  }
}

7. count / for_each での参照

resource "aws_instance" "workers" {
  count         = 3
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    # count.index でインデックスを参照
    Name        = "${var.environment}-worker-${count.index + 1}"
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

resource "aws_instance" "services" {
  for_each      = toset(["web", "api", "worker"])
  ami           = data.aws_ami.amazon_linux_2023.id
  instance_type = "t3.micro"

  root_block_device {
    volume_size = 20
    volume_type = "gp3"
    encrypted   = true
  }

  tags = {
    # each.key / each.value でfor_eachの要素を参照
    Name        = "${var.environment}-${each.key}"
    Role        = each.key
    Environment = var.environment
    ManagedBy   = "terraform"
  }
}

8. 参照式の一覧

参照式説明
var.name入力変数
local.nameローカル値
module.name.outputモジュールのoutput
resource_type.name.attrリソースの属性
data.resource_type.name.attrデータソースの属性
path.module現在のモジュールのディレクトリ
path.rootルートモジュールのディレクトリ
path.cwdカレントディレクトリ
terraform.workspace現在のworkspace名
count.indexcountのインデックス
each.key / each.valuefor_eachの要素
selflifecycle/provisioner内での自己参照

9. 関連記事


10. まとめ

  • リソース参照: resource_type.name.attribute
  • データソース参照: data.resource_type.name.attribute
  • path.module — モジュール内ファイル参照に必須
  • terraform.workspace — 現在のworkspace名を取得
  • count.index / each.key / each.value — ループ内での要素参照
  • self — lifecycle/provisioner内での自己参照

動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/language/expressions/references