Skip to content

Commit c977003

Browse files
committed
feat: add an example explaining how to use outputs of stacks using data sources
1 parent 5f465ed commit c977003

File tree

19 files changed

+382
-0
lines changed

19 files changed

+382
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
globals "terraform" {
2+
version = "1.6.6"
3+
}
4+
5+
globals "terraform" "backend" {
6+
bucket = "terramate-example-terraform-state-backend"
7+
region = "us-east-1"
8+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import {
2+
source = "./imports/*.tm.hcl"
3+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
generate_hcl "backend.tf" {
2+
content {
3+
terraform {
4+
backend "s3" {
5+
region = global.terraform.backend.region
6+
bucket = global.terraform.backend.bucket
7+
key = "terraform/stacks/by-id/${terramate.stack.id}/terraform.tfstate"
8+
encrypt = true
9+
dynamodb_table = tm_try(global.terraform.backend.dynamo_table, "terraform-lock")
10+
}
11+
}
12+
}
13+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
generate_hcl "ec2.tf" {
2+
stack_filter {
3+
project_paths = [
4+
"ec2/*"
5+
]
6+
}
7+
8+
content {
9+
resource "aws_instance" "web" {
10+
instance_type = "t3.micro"
11+
ami = data.aws_ami.ubuntu.id
12+
13+
subnet_id = data.aws_subnet.subnet.id
14+
# subnet_id = data.terraform_remote_state.vpc.outputs.subnet_id
15+
16+
tags = {
17+
Name = terramate.stack.path.basename
18+
}
19+
}
20+
21+
# data "terraform_remote_state" "vpc" {
22+
# backend = "s3"
23+
# config = {
24+
# bucket = global.terraform.backend.bucket
25+
# region = global.terraform.backend.region
26+
# encrypt = true
27+
# # The key here uses the stack ID of the VPC stack
28+
# key = "terraform/stacks/by-id/fedcfb3-ce64-4ba2-bc1e-1ab22bceba35/terraform.tfstate"
29+
# }
30+
31+
# depends_on = [
32+
# null_resource.initial_deployment_trigger
33+
# ]
34+
# }
35+
36+
data "aws_subnet" "subnet" {
37+
filter {
38+
name = "tag:Name"
39+
values = ["${global.terraform.backend.region}a"]
40+
}
41+
42+
depends_on = [
43+
null_resource.initial_deployment_trigger
44+
]
45+
}
46+
47+
48+
resource "null_resource" "initial_deployment_trigger" {
49+
}
50+
51+
52+
data "aws_ami" "ubuntu" {
53+
most_recent = true
54+
55+
filter {
56+
name = "name"
57+
values = ["ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*"]
58+
}
59+
60+
filter {
61+
name = "virtualization-type"
62+
values = ["hvm"]
63+
}
64+
65+
owners = ["099720109477"] # Canonical
66+
}
67+
}
68+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
generate_hcl "terraform.tf" {
2+
lets {
3+
required_providers = { for k, v in tm_try(global.terraform.providers, {}) :
4+
k => {
5+
source = v.source
6+
version = v.version
7+
} if tm_alltrue([
8+
tm_try(v.enabled, true),
9+
tm_length(tm_split(".", k)) == 1,
10+
])
11+
}
12+
13+
providers = { for k, v in tm_try(global.terraform.providers, {}) :
14+
k => v.config if tm_alltrue([
15+
tm_length(tm_split(".", k)) == 1,
16+
tm_try(v.enabled, true),
17+
tm_can(v.config)
18+
])
19+
}
20+
21+
providers_aliases = { for k, v in tm_try(global.terraform.providers, {}) :
22+
k => v.config if tm_alltrue([
23+
tm_length(tm_split(".", k)) == 2,
24+
tm_try(v.enabled, true),
25+
tm_can(v.config)
26+
])
27+
}
28+
}
29+
30+
content {
31+
# terraform version constraints
32+
terraform {
33+
required_version = tm_try(global.terraform.version, "~> 1.6")
34+
}
35+
36+
# Provider version constraints
37+
terraform {
38+
tm_dynamic "required_providers" {
39+
attributes = let.required_providers
40+
}
41+
}
42+
43+
# Provider configs
44+
tm_dynamic "provider" {
45+
for_each = let.providers
46+
labels = [provider.key]
47+
attributes = provider.value
48+
}
49+
50+
# Provider aliases
51+
tm_dynamic "provider" {
52+
for_each = let.providers_aliases
53+
labels = [tm_split(".", provider.key)[0]]
54+
attributes = provider.value
55+
56+
content {
57+
alias = tm_split(".", provider.key)[1]
58+
}
59+
}
60+
}
61+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
generate_hcl "vpc.tf" {
2+
stack_filter {
3+
project_paths = [
4+
"vpc/*"]
5+
}
6+
7+
content {
8+
resource "aws_vpc" "main" {
9+
cidr_block = "10.0.0.0/16"
10+
}
11+
12+
resource "aws_subnet" "main" {
13+
vpc_id = aws_vpc.main.id
14+
cidr_block = "10.0.1.0/24"
15+
availability_zone = "${global.terraform.backend.region}a"
16+
17+
tags = {
18+
Name = "${global.terraform.backend.region}a"
19+
}
20+
}
21+
22+
output "subnet_id" {
23+
value = aws_subnet.main.id
24+
}
25+
}
26+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
backend "s3" {
5+
bucket = "terramate-example-terraform-state-backend"
6+
dynamodb_table = "terraform-lock"
7+
encrypt = true
8+
key = "terraform/stacks/by-id/ffca51f-1666-4572-b838-10634354b85c/terraform.tfstate"
9+
region = "us-east-1"
10+
}
11+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
resource "aws_instance" "web" {
4+
ami = data.aws_ami.ubuntu.id
5+
instance_type = "t3.micro"
6+
subnet_id = data.aws_subnet.subnet.id
7+
tags = {
8+
Name = "instance-a"
9+
}
10+
}
11+
data "aws_subnet" "subnet" {
12+
depends_on = [
13+
null_resource.initial_deployment_trigger,
14+
]
15+
filter {
16+
name = "tag:Name"
17+
values = [
18+
"us-east-1a",
19+
]
20+
}
21+
}
22+
resource "null_resource" "initial_deployment_trigger" {
23+
}
24+
data "aws_ami" "ubuntu" {
25+
most_recent = true
26+
owners = [
27+
"099720109477",
28+
]
29+
filter {
30+
name = "name"
31+
values = [
32+
"ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*",
33+
]
34+
}
35+
filter {
36+
name = "virtualization-type"
37+
values = [
38+
"hvm",
39+
]
40+
}
41+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
stack {
2+
name = "instance-a"
3+
description = "instance-a"
4+
id = "ffca51f-1666-4572-b838-10634354b85c"
5+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
required_version = "1.6.6"
5+
}
6+
terraform {
7+
required_providers {
8+
aws = {
9+
source = "hashicorp/aws"
10+
version = "~> 5.31"
11+
}
12+
}
13+
}
14+
provider "aws" {
15+
region = "us-east-1"
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
backend "s3" {
5+
bucket = "terramate-example-terraform-state-backend"
6+
dynamodb_table = "terraform-lock"
7+
encrypt = true
8+
key = "terraform/stacks/by-id/249e7f6-dcbc-4038-8a94-012aa17c081f/terraform.tfstate"
9+
region = "us-east-1"
10+
}
11+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
resource "aws_instance" "web" {
4+
ami = data.aws_ami.ubuntu.id
5+
instance_type = "t3.micro"
6+
subnet_id = data.aws_subnet.subnet.id
7+
tags = {
8+
Name = "instance-b"
9+
}
10+
}
11+
data "aws_subnet" "subnet" {
12+
depends_on = [
13+
null_resource.initial_deployment_trigger,
14+
]
15+
filter {
16+
name = "tag:Name"
17+
values = [
18+
"us-east-1a",
19+
]
20+
}
21+
}
22+
resource "null_resource" "initial_deployment_trigger" {
23+
}
24+
data "aws_ami" "ubuntu" {
25+
most_recent = true
26+
owners = [
27+
"099720109477",
28+
]
29+
filter {
30+
name = "name"
31+
values = [
32+
"ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*",
33+
]
34+
}
35+
filter {
36+
name = "virtualization-type"
37+
values = [
38+
"hvm",
39+
]
40+
}
41+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
stack {
2+
name = "instance-a"
3+
description = "instance-a"
4+
id = "249e7f6-dcbc-4038-8a94-012aa17c081f"
5+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
required_version = "1.6.6"
5+
}
6+
terraform {
7+
required_providers {
8+
aws = {
9+
source = "hashicorp/aws"
10+
version = "~> 5.31"
11+
}
12+
}
13+
}
14+
provider "aws" {
15+
region = "us-east-1"
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
backend "s3" {
5+
bucket = "terramate-example-terraform-state-backend"
6+
dynamodb_table = "terraform-lock"
7+
encrypt = true
8+
key = "terraform/stacks/by-id/fdcfb3-ce64-4ba2-bc1e-1ab22bceba35/terraform.tfstate"
9+
region = "us-east-1"
10+
}
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
stack {
2+
name = "main"
3+
description = "main"
4+
id = "fdcfb3-ce64-4ba2-bc1e-1ab22bceba35"
5+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
required_version = "1.6.6"
5+
}
6+
terraform {
7+
required_providers {
8+
aws = {
9+
source = "hashicorp/aws"
10+
version = "~> 5.31"
11+
}
12+
}
13+
}
14+
provider "aws" {
15+
region = "us-east-1"
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
resource "aws_vpc" "main" {
4+
cidr_block = "10.0.0.0/16"
5+
}
6+
resource "aws_subnet" "main" {
7+
availability_zone = "us-east-1a"
8+
cidr_block = "10.0.1.0/24"
9+
tags = {
10+
Name = "us-east-1a"
11+
}
12+
vpc_id = aws_vpc.main.id
13+
}
14+
output "subnet_id" {
15+
value = aws_subnet.main.id
16+
}

0 commit comments

Comments
 (0)