@@ -22,7 +22,9 @@ provider "ibm" {
2222```
2323
2424## Example usage
25- The following example creates an instance group manager.
25+
26+ ### Basic Instance Group Manager
27+ The following example creates a basic instance group manager.
2628
2729``` terraform
2830resource "ibm_is_vpc" "example" {
@@ -36,14 +38,18 @@ resource "ibm_is_subnet" "example" {
3638 ipv4_cidr_block = "10.240.64.0/28"
3739}
3840
41+ data "ibm_is_image" "ubuntu" {
42+ name = "ibm-ubuntu-20-04-6-minimal-amd64-6"
43+ }
44+
3945resource "ibm_is_ssh_key" "example" {
4046 name = "example-ssh"
41- public_key = "SSH_KEY"
47+ public_key = file("~/.ssh/id_ed25519.pub")
4248}
4349
4450resource "ibm_is_instance_template" "example" {
4551 name = "example-template"
46- image = ibm_is_image.example .id
52+ image = data. ibm_is_image.ubuntu .id
4753 profile = "bx2-8x32"
4854
4955 primary_network_interface {
@@ -80,22 +86,231 @@ resource "ibm_is_instance_group_manager" "example" {
8086 min_membership_count = 1
8187}
8288
83- resource "ibm_is_instance_group_manager" "example " {
89+ resource "ibm_is_instance_group_manager" "scheduled " {
8490 name = "example-instance-group-manager"
8591 instance_group = ibm_is_instance_group.example.id
8692 manager_type = "scheduled"
8793 enable_manager = true
8894}
8995```
9096
97+ ### Example with Load Balancer, Autoscaling, and Scheduled Managers
98+ An example to set up an instance group with both autoscaling and scheduled managers working together with a load balancer, addresses the need of both automatic scaling based on metrics and scheduled scaling for predictable workload patterns.
99+
100+ ``` terraform
101+
102+ resource "ibm_is_instance_template" "webserver" {
103+ name = "${var.prefix}-webserver-template"
104+ image = data.ibm_is_image.ubuntu.id
105+ profile = "cx2-2x4"
106+
107+ primary_network_interface {
108+ subnet = ibm_is_subnet.example.id
109+ security_groups = [ibm_is_security_group.webserver.id]
110+ }
111+
112+ vpc = ibm_is_vpc.example.id
113+ zone = ibm_is_subnet.example.zone
114+ keys = [ibm_is_ssh_key.example.id]
115+
116+ # User data for web server setup
117+ user_data = base64encode(<<-EOF
118+ #!/bin/bash
119+ apt-get update
120+ apt-get install -y nginx
121+ systemctl start nginx
122+ systemctl enable nginx
123+
124+ # Configure nginx for health checks
125+ echo "server { listen 80; location /health { return 200 'OK'; } }" > /etc/nginx/sites-available/health
126+ ln -s /etc/nginx/sites-available/health /etc/nginx/sites-enabled/
127+ systemctl reload nginx
128+ EOF
129+ )
130+ }
131+
132+ # Load Balancer for the instance group
133+ resource "ibm_is_lb" "webapp_lb" {
134+ name = "${var.prefix}-load-balancer"
135+ subnets = [ibm_is_subnet.example.id]
136+ type = "private"
137+
138+ # Enable logging for monitoring (optional)
139+ logging = true
140+ }
141+
142+ # Backend pool for the load balancer
143+ resource "ibm_is_lb_pool" "webapp_backend_pool" {
144+ name = "${var.prefix}-backend-pool"
145+ lb = ibm_is_lb.webapp_lb.id
146+ algorithm = "round_robin"
147+ protocol = "http"
148+ health_delay = 60
149+ health_retries = 5
150+ health_timeout = 30
151+ health_type = "http"
152+ health_monitor_url = "/health"
153+ }
154+
155+ # Load balancer listener
156+ resource "ibm_is_lb_listener" "webapp_listener" {
157+ lb = ibm_is_lb.webapp_lb.id
158+ port = 80
159+ protocol = "http"
160+ default_pool = ibm_is_lb_pool.webapp_backend_pool.id
161+ }
162+
163+ # Security group for web servers
164+ resource "ibm_is_security_group" "webserver" {
165+ name = "${var.prefix}-webserver-sg"
166+ vpc = ibm_is_vpc.example.id
167+ }
168+
169+ resource "ibm_is_security_group_rule" "webserver_http" {
170+ group = ibm_is_security_group.webserver.id
171+ direction = "inbound"
172+ remote = "0.0.0.0/0"
173+ tcp {
174+ port_min = 80
175+ port_max = 80
176+ }
177+ }
178+
179+ resource "ibm_is_security_group_rule" "webserver_ssh" {
180+ group = ibm_is_security_group.webserver.id
181+ direction = "inbound"
182+ remote = "0.0.0.0/0"
183+ tcp {
184+ port_min = 22
185+ port_max = 22
186+ }
187+ }
188+
189+ # Instance Group with Load Balancer integration
190+ resource "ibm_is_instance_group" "webapp_ig" {
191+ name = "${var.prefix}-instance-group"
192+ instance_template = ibm_is_instance_template.webserver.id
193+ instance_count = 3
194+ subnets = [ibm_is_subnet.example.id]
195+ # Load balancer integration
196+ application_port = 80
197+ load_balancer = ibm_is_lb.webapp_lb.id
198+ load_balancer_pool = element(split("/", ibm_is_lb_pool.webapp_backend_pool.id), 1)
199+
200+ # Lifecycle management to prevent conflicts with auto-scaling
201+ lifecycle {
202+ ignore_changes = [
203+ instance_count,
204+ ]
205+ }
206+
207+ timeouts {
208+ create = "15m"
209+ delete = "15m"
210+ update = "10m"
211+ }
212+ }
213+
214+ # Autoscaling Manager - Handles automatic scaling based on metrics
215+ resource "ibm_is_instance_group_manager" "webapp_autoscaler" {
216+ name = "${var.prefix}-autoscale-manager"
217+ aggregation_window = 120
218+ instance_group = ibm_is_instance_group.webapp_ig.id
219+
220+ cooldown = 120
221+ manager_type = "autoscale"
222+ enable_manager = true
223+ max_membership_count = 10
224+ min_membership_count = 2
225+ }
226+
227+ # CPU-based scaling policy for the autoscaler
228+ resource "ibm_is_instance_group_manager_policy" "webapp_cpu_policy" {
229+ name = "${var.prefix}-cpu-scaling-policy"
230+ instance_group = ibm_is_instance_group.webapp_ig.id
231+ instance_group_manager = ibm_is_instance_group_manager.webapp_autoscaler.manager_id
232+ metric_type = "cpu"
233+ metric_value = 70
234+ policy_type = "target"
235+ }
236+
237+ # Memory-based scaling policy (optional additional policy)
238+ resource "ibm_is_instance_group_manager_policy" "webapp_memory_policy" {
239+ name = "${var.prefix}-memory-scaling-policy"
240+ instance_group = ibm_is_instance_group.webapp_ig.id
241+ instance_group_manager = ibm_is_instance_group_manager.webapp_autoscaler.manager_id
242+ metric_type = "memory"
243+ metric_value = 80
244+ policy_type = "target"
245+ }
246+
247+ # Scheduled Manager - Handles time-based scaling actions
248+ resource "ibm_is_instance_group_manager" "webapp_scheduler" {
249+ name = "${var.prefix}-scheduled-manager"
250+ instance_group = ibm_is_instance_group.webapp_ig.id
251+ manager_type = "scheduled"
252+ enable_manager = true
253+ }
254+
255+ # Scheduled action to scale down during off-peak hours (5 PM daily)
256+ resource "ibm_is_instance_group_manager_action" "webapp_scale_down_evening" {
257+ name = "${var.prefix}-scale-down-evening"
258+ instance_group = ibm_is_instance_group.webapp_ig.id
259+ instance_group_manager = ibm_is_instance_group_manager.webapp_scheduler.manager_id
260+
261+ # target_manager specifies which manager's limits to modify
262+ target_manager = ibm_is_instance_group_manager.webapp_autoscaler.manager_id
263+
264+ # Scale down at 5:05 PM daily (17:05 UTC)
265+ cron_spec = "05 17 * * *"
266+
267+ # Adjust the autoscaler's limits for off-peak hours
268+ min_membership_count = 2
269+ max_membership_count = 4
270+ }
271+
272+ # Scheduled action to scale up for peak hours (8 AM daily)
273+ resource "ibm_is_instance_group_manager_action" "webapp_scale_up_morning" {
274+ name = "${var.prefix}-scale-up-morning"
275+ instance_group = ibm_is_instance_group.webapp_ig.id
276+ instance_group_manager = ibm_is_instance_group_manager.webapp_scheduler.manager_id
277+
278+ # target_manager specifies which manager's limits to modify
279+ target_manager = ibm_is_instance_group_manager.webapp_autoscaler.manager_id
280+
281+ # Scale up at 8:05 AM daily (08:05 UTC)
282+ cron_spec = "05 08 * * *"
283+
284+ # Adjust the autoscaler's limits for peak hours
285+ min_membership_count = 3
286+ max_membership_count = 10
287+ }
288+
289+ # Weekend scale-down action (Saturday midnight)
290+ resource "ibm_is_instance_group_manager_action" "webapp_weekend_scale_down" {
291+ name = "${var.prefix}-weekend-scale-down"
292+ instance_group = ibm_is_instance_group.webapp_ig.id
293+ instance_group_manager = ibm_is_instance_group_manager.webapp_scheduler.manager_id
294+
295+ target_manager = ibm_is_instance_group_manager.webapp_autoscaler.manager_id
296+
297+ # Scale down at midnight on Saturday (00:05 UTC)
298+ cron_spec = "05 00 * * 6"
299+
300+ min_membership_count = 1
301+ max_membership_count = 3
302+ }
303+
304+ ```
305+
91306## Argument reference
92307Review the argument references that you can specify for your resource.
93308
94309- ` aggregation_window ` - (Optional, Integer) The time window in seconds to aggregate metrics prior to evaluation.
95310- ` cooldown ` - (Optional, Integer) The duration of time in seconds to pause further scale actions after scaling has taken place.
96311- ` enable_manager ` - (Optional, Bool) Enable or disable the instance group manager. Default value is ** true** .
97312- ` instance_group ` - (Required, String) The instance group ID where instance group manager is created.
98- - ` manager_type ` - (Optional, String) The type of instance group manager. Default value is ` autoscale ` .
313+ - ` manager_type ` - (Optional, String) The type of instance group manager. Default value is ` autoscale ` . Valid values are ` autoscale ` and ` scheduled ` .
99314- ` max_membership_count ` - (Required, Integer) The maximum number of members in a managed instance group.
100315- ` min_membership_count ` - (Optional, Integer) The minimum number of members in a managed instance group. Default value is ` 1 ` .
101316- ` name ` - (Optional, String) The name of the instance group manager.
@@ -116,3 +331,11 @@ The `ibm_is_instance_group_manager` resource can be imported by using the instan
116331```
117332$ terraform import ibm_is_instance_group_manager.manager r006-eea6b0b7-babd-47a8-82c5-ad73d1e10bef/r006-160b9a68-58c8-4ec3-84b0-ad553c111115a
118333```
334+
335+ ## Related Resources
336+
337+ - [ ` ibm_is_instance_group ` ] ( https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/is_instance_group ) - Creates the instance group
338+ - [ ` ibm_is_instance_group_manager_policy ` ] ( https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/is_instance_group_manager_policy ) - Defines scaling policies for autoscale managers
339+ - [ ` ibm_is_instance_group_manager_action ` ] ( https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/is_instance_group_manager_action ) - Creates scheduled actions for scheduled managers
340+ - [ ` ibm_is_lb ` ] ( https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/is_lb ) - Load balancer for distributing traffic
341+ - [ ` ibm_is_lb_pool ` ] ( https://registry.terraform.io/providers/IBM-Cloud/ibm/latest/docs/resources/is_lb_pool ) - Backend pool for load balancer
0 commit comments