Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
bf64470
Adds the new `disable_security_group_assignment` boolean attribute to…
msk-stackit Jul 21, 2025
b0e1e52
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
19e167f
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
065cd04
change order of imports
msk-stackit Jul 21, 2025
288cf75
added a example for the new feature
msk-stackit Jul 22, 2025
8bafad8
update docs
msk-stackit Jul 22, 2025
c22bacd
terraform fmt
msk-stackit Jul 25, 2025
3b4ae4b
Merge branch 'main' into main
msk-stackit Jul 29, 2025
895ac47
add PR feedback
msk-stackit Jul 31, 2025
3b4b190
Merge branch 'main' into main
msk-stackit Aug 8, 2025
4f4aa53
update stackit_loadbalancer resource to no longer wait until LB becom…
msk-stackit Aug 8, 2025
d803bc7
cleanup
msk-stackit Aug 8, 2025
545aabb
update docs and example
msk-stackit Aug 8, 2025
a30cead
update docs and example
msk-stackit Aug 8, 2025
e6d3654
update docs and example
msk-stackit Aug 8, 2025
180aa11
update docs and example
msk-stackit Aug 8, 2025
b4a9a7d
update docs and example
msk-stackit Aug 8, 2025
b9bc3aa
revert to simpler function to allow the LB to become active before pr…
msk-stackit Aug 15, 2025
2858cb1
update description
msk-stackit Aug 15, 2025
77dc880
update description
msk-stackit Aug 15, 2025
7517389
update description
msk-stackit Aug 15, 2025
e63bded
small correction of unnecessary var
msk-stackit Aug 15, 2025
8e0ebfe
update example
msk-stackit Aug 15, 2025
e30d554
Adds the new `disable_security_group_assignment` boolean attribute to…
msk-stackit Jul 21, 2025
7ab6beb
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
e73871a
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
9e8d943
change order of imports
msk-stackit Jul 21, 2025
ac2a715
update example
msk-stackit Aug 15, 2025
53e5f80
terraform fmt
msk-stackit Jul 25, 2025
52e6da9
add PR feedback
msk-stackit Jul 31, 2025
588d00f
update stackit_loadbalancer resource to no longer wait until LB becom…
msk-stackit Aug 8, 2025
795c64a
cleanup
msk-stackit Aug 8, 2025
0e51e07
update docs and example
msk-stackit Aug 8, 2025
2c9f1f2
update docs and example
msk-stackit Aug 8, 2025
fbc2293
update docs and example
msk-stackit Aug 8, 2025
41951d2
update docs and example
msk-stackit Aug 8, 2025
854044a
update docs and example
msk-stackit Aug 8, 2025
da756fc
revert to simpler function to allow the LB to become active before pr…
msk-stackit Aug 15, 2025
5f6e84e
update description
msk-stackit Aug 15, 2025
2c7a446
update description
msk-stackit Aug 15, 2025
f1e7cf7
update description
msk-stackit Aug 15, 2025
c507bdf
small correction of unnecessary var
msk-stackit Aug 15, 2025
bd862ce
update example
msk-stackit Aug 15, 2025
ca736a5
Merge remote-tracking branch 'origin/main'
msk-stackit Aug 15, 2025
dbd035e
Adds the new `disable_security_group_assignment` boolean attribute to…
msk-stackit Jul 21, 2025
3c9d065
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
fa164d7
Exposes the ID of the Load Balancer's egress security group.
msk-stackit Jul 21, 2025
aaa1aa3
change order of imports
msk-stackit Jul 21, 2025
616d202
added a example for the new feature
msk-stackit Jul 22, 2025
0dd3fc3
update docs
msk-stackit Jul 22, 2025
61b4856
terraform fmt
msk-stackit Jul 25, 2025
f778676
add PR feedback
msk-stackit Jul 31, 2025
6396efa
update stackit_loadbalancer resource to no longer wait until LB becom…
msk-stackit Aug 8, 2025
c8a768a
cleanup
msk-stackit Aug 8, 2025
b1e18a4
update docs and example
msk-stackit Aug 8, 2025
ae39a48
update docs and example
msk-stackit Aug 8, 2025
00c9c32
update docs and example
msk-stackit Aug 8, 2025
93d704e
update docs and example
msk-stackit Aug 8, 2025
f1dc94e
update docs and example
msk-stackit Aug 8, 2025
e93b07d
revert to simpler function to allow the LB to become active before pr…
msk-stackit Aug 15, 2025
e7f8579
update description
msk-stackit Aug 15, 2025
e968326
update description
msk-stackit Aug 15, 2025
88fa6d0
update description
msk-stackit Aug 15, 2025
860ae7b
small correction of unnecessary var
msk-stackit Aug 15, 2025
86da55e
update example
msk-stackit Aug 15, 2025
3e33e85
Merge remote-tracking branch 'origin/main'
msk-stackit Aug 19, 2025
7139285
update tests
msk-stackit Aug 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/data-sources/loadbalancer.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,15 @@ data "stackit_loadbalancer" "example" {

### Read-Only

- `disable_security_group_assignment` (Boolean) If set to true, this will disable the automatic assignment of a security group to the load balancer's targets. This option is primarily used to allow targets that are not within the load balancer's own network or SNA. When this is enabled, you are fully responsible for ensuring network connectivity to the targets, including managing all routing and security group rules manually. This setting cannot be changed after the load balancer is created.
- `external_address` (String) External Load Balancer IP address where this Load Balancer is exposed.
- `id` (String) Terraform's internal resource ID. It is structured as "`project_id`","region","`name`".
- `listeners` (Attributes List) List of all listeners which will accept traffic. Limited to 20. (see [below for nested schema](#nestedatt--listeners))
- `networks` (Attributes List) List of networks that listeners and targets reside in. (see [below for nested schema](#nestedatt--networks))
- `options` (Attributes) Defines any optional functionality you want to have enabled on your load balancer. (see [below for nested schema](#nestedatt--options))
- `plan_id` (String) The service plan ID. If not defined, the default service plan is `p10`. Possible values are: `p10`, `p50`, `p250`, `p750`.
- `private_address` (String) Transient private Load Balancer IP address. It can change any time.
- `security_group_id` (String) The ID of the egress security group assigned to the Load Balancer's internal machines. This ID is essential for allowing traffic from the Load Balancer to targets in different networks or STACKIT NETWORK AREAS (SNA). To enable this, create a security group rule for your target VMs and set the `remote_security_group_id` of that rule to this value. This is typically used when `disable_security_group_assignment` is set to `true`.
- `target_pools` (Attributes List) List of all target pools which will be used in the Load Balancer. Limited to 20. (see [below for nested schema](#nestedatt--target_pools))

<a id="nestedatt--listeners"></a>
Expand Down
104 changes: 104 additions & 0 deletions docs/resources/loadbalancer.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,108 @@ resource "stackit_loadbalancer" "example" {
}
}

# This example demonstrates an advanced setup where the Load Balancer is in one
# network and the target server is in another. This requires manual
# security group configuration using the `disable_security_group_assignment`
# and `security_group_id` attributes.

# We create two separate networks: one for the load balancer and one for the target.
resource "stackit_network" "lb_network" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "lb-network-example"
ipv4_prefix = "192.168.1.0/24"
ipv4_nameservers = ["8.8.8.8"]
}

resource "stackit_network" "target_network" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "target-network-example"
ipv4_prefix = "192.168.2.0/24"
ipv4_nameservers = ["8.8.8.8"]
}

resource "stackit_public_ip" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

resource "stackit_loadbalancer" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "example-advanced-lb"
external_address = stackit_public_ip.example.ip

# Key setting for manual mode: disables automatic security group handling.
disable_security_group_assignment = true

networks = [{
network_id = stackit_network.lb_network.network_id
role = "ROLE_LISTENERS_AND_TARGETS"
}]

listeners = [{
port = 80
protocol = "PROTOCOL_TCP"
target_pool = "cross-network-pool"
}]

target_pools = [{
name = "cross-network-pool"
target_port = 80
targets = [{
display_name = stackit_server.example.name
ip = stackit_network_interface.nic.ipv4
}]
}]
}

# Create a new security group to be assigned to the target server.
resource "stackit_security_group" "target_sg" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "target-sg-for-lb-access"
description = "Allows ingress traffic from the example load balancer."
}

# Create a rule to allow traffic FROM the load balancer.
# This rule uses the computed `security_group_id` of the load balancer.
resource "stackit_security_group_rule" "allow_lb_ingress" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
security_group_id = stackit_security_group.target_sg.security_group_id
direction = "ingress"
protocol = {
name = "tcp"
}

# This is the crucial link: it allows traffic from the LB's security group.
remote_security_group_id = stackit_loadbalancer.example.security_group_id

port_range = {
min = 80
max = 80
}
}

resource "stackit_server" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "example-remote-target"
machine_type = "c1.1"
availability_zone = "eu01-1"

boot_volume = {
source_type = "image"
source_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
size = 10
}

network_interfaces = [
stackit_network_interface.nic.network_interface_id
]
}

resource "stackit_network_interface" "nic" {
project_id = var.project_id
network_id = stackit_network.target_network.network_id
security_group_ids = [stackit_security_group.target_sg.security_group_id]
}

# Only use the import statement, if you want to import an existing loadbalancer
import {
to = stackit_loadbalancer.import-example
Expand All @@ -130,6 +232,7 @@ import {

### Optional

- `disable_security_group_assignment` (Boolean) If set to true, this will disable the automatic assignment of a security group to the load balancer's targets. This option is primarily used to allow targets that are not within the load balancer's own network or SNA. When this is enabled, you are fully responsible for ensuring network connectivity to the targets, including managing all routing and security group rules manually. This setting cannot be changed after the load balancer is created.
- `external_address` (String) External Load Balancer IP address where this Load Balancer is exposed.
- `options` (Attributes) Defines any optional functionality you want to have enabled on your load balancer. (see [below for nested schema](#nestedatt--options))
- `plan_id` (String) The service plan ID. If not defined, the default service plan is `p10`. Possible values are: `p10`, `p50`, `p250`, `p750`.
Expand All @@ -139,6 +242,7 @@ import {

- `id` (String) Terraform's internal resource ID. It is structured as "`project_id`","region","`name`".
- `private_address` (String) Transient private Load Balancer IP address. It can change any time.
- `security_group_id` (String) The ID of the egress security group assigned to the Load Balancer's internal machines. This ID is essential for allowing traffic from the Load Balancer to targets in different networks or STACKIT NETWORK AREAS (SNA). To enable this, create a security group rule for your target VMs and set the `remote_security_group_id` of that rule to this value. This is typically used when `disable_security_group_assignment` is set to `true`.

<a id="nestedatt--listeners"></a>
### Nested Schema for `listeners`
Expand Down
104 changes: 103 additions & 1 deletion examples/resources/stackit_loadbalancer/resource.tf
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,110 @@ resource "stackit_loadbalancer" "example" {
}
}

# This example demonstrates an advanced setup where the Load Balancer is in one
# network and the target server is in another. This requires manual
# security group configuration using the `disable_security_group_assignment`
# and `security_group_id` attributes.

# We create two separate networks: one for the load balancer and one for the target.
resource "stackit_network" "lb_network" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "lb-network-example"
ipv4_prefix = "192.168.1.0/24"
ipv4_nameservers = ["8.8.8.8"]
}

resource "stackit_network" "target_network" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "target-network-example"
ipv4_prefix = "192.168.2.0/24"
ipv4_nameservers = ["8.8.8.8"]
}

resource "stackit_public_ip" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

resource "stackit_loadbalancer" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "example-advanced-lb"
external_address = stackit_public_ip.example.ip

# Key setting for manual mode: disables automatic security group handling.
disable_security_group_assignment = true

networks = [{
network_id = stackit_network.lb_network.network_id
role = "ROLE_LISTENERS_AND_TARGETS"
}]

listeners = [{
port = 80
protocol = "PROTOCOL_TCP"
target_pool = "cross-network-pool"
}]

target_pools = [{
name = "cross-network-pool"
target_port = 80
targets = [{
display_name = stackit_server.example.name
ip = stackit_network_interface.nic.ipv4
}]
}]
}

# Create a new security group to be assigned to the target server.
resource "stackit_security_group" "target_sg" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "target-sg-for-lb-access"
description = "Allows ingress traffic from the example load balancer."
}

# Create a rule to allow traffic FROM the load balancer.
# This rule uses the computed `security_group_id` of the load balancer.
resource "stackit_security_group_rule" "allow_lb_ingress" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
security_group_id = stackit_security_group.target_sg.security_group_id
direction = "ingress"
protocol = {
name = "tcp"
}

# This is the crucial link: it allows traffic from the LB's security group.
remote_security_group_id = stackit_loadbalancer.example.security_group_id

port_range = {
min = 80
max = 80
}
}

resource "stackit_server" "example" {
project_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "example-remote-target"
machine_type = "c1.1"
availability_zone = "eu01-1"

boot_volume = {
source_type = "image"
source_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
size = 10
}

network_interfaces = [
stackit_network_interface.nic.network_interface_id
]
}

resource "stackit_network_interface" "nic" {
project_id = var.project_id
network_id = stackit_network.target_network.network_id
security_group_ids = [stackit_security_group.target_sg.security_group_id]
}

# Only use the import statement, if you want to import an existing loadbalancer
import {
to = stackit_loadbalancer.import-example
id = "${var.project_id},${var.region},${var.loadbalancer_name}"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ func (r *loadBalancerDataSource) Schema(_ context.Context, _ datasource.SchemaRe
"id": "Terraform's internal resource ID. It is structured as \"`project_id`\",\"region\",\"`name`\".",
"project_id": "STACKIT project ID to which the Load Balancer is associated.",
"external_address": "External Load Balancer IP address where this Load Balancer is exposed.",
"disable_security_group_assignment": "If set to true, this will disable the automatic assignment of a security group to the load balancer's targets. This option is primarily used to allow targets that are not within the load balancer's own network or SNA. When this is enabled, you are fully responsible for ensuring network connectivity to the targets, including managing all routing and security group rules manually. This setting cannot be changed after the load balancer is created.",
"security_group_id": "The ID of the egress security group assigned to the Load Balancer's internal machines. This ID is essential for allowing traffic from the Load Balancer to targets in different networks or STACKIT NETWORK AREAS (SNA). To enable this, create a security group rule for your target VMs and set the `remote_security_group_id` of that rule to this value. This is typically used when `disable_security_group_assignment` is set to `true`.",
"listeners": "List of all listeners which will accept traffic. Limited to 20.",
"port": "Port number where we listen for traffic.",
"protocol": "Protocol is the highest network protocol we understand to load balance.",
Expand Down Expand Up @@ -125,6 +127,10 @@ func (r *loadBalancerDataSource) Schema(_ context.Context, _ datasource.SchemaRe
Description: descriptions["external_address"],
Computed: true,
},
"disable_security_group_assignment": schema.BoolAttribute{
Description: descriptions["disable_security_group_assignment"],
Computed: true,
},
"plan_id": schema.StringAttribute{
Description: descriptions["plan_id"],
Computed: true,
Expand Down Expand Up @@ -339,6 +345,10 @@ func (r *loadBalancerDataSource) Schema(_ context.Context, _ datasource.SchemaRe
Optional: true,
Description: descriptions["region"],
},
"security_group_id": schema.StringAttribute{
Description: descriptions["security_group_id"],
Computed: true,
},
},
}
}
Expand Down
Loading
Loading