Skip to content

Commit a1ad726

Browse files
k911Gowiemactions-bot
authored
feat: Allow specifing custom origins (#78)
Co-authored-by: Matt Gowie <[email protected]> Co-authored-by: actions-bot <[email protected]>
1 parent f7907f3 commit a1ad726

File tree

4 files changed

+43
-5
lines changed

4 files changed

+43
-5
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ Available targets:
178178
| cors\_expose\_headers | List of expose header in the response for S3 bucket | `list(string)` | <pre>[<br> "ETag"<br>]</pre> | no |
179179
| cors\_max\_age\_seconds | Time in seconds that browser can cache the response for S3 bucket | `number` | `3600` | no |
180180
| custom\_error\_response | List of one or more custom error response element maps | <pre>list(object({<br> error_caching_min_ttl = string<br> error_code = string<br> response_code = string<br> response_page_path = string<br> }))</pre> | `[]` | no |
181+
| custom\_origins | One or more custom origins for this distribution (multiples allowed). See documentation for configuration options description https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution.html#origin-arguments | <pre>list(object({<br> domain_name = string<br> origin_id = string<br> origin_path = string<br> custom_origin_config = object({<br> http_port = number<br> https_port = number<br> origin_protocol_policy = string<br> origin_ssl_protocols = list(string)<br> origin_keepalive_timeout = number<br> origin_read_timeout = number<br> })<br> }))</pre> | `[]` | no |
181182
| default\_root\_object | Object that CloudFront return when requests the root URL | `string` | `"index.html"` | no |
182183
| default\_ttl | Default amount of time (in seconds) that an object is in a CloudFront cache | `number` | `60` | no |
183184
| delimiter | Delimiter to be used between `namespace`, `stage`, `name` and `attributes` | `string` | `"-"` | no |
@@ -206,7 +207,7 @@ Available targets:
206207
| minimum\_protocol\_version | Cloudfront TLS minimum protocol version | `string` | `"TLSv1"` | no |
207208
| name | Name (e.g. `bastion` or `app`) | `string` | n/a | yes |
208209
| namespace | Namespace (e.g. `eg` or `cp`) | `string` | `""` | no |
209-
| ordered\_cache | An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.<br>The fields can be described by the other variables in this file. For example, the field 'lambda\_function\_association' in this object has<br>a description in var.lambda\_function\_association variable earlier in this file. The only difference is that fields on this object are in ordered caches, whereas the rest<br>of the vars in this file apply only to the default cache. | <pre>list(object({<br> path_pattern = string<br><br> allowed_methods = list(string)<br> cached_methods = list(string)<br> compress = bool<br><br> viewer_protocol_policy = string<br> min_ttl = number<br> default_ttl = number<br> max_ttl = number<br><br> forward_query_string = bool<br> forward_header_values = list(string)<br> forward_cookies = string<br><br> lambda_function_association = list(object({<br> event_type = string<br> include_body = bool<br> lambda_arn = string<br> }))<br> }))</pre> | `[]` | no |
210+
| ordered\_cache | An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.<br>The fields can be described by the other variables in this file. For example, the field 'lambda\_function\_association' in this object has<br>a description in var.lambda\_function\_association variable earlier in this file. The only difference is that fields on this object are in ordered caches, whereas the rest<br>of the vars in this file apply only to the default cache. Put value `""` on field `target_origin_id` to specify default s3 bucket origin. | <pre>list(object({<br> target_origin_id = string<br> path_pattern = string<br><br> allowed_methods = list(string)<br> cached_methods = list(string)<br> compress = bool<br><br> viewer_protocol_policy = string<br> min_ttl = number<br> default_ttl = number<br> max_ttl = number<br><br> forward_query_string = bool<br> forward_header_values = list(string)<br> forward_cookies = string<br><br> lambda_function_association = list(object({<br> event_type = string<br> include_body = bool<br> lambda_arn = string<br> }))<br> }))</pre> | `[]` | no |
210211
| origin\_bucket | Origin S3 bucket name | `string` | `""` | no |
211212
| origin\_force\_destroy | Delete all objects from the bucket so that the bucket can be destroyed without error (e.g. `true` or `false`) | `bool` | `false` | no |
212213
| origin\_path | An optional element that causes CloudFront to request your content from a directory in your Amazon S3 bucket or your custom origin. It must begin with a /. Do not add a / at the end of the path. | `string` | `""` | no |

docs/terraform.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
| cors\_expose\_headers | List of expose header in the response for S3 bucket | `list(string)` | <pre>[<br> "ETag"<br>]</pre> | no |
3535
| cors\_max\_age\_seconds | Time in seconds that browser can cache the response for S3 bucket | `number` | `3600` | no |
3636
| custom\_error\_response | List of one or more custom error response element maps | <pre>list(object({<br> error_caching_min_ttl = string<br> error_code = string<br> response_code = string<br> response_page_path = string<br> }))</pre> | `[]` | no |
37+
| custom\_origins | One or more custom origins for this distribution (multiples allowed). See documentation for configuration options description https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution.html#origin-arguments | <pre>list(object({<br> domain_name = string<br> origin_id = string<br> origin_path = string<br> custom_origin_config = object({<br> http_port = number<br> https_port = number<br> origin_protocol_policy = string<br> origin_ssl_protocols = list(string)<br> origin_keepalive_timeout = number<br> origin_read_timeout = number<br> })<br> }))</pre> | `[]` | no |
3738
| default\_root\_object | Object that CloudFront return when requests the root URL | `string` | `"index.html"` | no |
3839
| default\_ttl | Default amount of time (in seconds) that an object is in a CloudFront cache | `number` | `60` | no |
3940
| delimiter | Delimiter to be used between `namespace`, `stage`, `name` and `attributes` | `string` | `"-"` | no |
@@ -62,7 +63,7 @@
6263
| minimum\_protocol\_version | Cloudfront TLS minimum protocol version | `string` | `"TLSv1"` | no |
6364
| name | Name (e.g. `bastion` or `app`) | `string` | n/a | yes |
6465
| namespace | Namespace (e.g. `eg` or `cp`) | `string` | `""` | no |
65-
| ordered\_cache | An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.<br>The fields can be described by the other variables in this file. For example, the field 'lambda\_function\_association' in this object has<br>a description in var.lambda\_function\_association variable earlier in this file. The only difference is that fields on this object are in ordered caches, whereas the rest<br>of the vars in this file apply only to the default cache. | <pre>list(object({<br> path_pattern = string<br><br> allowed_methods = list(string)<br> cached_methods = list(string)<br> compress = bool<br><br> viewer_protocol_policy = string<br> min_ttl = number<br> default_ttl = number<br> max_ttl = number<br><br> forward_query_string = bool<br> forward_header_values = list(string)<br> forward_cookies = string<br><br> lambda_function_association = list(object({<br> event_type = string<br> include_body = bool<br> lambda_arn = string<br> }))<br> }))</pre> | `[]` | no |
66+
| ordered\_cache | An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.<br>The fields can be described by the other variables in this file. For example, the field 'lambda\_function\_association' in this object has<br>a description in var.lambda\_function\_association variable earlier in this file. The only difference is that fields on this object are in ordered caches, whereas the rest<br>of the vars in this file apply only to the default cache. Put value `""` on field `target_origin_id` to specify default s3 bucket origin. | <pre>list(object({<br> target_origin_id = string<br> path_pattern = string<br><br> allowed_methods = list(string)<br> cached_methods = list(string)<br> compress = bool<br><br> viewer_protocol_policy = string<br> min_ttl = number<br> default_ttl = number<br> max_ttl = number<br><br> forward_query_string = bool<br> forward_header_values = list(string)<br> forward_cookies = string<br><br> lambda_function_association = list(object({<br> event_type = string<br> include_body = bool<br> lambda_arn = string<br> }))<br> }))</pre> | `[]` | no |
6667
| origin\_bucket | Origin S3 bucket name | `string` | `""` | no |
6768
| origin\_force\_destroy | Delete all objects from the bucket so that the bucket can be destroyed without error (e.g. `true` or `false`) | `bool` | `false` | no |
6869
| origin\_path | An optional element that causes CloudFront to request your content from a directory in your Amazon S3 bucket or your custom origin. It must begin with a /. Do not add a / at the end of the path. | `string` | `""` | no |

main.tf

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,23 @@ resource "aws_cloudfront_distribution" "default" {
236236
}
237237
}
238238

239+
dynamic "origin" {
240+
for_each = var.custom_origins
241+
content {
242+
domain_name = origin.value.domain_name
243+
origin_id = origin.value.origin_id
244+
origin_path = lookup(origin.value, "origin_path", "")
245+
custom_origin_config {
246+
http_port = lookup(origin.value.custom_origin_config, "http_port", null)
247+
https_port = lookup(origin.value.custom_origin_config, "https_port", null)
248+
origin_protocol_policy = lookup(origin.value.custom_origin_config, "origin_protocol_policy", "https-only")
249+
origin_ssl_protocols = lookup(origin.value.custom_origin_config, "origin_ssl_protocols", ["TLSv1.2"])
250+
origin_keepalive_timeout = lookup(origin.value.custom_origin_config, "origin_keepalive_timeout", 60)
251+
origin_read_timeout = lookup(origin.value.custom_origin_config, "origin_read_timeout", 60)
252+
}
253+
}
254+
}
255+
239256
viewer_certificate {
240257
acm_certificate_arn = var.acm_certificate_arn
241258
ssl_support_method = var.acm_certificate_arn == "" ? "" : "sni-only"
@@ -282,7 +299,7 @@ resource "aws_cloudfront_distribution" "default" {
282299

283300
allowed_methods = ordered_cache_behavior.value.allowed_methods
284301
cached_methods = ordered_cache_behavior.value.cached_methods
285-
target_origin_id = module.distribution_label.id
302+
target_origin_id = ordered_cache_behavior.value.target_origin_id == "" ? module.distribution_label.id : ordered_cache_behavior.value.target_origin_id
286303
compress = ordered_cache_behavior.value.compress
287304
trusted_signers = var.trusted_signers
288305

variables.tf

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,8 @@ variable "ipv6_enabled" {
386386

387387
variable "ordered_cache" {
388388
type = list(object({
389-
path_pattern = string
389+
target_origin_id = string
390+
path_pattern = string
390391

391392
allowed_methods = list(string)
392393
cached_methods = list(string)
@@ -412,10 +413,28 @@ variable "ordered_cache" {
412413
An ordered list of cache behaviors resource for this distribution. List from top to bottom in order of precedence. The topmost cache behavior will have precedence 0.
413414
The fields can be described by the other variables in this file. For example, the field 'lambda_function_association' in this object has
414415
a description in var.lambda_function_association variable earlier in this file. The only difference is that fields on this object are in ordered caches, whereas the rest
415-
of the vars in this file apply only to the default cache.
416+
of the vars in this file apply only to the default cache. Put value `""` on field `target_origin_id` to specify default s3 bucket origin.
416417
DESCRIPTION
417418
}
418419

420+
variable "custom_origins" {
421+
type = list(object({
422+
domain_name = string
423+
origin_id = string
424+
origin_path = string
425+
custom_origin_config = object({
426+
http_port = number
427+
https_port = number
428+
origin_protocol_policy = string
429+
origin_ssl_protocols = list(string)
430+
origin_keepalive_timeout = number
431+
origin_read_timeout = number
432+
})
433+
}))
434+
default = []
435+
description = "One or more custom origins for this distribution (multiples allowed). See documentation for configuration options description https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution.html#origin-arguments"
436+
}
437+
419438
variable "website_enabled" {
420439
type = bool
421440
default = false

0 commit comments

Comments
 (0)