From c239f9d722c8c68cb5d43f96f108540c1b99f95b Mon Sep 17 00:00:00 2001
From: Chris Spitzenberger <43446469+spitzzz@users.noreply.github.com>
Date: Wed, 27 Apr 2022 03:50:38 -0500
Subject: [PATCH 1/2] feat: Add support for Lambda Function URL resource (#308)
---
.pre-commit-config.yaml | 4 ++--
README.md | 11 +++++++++--
examples/complete/README.md | 6 ++++--
examples/complete/main.tf | 14 ++++++++++++++
examples/complete/outputs.tf | 11 +++++++++++
examples/complete/versions.tf | 2 +-
main.tf | 23 +++++++++++++++++++++++
outputs.tf | 11 +++++++++++
variables.tf | 28 ++++++++++++++++++++++++++++
versions.tf | 2 +-
10 files changed, 104 insertions(+), 8 deletions(-)
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 093121e0..be3cc7aa 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
- rev: v1.62.3
+ rev: v1.69.0
hooks:
- id: terraform_fmt
- id: terraform_validate
@@ -23,7 +23,7 @@ repos:
- '--args=--only=terraform_standard_module_structure'
- '--args=--only=terraform_workspace_remote'
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.1.0
+ rev: v4.2.0
hooks:
- id: check-merge-conflict
- id: end-of-file-fixer
diff --git a/README.md b/README.md
index 86d97204..6f47a04f 100644
--- a/README.md
+++ b/README.md
@@ -602,7 +602,7 @@ Q4: What does this error mean - `"We currently do not support adding policies fo
| Name | Version |
|------|---------|
| [terraform](#requirement\_terraform) | >= 0.13.1 |
-| [aws](#requirement\_aws) | >= 4.8 |
+| [aws](#requirement\_aws) | >= 4.9 |
| [external](#requirement\_external) | >= 1.0 |
| [local](#requirement\_local) | >= 1.0 |
| [null](#requirement\_null) | >= 2.0 |
@@ -611,7 +611,7 @@ Q4: What does this error mean - `"We currently do not support adding policies fo
| Name | Version |
|------|---------|
-| [aws](#provider\_aws) | >= 4.8 |
+| [aws](#provider\_aws) | >= 4.9 |
| [external](#provider\_external) | >= 1.0 |
| [local](#provider\_local) | >= 1.0 |
| [null](#provider\_null) | >= 2.0 |
@@ -647,6 +647,7 @@ No modules.
| [aws_lambda_event_source_mapping.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_event_source_mapping) | resource |
| [aws_lambda_function.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource |
| [aws_lambda_function_event_invoke_config.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function_event_invoke_config) | resource |
+| [aws_lambda_function_url.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function_url) | resource |
| [aws_lambda_layer_version.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_layer_version) | resource |
| [aws_lambda_permission.current_version_triggers](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource |
| [aws_lambda_permission.unqualified_alias_triggers](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource |
@@ -684,22 +685,26 @@ No modules.
| [attach\_policy\_jsons](#input\_attach\_policy\_jsons) | Controls whether policy\_jsons should be added to IAM role for Lambda Function | `bool` | `false` | no |
| [attach\_policy\_statements](#input\_attach\_policy\_statements) | Controls whether policy\_statements should be added to IAM role for Lambda Function | `bool` | `false` | no |
| [attach\_tracing\_policy](#input\_attach\_tracing\_policy) | Controls whether X-Ray tracing policy should be added to IAM role for Lambda Function | `bool` | `false` | no |
+| [authorization\_type](#input\_authorization\_type) | The type of authentication that the Lambda Function URL uses. Set to 'AWS\_IAM' to restrict access to authenticated IAM users only. Set to 'NONE' to bypass IAM authentication and create a public endpoint. | `string` | `"NONE"` | no |
| [build\_in\_docker](#input\_build\_in\_docker) | Whether to build dependencies in Docker | `bool` | `false` | no |
| [cloudwatch\_logs\_kms\_key\_id](#input\_cloudwatch\_logs\_kms\_key\_id) | The ARN of the KMS Key to use when encrypting log data. | `string` | `null` | no |
| [cloudwatch\_logs\_retention\_in\_days](#input\_cloudwatch\_logs\_retention\_in\_days) | Specifies the number of days you want to retain log events in the specified log group. Possible values are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653. | `number` | `null` | no |
| [cloudwatch\_logs\_tags](#input\_cloudwatch\_logs\_tags) | A map of tags to assign to the resource. | `map(string)` | `{}` | no |
| [compatible\_architectures](#input\_compatible\_architectures) | A list of Architectures Lambda layer is compatible with. Currently x86\_64 and arm64 can be specified. | `list(string)` | `null` | no |
| [compatible\_runtimes](#input\_compatible\_runtimes) | A list of Runtimes this layer is compatible with. Up to 5 runtimes can be specified. | `list(string)` | `[]` | no |
+| [cors](#input\_cors) | CORS settings to be used by the Lambda Function URL | `any` | `{}` | no |
| [create](#input\_create) | Controls whether resources should be created | `bool` | `true` | no |
| [create\_async\_event\_config](#input\_create\_async\_event\_config) | Controls whether async event configuration for Lambda Function/Alias should be created | `bool` | `false` | no |
| [create\_current\_version\_allowed\_triggers](#input\_create\_current\_version\_allowed\_triggers) | Whether to allow triggers on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources) | `bool` | `true` | no |
| [create\_current\_version\_async\_event\_config](#input\_create\_current\_version\_async\_event\_config) | Whether to allow async event configuration on current version of Lambda Function (this will revoke permissions from previous version because Terraform manages only current resources) | `bool` | `true` | no |
| [create\_function](#input\_create\_function) | Controls whether Lambda Function resource should be created | `bool` | `true` | no |
+| [create\_lambda\_function\_url](#input\_create\_lambda\_function\_url) | Controls whether the Lambda Function URL resource should be created | `bool` | `false` | no |
| [create\_layer](#input\_create\_layer) | Controls whether Lambda Layer resource should be created | `bool` | `false` | no |
| [create\_package](#input\_create\_package) | Controls whether Lambda package should be created | `bool` | `true` | no |
| [create\_role](#input\_create\_role) | Controls whether IAM role for Lambda Function should be created | `bool` | `true` | no |
| [create\_unqualified\_alias\_allowed\_triggers](#input\_create\_unqualified\_alias\_allowed\_triggers) | Whether to allow triggers on unqualified alias pointing to $LATEST version | `bool` | `true` | no |
| [create\_unqualified\_alias\_async\_event\_config](#input\_create\_unqualified\_alias\_async\_event\_config) | Whether to allow async event configuration on unqualified alias pointing to $LATEST version | `bool` | `true` | no |
+| [create\_unqualified\_alias\_lambda\_function\_url](#input\_create\_unqualified\_alias\_lambda\_function\_url) | Whether to use unqualified alias pointing to $LATEST version in Lambda Function URL | `bool` | `true` | no |
| [dead\_letter\_target\_arn](#input\_dead\_letter\_target\_arn) | The ARN of an SNS topic or SQS queue to notify when an invocation fails. | `string` | `null` | no |
| [description](#input\_description) | Description of your Lambda Function (or Layer) | `string` | `""` | no |
| [destination\_on\_failure](#input\_destination\_on\_failure) | Amazon Resource Name (ARN) of the destination resource for failed asynchronous invocations | `string` | `null` | no |
@@ -790,6 +795,8 @@ No modules.
| [lambda\_function\_qualified\_arn](#output\_lambda\_function\_qualified\_arn) | The ARN identifying your Lambda Function Version |
| [lambda\_function\_source\_code\_hash](#output\_lambda\_function\_source\_code\_hash) | Base64-encoded representation of raw SHA-256 sum of the zip file |
| [lambda\_function\_source\_code\_size](#output\_lambda\_function\_source\_code\_size) | The size in bytes of the function .zip file |
+| [lambda\_function\_url](#output\_lambda\_function\_url) | The URL of the Lambda Function URL |
+| [lambda\_function\_url\_id](#output\_lambda\_function\_url\_id) | The Lambda Function URL generated id |
| [lambda\_function\_version](#output\_lambda\_function\_version) | Latest published version of Lambda Function |
| [lambda\_layer\_arn](#output\_lambda\_layer\_arn) | The ARN of the Lambda Layer with version |
| [lambda\_layer\_created\_date](#output\_lambda\_layer\_created\_date) | The date Lambda Layer resource was created |
diff --git a/examples/complete/README.md b/examples/complete/README.md
index d0231c02..1ed48636 100644
--- a/examples/complete/README.md
+++ b/examples/complete/README.md
@@ -21,14 +21,14 @@ Note that this example may create resources which cost money. Run `terraform des
| Name | Version |
|------|---------|
| [terraform](#requirement\_terraform) | >= 0.13.1 |
-| [aws](#requirement\_aws) | >= 4.8 |
+| [aws](#requirement\_aws) | >= 4.9 |
| [random](#requirement\_random) | >= 2.0 |
## Providers
| Name | Version |
|------|---------|
-| [aws](#provider\_aws) | >= 4.8 |
+| [aws](#provider\_aws) | >= 4.9 |
| [random](#provider\_random) | >= 2.0 |
## Modules
@@ -73,6 +73,8 @@ No inputs.
| [lambda\_function\_qualified\_arn](#output\_lambda\_function\_qualified\_arn) | The ARN identifying your Lambda Function Version |
| [lambda\_function\_source\_code\_hash](#output\_lambda\_function\_source\_code\_hash) | Base64-encoded representation of raw SHA-256 sum of the zip file |
| [lambda\_function\_source\_code\_size](#output\_lambda\_function\_source\_code\_size) | The size in bytes of the function .zip file |
+| [lambda\_function\_url](#output\_lambda\_function\_url) | The URL of the Lambda Function URL |
+| [lambda\_function\_url\_id](#output\_lambda\_function\_url\_id) | The Lambda Function URL generated id |
| [lambda\_function\_version](#output\_lambda\_function\_version) | Latest published version of Lambda Function |
| [lambda\_layer\_arn](#output\_lambda\_layer\_arn) | The ARN of the Lambda Layer with version |
| [lambda\_layer\_created\_date](#output\_lambda\_layer\_created\_date) | The date Lambda Layer resource was created |
diff --git a/examples/complete/main.tf b/examples/complete/main.tf
index d644fc5f..0d33d36c 100644
--- a/examples/complete/main.tf
+++ b/examples/complete/main.tf
@@ -66,6 +66,20 @@ module "lambda_function" {
}
}
+ ######################
+ # Lambda Function URL
+ ######################
+ create_lambda_function_url = true
+ authorization_type = "AWS_IAM"
+ cors = {
+ allow_credentials = true
+ allow_origins = ["*"]
+ allow_methods = ["*"]
+ allow_headers = ["date", "keep-alive"]
+ expose_headers = ["keep-alive", "date"]
+ max_age = 86400
+ }
+
######################
# Additional policies
######################
diff --git a/examples/complete/outputs.tf b/examples/complete/outputs.tf
index 83dbee63..91107b40 100644
--- a/examples/complete/outputs.tf
+++ b/examples/complete/outputs.tf
@@ -44,6 +44,17 @@ output "lambda_function_source_code_size" {
value = module.lambda_function.lambda_function_source_code_size
}
+# Lambda Function URL
+output "lambda_function_url" {
+ description = "The URL of the Lambda Function URL"
+ value = module.lambda_function.lambda_function_url
+}
+
+output "lambda_function_url_id" {
+ description = "The Lambda Function URL generated id"
+ value = module.lambda_function.lambda_function_url_id
+}
+
# Lambda Layer
output "lambda_layer_arn" {
description = "The ARN of the Lambda Layer with version"
diff --git a/examples/complete/versions.tf b/examples/complete/versions.tf
index b19bca77..629d346a 100644
--- a/examples/complete/versions.tf
+++ b/examples/complete/versions.tf
@@ -4,7 +4,7 @@ terraform {
required_providers {
aws = {
source = "hashicorp/aws"
- version = ">= 4.8"
+ version = ">= 4.9"
}
random = {
source = "hashicorp/random"
diff --git a/main.tf b/main.tf
index 57f9a041..3c9e4c4e 100644
--- a/main.tf
+++ b/main.tf
@@ -285,3 +285,26 @@ resource "aws_lambda_event_source_mapping" "this" {
}
}
}
+
+resource "aws_lambda_function_url" "this" {
+ count = local.create && var.create_function && !var.create_layer && var.create_lambda_function_url ? 1 : 0
+
+ function_name = aws_lambda_function.this[0].function_name
+
+ # Error: error creating Lambda Function URL: ValidationException
+ qualifier = var.create_unqualified_alias_lambda_function_url ? null : aws_lambda_function.this[0].version
+ authorization_type = var.authorization_type
+
+ dynamic "cors" {
+ for_each = length(keys(var.cors)) == 0 ? [] : [var.cors]
+
+ content {
+ allow_credentials = try(cors.value.allow_credentials, null)
+ allow_headers = try(cors.value.allow_headers, null)
+ allow_methods = try(cors.value.allow_methods, null)
+ allow_origins = try(cors.value.allow_origins, null)
+ expose_headers = try(cors.value.expose_headers, null)
+ max_age = try(cors.value.max_age, null)
+ }
+ }
+}
diff --git a/outputs.tf b/outputs.tf
index 53b6b8a3..f07a3450 100644
--- a/outputs.tf
+++ b/outputs.tf
@@ -44,6 +44,17 @@ output "lambda_function_source_code_size" {
value = try(aws_lambda_function.this[0].source_code_size, "")
}
+# Lambda Function URL
+output "lambda_function_url" {
+ description = "The URL of the Lambda Function URL"
+ value = try(aws_lambda_function_url.this[0].function_url, "")
+}
+
+output "lambda_function_url_id" {
+ description = "The Lambda Function URL generated id"
+ value = try(aws_lambda_function_url.this[0].url_id, "")
+}
+
# Lambda Layer
output "lambda_layer_arn" {
description = "The ARN of the Lambda Layer with version"
diff --git a/variables.tf b/variables.tf
index b1751877..55f9f61d 100644
--- a/variables.tf
+++ b/variables.tf
@@ -28,6 +28,12 @@ variable "create_role" {
default = true
}
+variable "create_lambda_function_url" {
+ description = "Controls whether the Lambda Function URL resource should be created"
+ type = bool
+ default = false
+}
+
variable "putin_khuylo" {
description = "Do you agree that Putin doesn't respect Ukrainian sovereignty and territorial integrity? More info: https://en.wikipedia.org/wiki/Putin_khuylo!"
type = bool
@@ -205,6 +211,28 @@ variable "image_config_working_directory" {
default = null
}
+###############
+# Function URL
+###############
+
+variable "create_unqualified_alias_lambda_function_url" {
+ description = "Whether to use unqualified alias pointing to $LATEST version in Lambda Function URL"
+ type = bool
+ default = true
+}
+
+variable "authorization_type" {
+ description = "The type of authentication that the Lambda Function URL uses. Set to 'AWS_IAM' to restrict access to authenticated IAM users only. Set to 'NONE' to bypass IAM authentication and create a public endpoint."
+ type = string
+ default = "NONE"
+}
+
+variable "cors" {
+ description = "CORS settings to be used by the Lambda Function URL"
+ type = any
+ default = {}
+}
+
########
# Layer
########
diff --git a/versions.tf b/versions.tf
index 74f13846..094732c8 100644
--- a/versions.tf
+++ b/versions.tf
@@ -4,7 +4,7 @@ terraform {
required_providers {
aws = {
source = "hashicorp/aws"
- version = ">= 4.8"
+ version = ">= 4.9"
}
external = {
source = "hashicorp/external"
From 19b9f11fc8ed04a34c02db553d3f463cab6b740a Mon Sep 17 00:00:00 2001
From: semantic-release-bot
Date: Wed, 27 Apr 2022 08:51:16 +0000
Subject: [PATCH 2/2] chore(release): version 3.2.0 [skip ci]
## [3.2.0](https://github.com/terraform-aws-modules/terraform-aws-lambda/compare/v3.1.1...v3.2.0) (2022-04-27)
### Features
* Add support for Lambda Function URL resource ([#308](https://github.com/terraform-aws-modules/terraform-aws-lambda/issues/308)) ([c239f9d](https://github.com/terraform-aws-modules/terraform-aws-lambda/commit/c239f9d722c8c68cb5d43f96f108540c1b99f95b))
---
CHANGELOG.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index de46e2fe..7d4682e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,13 @@
All notable changes to this project will be documented in this file.
+## [3.2.0](https://github.com/terraform-aws-modules/terraform-aws-lambda/compare/v3.1.1...v3.2.0) (2022-04-27)
+
+
+### Features
+
+* Add support for Lambda Function URL resource ([#308](https://github.com/terraform-aws-modules/terraform-aws-lambda/issues/308)) ([c239f9d](https://github.com/terraform-aws-modules/terraform-aws-lambda/commit/c239f9d722c8c68cb5d43f96f108540c1b99f95b))
+
### [3.1.1](https://github.com/terraform-aws-modules/terraform-aws-lambda/compare/v3.1.0...v3.1.1) (2022-04-13)