1. 概要
- リソース参照式(
resource_type.name.attribute) - データソース参照(
data.resource_type.name.attribute) path.module/path.root/path.cwdterraform.workspacevar.<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内での自己参照
selfはprovisionerやlifecycleブロック内で現在のリソースを参照します。
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.index | countのインデックス |
each.key / each.value | for_eachの要素 |
self | lifecycle/provisioner内での自己参照 |
9. 関連記事
- for_each の使い方 — each.key/each.valueの活用
- count の使い方 — count.indexの活用
- terraform workspace の使い方 — terraform.workspaceの詳細
- locals(ローカル値)— DRYなコードを書く
- variable(入力変数)— 定義・型・バリデーション
- output(出力値)— 定義・参照・sensitiveオプション
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