locals
Terraform policy supports locals {} blocks in test files. These blocks behave like locals blocks in policy files, allowing you to define reusable values within your tests.
Configuration model
locals {
<name> = <expression>
...
}
Complete configuration example
locals {
common_tags = {
ManagedBy = "terraform"
Environment = "production"
}
approved_regions = ["us-east-1", "us-west-2"]
test_vpc_id = "vpc-12345678"
}
resource "aws_instance" "tagged" {
attrs = {
instance_type = "t3.micro"
ami = "ami-12345678"
tags = local.common_tags
}
}
resource "aws_subnet" "public" {
attrs = {
vpc_id = local.test_vpc_id
cidr_block = "10.0.1.0/24"
availability_zone = local.approved_regions[0]
}
}
Specification
Syntax
Each locals {} block contains one or more local value assignments. The name of each local value must be unique within the test file.
Scope
Local values defined in test files are available throughout the test file and can be referenced using the local.<name> syntax.
Examples
Common test data
locals {
test_region = "us-east-1"
test_az = "us-east-1a"
test_ami = "ami-12345678"
}
resource "aws_instance" "example1" {
attrs = {
instance_type = "t3.micro"
ami = local.test_ami
availability_zone = local.test_az
}
}
resource "aws_instance" "example2" {
attrs = {
instance_type = "t3.small"
ami = local.test_ami
availability_zone = local.test_az
}
}
Shared tags
locals {
common_tags = {
ManagedBy = "terraform"
Environment = "test"
Owner = "platform-team"
}
}
resource "aws_instance" "web" {
attrs = {
instance_type = "t3.micro"
ami = "ami-12345678"
tags = local.common_tags
}
}
resource "aws_s3_bucket" "data" {
attrs = {
bucket = "test-bucket"
tags = local.common_tags
}
}
Complex data structures
locals {
vpc_config = {
id = "vpc-12345678"
cidr_block = "10.0.0.0/16"
}
subnet_configs = [
{
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1a"
},
{
cidr_block = "10.0.2.0/24"
availability_zone = "us-east-1b"
}
]
}
resource "aws_subnet" "subnet1" {
attrs = {
vpc_id = local.vpc_config.id
cidr_block = local.subnet_configs[0].cidr_block
availability_zone = local.subnet_configs[0].availability_zone
}
}
resource "aws_subnet" "subnet2" {
attrs = {
vpc_id = local.vpc_config.id
cidr_block = local.subnet_configs[1].cidr_block
availability_zone = local.subnet_configs[1].availability_zone
}
}
Computed values
locals {
base_name = "test"
vpc_name = "${local.base_name}-vpc"
sg_name = "${local.base_name}-sg"
instance_count = 3
instance_names = [for i in range(local.instance_count) : "${local.base_name}-instance-${i}"]
}
resource "aws_vpc" "main" {
attrs = {
cidr_block = "10.0.0.0/16"
tags = {
Name = local.vpc_name
}
}
}
resource "aws_security_group" "main" {
attrs = {
name = local.sg_name
description = "Security group for ${local.base_name}"
}
}
Reference data sources
locals {
vpc_id = data.aws_vpc.main.id
subnet_ids = [
data.aws_subnet.private1.id,
data.aws_subnet.private2.id
]
}
data "aws_vpc" "main" {
skip = true
attrs = {
id = "vpc-12345678"
cidr_block = "10.0.0.0/16"
}
}
data "aws_subnet" "private1" {
skip = true
attrs = {
id = "subnet-12345678"
vpc_id = local.vpc_id
}
}
data "aws_subnet" "private2" {
skip = true
attrs = {
id = "subnet-87654321"
vpc_id = local.vpc_id
}
}
resource "aws_instance" "app" {
attrs = {
instance_type = "t3.micro"
ami = "ami-12345678"
subnet_id = local.subnet_ids[0]
}
}
Combine with inputs
input {
environment = "production"
}
locals {
env_prefix = input.environment
vpc_name = "${local.env_prefix}-vpc"
instance_type = input.environment == "production" ? "t3.medium" : "t3.micro"
}
resource "aws_vpc" "main" {
attrs = {
cidr_block = "10.0.0.0/16"
tags = {
Name = local.vpc_name
Environment = input.environment
}
}
}
resource "aws_instance" "app" {
attrs = {
instance_type = local.instance_type
ami = "ami-12345678"
}
}
Test data for multiple scenarios
locals {
test_scenarios = {
small = {
instance_type = "t3.micro"
volume_size = 10
}
medium = {
instance_type = "t3.medium"
volume_size = 50
}
large = {
instance_type = "t3.large"
volume_size = 100
}
}
}
resource "aws_instance" "small" {
attrs = {
instance_type = local.test_scenarios.small.instance_type
ami = "ami-12345678"
}
}
resource "aws_ebs_volume" "small" {
attrs = {
availability_zone = "us-east-1a"
size = local.test_scenarios.small.volume_size
}
}
resource "aws_instance" "large" {
attrs = {
instance_type = local.test_scenarios.large.instance_type
ami = "ami-12345678"
}
}
Related documentation
- Write and run policy tests - Learn how to write and run tests
- The
locals {}block in policies - Policy locals reference