Skip to content

Commit f75d5e6

Browse files
committed
refactor: Update resource creation to match AppRunner design intentions
1 parent bb47aa9 commit f75d5e6

File tree

4 files changed

+165
-186
lines changed

4 files changed

+165
-186
lines changed

README.md

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ No modules.
4646
| Name | Type |
4747
|------|------|
4848
| [aws_apprunner_auto_scaling_configuration_version.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_auto_scaling_configuration_version) | resource |
49+
| [aws_apprunner_connection.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_connection) | resource |
4950
| [aws_apprunner_custom_domain_association.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_custom_domain_association) | resource |
5051
| [aws_apprunner_observability_configuration.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_observability_configuration) | resource |
5152
| [aws_apprunner_service.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/apprunner_service) | resource |
@@ -74,16 +75,13 @@ No modules.
7475
| <a name="input_access_iam_role_permissions_boundary"></a> [access\_iam\_role\_permissions\_boundary](#input\_access\_iam\_role\_permissions\_boundary) | ARN of the policy that is used to set the permissions boundary for the IAM role | `string` | `null` | no |
7576
| <a name="input_access_iam_role_policies"></a> [access\_iam\_role\_policies](#input\_access\_iam\_role\_policies) | IAM policies to attach to the IAM role | `map(string)` | `{}` | no |
7677
| <a name="input_access_iam_role_use_name_prefix"></a> [access\_iam\_role\_use\_name\_prefix](#input\_access\_iam\_role\_use\_name\_prefix) | Determines whether the IAM role name (`iam_role_name`) is used as a prefix | `bool` | `true` | no |
77-
| <a name="input_autoscaling_max_concurrency"></a> [autoscaling\_max\_concurrency](#input\_autoscaling\_max\_concurrency) | The maximal number of concurrent requests that you want an instance to process. When the number of concurrent requests goes over this limit, App Runner scales up your service | `number` | `null` | no |
78-
| <a name="input_autoscaling_max_size"></a> [autoscaling\_max\_size](#input\_autoscaling\_max\_size) | The maximal number of instances that App Runner provisions for your service | `number` | `1` | no |
79-
| <a name="input_autoscaling_min_size"></a> [autoscaling\_min\_size](#input\_autoscaling\_min\_size) | The minimal number of instances that App Runner provisions for your service | `number` | `1` | no |
80-
| <a name="input_autoscaling_name"></a> [autoscaling\_name](#input\_autoscaling\_name) | The name of the auto scaling configuration | `string` | `null` | no |
78+
| <a name="input_auto_scaling_configuration_arn"></a> [auto\_scaling\_configuration\_arn](#input\_auto\_scaling\_configuration\_arn) | ARN of an App Runner automatic scaling configuration resource that you want to associate with your service. If not provided, App Runner associates the latest revision of a default auto scaling configuration | `string` | `null` | no |
79+
| <a name="input_auto_scaling_configurations"></a> [auto\_scaling\_configurations](#input\_auto\_scaling\_configurations) | Map of auto-scaling configuration definitions to create | `any` | `{}` | no |
80+
| <a name="input_connections"></a> [connections](#input\_connections) | Map of connection definitions to create | `any` | `{}` | no |
8181
| <a name="input_create"></a> [create](#input\_create) | Determines whether resources will be created (affects all resources) | `bool` | `true` | no |
8282
| <a name="input_create_access_iam_role"></a> [create\_access\_iam\_role](#input\_create\_access\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `false` | no |
83-
| <a name="input_create_autoscaling_configuration"></a> [create\_autoscaling\_configuration](#input\_create\_autoscaling\_configuration) | Determines whether an Auto Scaling Configuration will be created | `bool` | `true` | no |
8483
| <a name="input_create_custom_domain_association"></a> [create\_custom\_domain\_association](#input\_create\_custom\_domain\_association) | Determines whether a Custom Domain Association will be created | `bool` | `false` | no |
8584
| <a name="input_create_instance_iam_role"></a> [create\_instance\_iam\_role](#input\_create\_instance\_iam\_role) | Determines whether an IAM role is created or to use an existing IAM role | `bool` | `true` | no |
86-
| <a name="input_create_observability_configuration"></a> [create\_observability\_configuration](#input\_create\_observability\_configuration) | Determines whether an Observability Configuration will be created | `bool` | `false` | no |
8785
| <a name="input_create_security_group"></a> [create\_security\_group](#input\_create\_security\_group) | Determines if a security group is created for the VPC connector | `bool` | `true` | no |
8886
| <a name="input_create_service"></a> [create\_service](#input\_create\_service) | Determines whether the service will be created | `bool` | `true` | no |
8987
| <a name="input_create_vpc_connector"></a> [create\_vpc\_connector](#input\_create\_vpc\_connector) | Determines whether a VPC Connector will be created | `bool` | `false` | no |
@@ -100,8 +98,7 @@ No modules.
10098
| <a name="input_instance_iam_role_use_name_prefix"></a> [instance\_iam\_role\_use\_name\_prefix](#input\_instance\_iam\_role\_use\_name\_prefix) | Determines whether the IAM role name (`iam_role_name`) is used as a prefix | `bool` | `true` | no |
10199
| <a name="input_network_configuration"></a> [network\_configuration](#input\_network\_configuration) | The network configuration for the service | `any` | `{}` | no |
102100
| <a name="input_observability_configuration"></a> [observability\_configuration](#input\_observability\_configuration) | The observability configuration for the service | `any` | `{}` | no |
103-
| <a name="input_observability_configuration_name"></a> [observability\_configuration\_name](#input\_observability\_configuration\_name) | The name of the Observability Configuration | `string` | `""` | no |
104-
| <a name="input_observability_trace_configuration"></a> [observability\_trace\_configuration](#input\_observability\_trace\_configuration) | The Observability Configuration trace coniguration | `any` | `{}` | no |
101+
| <a name="input_observability_configurations"></a> [observability\_configurations](#input\_observability\_configurations) | Map of observability configuration definitions to create | `any` | `{}` | no |
105102
| <a name="input_private_ecr_arn"></a> [private\_ecr\_arn](#input\_private\_ecr\_arn) | The ARN of the private ECR repository that contains the service image to launch | `string` | `null` | no |
106103
| <a name="input_security_group_description"></a> [security\_group\_description](#input\_security\_group\_description) | Description for the security group created | `string` | `null` | no |
107104
| <a name="input_security_group_rules"></a> [security\_group\_rules](#input\_security\_group\_rules) | List of security group rules to add to the security group created | `any` | `{}` | no |
@@ -121,20 +118,17 @@ No modules.
121118
| <a name="output_access_iam_role_arn"></a> [access\_iam\_role\_arn](#output\_access\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the IAM role |
122119
| <a name="output_access_iam_role_name"></a> [access\_iam\_role\_name](#output\_access\_iam\_role\_name) | The name of the IAM role |
123120
| <a name="output_access_iam_role_unique_id"></a> [access\_iam\_role\_unique\_id](#output\_access\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
124-
| <a name="output_autoscaling_configuration_arn"></a> [autoscaling\_configuration\_arn](#output\_autoscaling\_configuration\_arn) | ARN of this auto scaling configuration version |
125-
| <a name="output_autoscaling_configuration_latest"></a> [autoscaling\_configuration\_latest](#output\_autoscaling\_configuration\_latest) | Whether the auto scaling configuration has the highest `auto_scaling_configuration_revision` among all configurations that share the same `auto_scaling_configuration_name` |
126-
| <a name="output_autoscaling_configuration_revision"></a> [autoscaling\_configuration\_revision](#output\_autoscaling\_configuration\_revision) | The revision of this auto scaling configuration |
127-
| <a name="output_autoscaling_configuration_status"></a> [autoscaling\_configuration\_status](#output\_autoscaling\_configuration\_status) | The current state of the auto scaling configuration. An INACTIVE configuration revision has been deleted and can't be used. It is permanently removed some time after deletion |
121+
| <a name="output_auto_scaling_configurations"></a> [auto\_scaling\_configurations](#output\_auto\_scaling\_configurations) | Map of attribute maps for all autosclaing configurations created |
122+
| <a name="output_connections"></a> [connections](#output\_connections) | Map of attribute maps for all connections created |
128123
| <a name="output_custom_domain_association_certificate_validation_records"></a> [custom\_domain\_association\_certificate\_validation\_records](#output\_custom\_domain\_association\_certificate\_validation\_records) | A set of certificate CNAME records used for this domain name |
129124
| <a name="output_custom_domain_association_dns_target"></a> [custom\_domain\_association\_dns\_target](#output\_custom\_domain\_association\_dns\_target) | The App Runner subdomain of the App Runner service. The custom domain name is mapped to this target name. Attribute only available if resource created (not imported) with Terraform |
130125
| <a name="output_custom_domain_association_id"></a> [custom\_domain\_association\_id](#output\_custom\_domain\_association\_id) | The `domain_name` and `service_arn` separated by a comma (`,`) |
131126
| <a name="output_instance_iam_role_arn"></a> [instance\_iam\_role\_arn](#output\_instance\_iam\_role\_arn) | The Amazon Resource Name (ARN) specifying the IAM role |
132127
| <a name="output_instance_iam_role_name"></a> [instance\_iam\_role\_name](#output\_instance\_iam\_role\_name) | The name of the IAM role |
133128
| <a name="output_instance_iam_role_unique_id"></a> [instance\_iam\_role\_unique\_id](#output\_instance\_iam\_role\_unique\_id) | Stable and unique string identifying the IAM role |
134-
| <a name="output_observability_configuration_arn"></a> [observability\_configuration\_arn](#output\_observability\_configuration\_arn) | ARN of this observability configuration |
135-
| <a name="output_observability_configuration_latest"></a> [observability\_configuration\_latest](#output\_observability\_configuration\_latest) | Whether the observability configuration has the highest `observability_configuration_revision` among all configurations that share the same `observability_configuration_name` |
136-
| <a name="output_observability_configuration_revision"></a> [observability\_configuration\_revision](#output\_observability\_configuration\_revision) | The revision of the observability configuration |
137-
| <a name="output_observability_configuration_status"></a> [observability\_configuration\_status](#output\_observability\_configuration\_status) | The current state of the observability configuration. An `INACTIVE` configuration revision has been deleted and can't be used. It is permanently removed some time after deletion |
129+
| <a name="output_observability_configurations"></a> [observability\_configurations](#output\_observability\_configurations) | Map of attribute maps for all observability configurations created |
130+
| <a name="output_security_group_arn"></a> [security\_group\_arn](#output\_security\_group\_arn) | Amazon Resource Name (ARN) of the VPC connector security group |
131+
| <a name="output_security_group_id"></a> [security\_group\_id](#output\_security\_group\_id) | ID of the VPC connector security group |
138132
| <a name="output_service_arn"></a> [service\_arn](#output\_service\_arn) | The Amazon Resource Name (ARN) of the service |
139133
| <a name="output_service_id"></a> [service\_id](#output\_service\_id) | An alphanumeric ID that App Runner generated for this service. Unique within the AWS Region |
140134
| <a name="output_service_status"></a> [service\_status](#output\_service\_status) | The current state of the App Runner service |

main.tf

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ data "aws_partition" "current" {}
77
resource "aws_apprunner_service" "this" {
88
count = var.create && var.create_service ? 1 : 0
99

10-
auto_scaling_configuration_arn = try(aws_apprunner_auto_scaling_configuration_version.this[0].arn, null)
10+
auto_scaling_configuration_arn = var.auto_scaling_configuration_arn
1111

1212
dynamic "encryption_configuration" {
1313
for_each = length(var.encryption_configuration) > 0 ? [var.encryption_configuration] : []
@@ -49,7 +49,7 @@ resource "aws_apprunner_service" "this" {
4949

5050
content {
5151
egress_type = try(egress_configuration.value.egress_type, null)
52-
vpc_connector_arn = var.create_vpc_connector ? aws_apprunner_vpc_connector.this[0].arn : try(egress_configuration.value.vpc_connector_arn, null)
52+
vpc_connector_arn = try(egress_configuration.value.vpc_connector_arn, null)
5353
}
5454
}
5555
}
@@ -59,8 +59,8 @@ resource "aws_apprunner_service" "this" {
5959
for_each = length(var.observability_configuration) > 0 ? [var.observability_configuration] : []
6060

6161
content {
62-
observability_configuration_arn = var.create_observability_configuration ? aws_apprunner_observability_configuration.this[0].arn : try(observability_configuration.value.observability_configuration_arn, null)
63-
observability_enabled = try(observability_configuration.value.observability_enabled, null)
62+
observability_configuration_arn = observability_configuration.value.observability_configuration_arn
63+
observability_enabled = try(observability_configuration.value.observability_enabled, true)
6464
}
6565
}
6666

@@ -277,7 +277,7 @@ resource "aws_iam_role" "instance" {
277277
}
278278

279279
resource "aws_iam_role_policy_attachment" "instance_xray" {
280-
count = local.create_instance_iam_role && try(var.observability_trace_configuration.vendor, null) == "AWSXRAY" ? 1 : 0
280+
count = local.create_instance_iam_role && try(var.observability_configuration.value.observability_enabled, false) ? 1 : 0
281281

282282
policy_arn = "arn:${data.aws_partition.current.id}:iam::aws:policy/AWSXRayDaemonWriteAccess"
283283
role = aws_iam_role.instance[0].name
@@ -290,6 +290,50 @@ resource "aws_iam_role_policy_attachment" "instance" {
290290
role = aws_iam_role.instance[0].name
291291
}
292292

293+
################################################################################
294+
# Custom Domain Association
295+
################################################################################
296+
297+
locals {
298+
create_custom_domain_association = var.create && var.create_custom_domain_association
299+
}
300+
301+
resource "aws_apprunner_custom_domain_association" "this" {
302+
count = local.create_custom_domain_association ? 1 : 0
303+
304+
domain_name = var.domain_name
305+
enable_www_subdomain = var.enable_www_subdomain
306+
service_arn = aws_apprunner_service.this[0].arn
307+
}
308+
309+
# resource "aws_route53_record" "validation" {
310+
# for_each = {
311+
# for dvo in aws_apprunner_custom_domain_association.this[0].certificate_validation_records : dvo.name => {
312+
# name = dvo.name
313+
# record = dvo.value
314+
# type = dvo.type
315+
# } if local.create_custom_domain_association
316+
# }
317+
318+
# allow_overwrite = true
319+
# name = each.value.name
320+
# records = [each.value.record]
321+
# ttl = 60
322+
# type = each.value.type
323+
# zone_id = var.hosted_zone_id
324+
# }
325+
326+
# resource "aws_route53_record" "cname" {
327+
# count = local.create_custom_domain_association ? 1 : 0
328+
329+
# allow_overwrite = true
330+
# name = var.domain_name
331+
# records = [aws_apprunner_custom_domain_association.this[0].dns_target]
332+
# ttl = 3600
333+
# type = "CNAME"
334+
# zone_id = var.hosted_zone_id
335+
# }
336+
293337
################################################################################
294338
# VPC Connector
295339
################################################################################
@@ -352,81 +396,49 @@ resource "aws_security_group_rule" "this" {
352396
}
353397

354398
################################################################################
355-
# Autoscaling
399+
# Connection(s)
356400
################################################################################
357401

358-
resource "aws_apprunner_auto_scaling_configuration_version" "this" {
359-
count = var.create && var.create_autoscaling_configuration ? 1 : 0
360-
361-
auto_scaling_configuration_name = try(coalesce(var.autoscaling_name, var.service_name), "")
402+
resource "aws_apprunner_connection" "this" {
403+
for_each = { for k, v in var.connections : k => v if var.create }
362404

363-
max_concurrency = var.autoscaling_max_concurrency
364-
max_size = var.autoscaling_max_size
365-
min_size = var.autoscaling_min_size
405+
connection_name = try(each.value.name, each.value.key)
406+
provider_type = try(each.value.provider_type, "GITHUB")
366407

367-
tags = var.tags
408+
tags = merge(var.tags, try(each.value.tags, {}))
368409
}
369410

370411
################################################################################
371-
# Custom Domain Association
412+
# Auto-Scaling Configuration(s)
372413
################################################################################
373414

374-
locals {
375-
create_custom_domain_association = var.create && var.create_custom_domain_association
376-
}
415+
resource "aws_apprunner_auto_scaling_configuration_version" "this" {
416+
for_each = { for k, v in var.auto_scaling_configurations : k => v if var.create }
377417

378-
resource "aws_apprunner_custom_domain_association" "this" {
379-
count = local.create_custom_domain_association ? 1 : 0
418+
auto_scaling_configuration_name = try(each.value.name, each.value.key)
419+
max_concurrency = try(each.value.max_concurrency, null)
420+
max_size = try(each.value.max_size, null)
421+
min_size = try(each.value.min_size, null)
380422

381-
domain_name = var.domain_name
382-
enable_www_subdomain = var.enable_www_subdomain
383-
service_arn = aws_apprunner_service.this[0].arn
423+
tags = merge(var.tags, try(each.value.tags, {}))
384424
}
385425

386-
# resource "aws_route53_record" "validation" {
387-
# for_each = {
388-
# for dvo in aws_apprunner_custom_domain_association.this[0].certificate_validation_records : dvo.name => {
389-
# name = dvo.name
390-
# record = dvo.value
391-
# type = dvo.type
392-
# } if local.create_custom_domain_association
393-
# }
394-
395-
# allow_overwrite = true
396-
# name = each.value.name
397-
# records = [each.value.record]
398-
# ttl = 60
399-
# type = each.value.type
400-
# zone_id = var.hosted_zone_id
401-
# }
402-
403-
# resource "aws_route53_record" "cname" {
404-
# count = local.create_custom_domain_association ? 1 : 0
405-
406-
# allow_overwrite = true
407-
# name = var.domain_name
408-
# records = [aws_apprunner_custom_domain_association.this[0].dns_target]
409-
# ttl = 3600
410-
# type = "CNAME"
411-
# zone_id = var.hosted_zone_id
412-
# }
413-
414426
################################################################################
415-
# Observability Configuration
427+
# Observability Configuration(s)
416428
################################################################################
417429

418430
resource "aws_apprunner_observability_configuration" "this" {
419-
count = var.create && var.create_observability_configuration ? 1 : 0
431+
for_each = { for k, v in var.observability_configurations : k => v if var.create }
420432

421-
observability_configuration_name = try(coalesce(var.observability_configuration_name, var.service_name), "")
433+
observability_configuration_name = try(each.value.name, each.value.key)
422434

423435
dynamic "trace_configuration" {
424-
for_each = length(var.observability_trace_configuration) > 0 ? [var.observability_trace_configuration] : []
436+
for_each = try([each.value.trace_configuration], [])
425437

426438
content {
427439
vendor = try(trace_configuration.value.vendor, "AWSXRAY")
428440
}
429441
}
430442

431-
tags = var.tags
443+
tags = merge(var.tags, try(each.value.tags, {}))
432444
}

0 commit comments

Comments
 (0)