From a099eb867e91177fbef81fa0e8415cc1136287b7 Mon Sep 17 00:00:00 2001 From: Nick Doyle Date: Fri, 6 Dec 2019 14:22:33 +1100 Subject: [PATCH] feat: support upload lambda to s3, to support fatter lambdas --- archive.tf | 11 ++++++++++ lambda.tf | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++-- outputs.tf | 8 +++---- variables.tf | 6 +++++ 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/archive.tf b/archive.tf index e374bff..e898627 100644 --- a/archive.tf +++ b/archive.tf @@ -39,3 +39,14 @@ data "external" "built" { module_relpath = path.module } } + + + +resource "aws_s3_bucket_object" "lambda_package" { + count = var.s3_bucket_lambda_package != null ? 1:0 + bucket = aws_s3_bucket.lambda_package[0].id + depends_on = [aws_s3_bucket.lambda_package] + key = lookup(data.external.archive.result, "filename") + source = data.external.built.result.filename + etag = "${filemd5(data.external.built.result.filename)}" +} diff --git a/lambda.tf b/lambda.tf index 2fdd510..9db82ab 100644 --- a/lambda.tf +++ b/lambda.tf @@ -1,5 +1,5 @@ resource "aws_lambda_function" "lambda" { - + count = var.s3_bucket_lambda_package != null ? 0:1 function_name = var.function_name description = var.description role = aws_iam_role.lambda.arn @@ -13,8 +13,8 @@ resource "aws_lambda_function" "lambda" { tags = var.tags # Use a generated filename to determine when the source code has changed. - filename = data.external.built.result.filename + depends_on = [null_resource.archive] # Add dynamic blocks based on variables. @@ -48,3 +48,61 @@ resource "aws_lambda_function" "lambda" { } } } + +resource "aws_s3_bucket" "lambda_package" { + count = var.s3_bucket_lambda_package != null ? 1:0 + bucket = var.s3_bucket_lambda_package + acl = "private" +} + +resource "aws_lambda_function" "lambda_from_s3" { + count = var.s3_bucket_lambda_package != null ? 1:0 + function_name = var.function_name + description = var.description + role = aws_iam_role.lambda.arn + handler = var.handler + memory_size = var.memory_size + reserved_concurrent_executions = var.reserved_concurrent_executions + runtime = var.runtime + layers = var.layers + timeout = local.timeout + publish = local.publish + tags = var.tags + + # Use a generated filename to determine when the source code has changed. + s3_bucket = aws_s3_bucket.lambda_package[0].id + s3_key = lookup(data.external.archive.result, "filename") + + depends_on = [null_resource.archive, aws_s3_bucket_object.lambda_package[0]] + + # Add dynamic blocks based on variables. + + dynamic "dead_letter_config" { + for_each = var.dead_letter_config == null ? [] : [var.dead_letter_config] + content { + target_arn = dead_letter_config.value.target_arn + } + } + + dynamic "environment" { + for_each = var.environment == null ? [] : [var.environment] + content { + variables = environment.value.variables + } + } + + dynamic "tracing_config" { + for_each = var.tracing_config == null ? [] : [var.tracing_config] + content { + mode = tracing_config.value.mode + } + } + + dynamic "vpc_config" { + for_each = var.vpc_config == null ? [] : [var.vpc_config] + content { + security_group_ids = vpc_config.value.security_group_ids + subnet_ids = vpc_config.value.subnet_ids + } + } +} diff --git a/outputs.tf b/outputs.tf index 8e9e4e6..bb68146 100644 --- a/outputs.tf +++ b/outputs.tf @@ -1,21 +1,21 @@ output "function_arn" { description = "The ARN of the Lambda function" - value = aws_lambda_function.lambda.arn + value = element(concat(aws_lambda_function.lambda.*.arn,aws_lambda_function.lambda_from_s3.*.arn),0) } output "function_invoke_arn" { description = "The Invoke ARN of the Lambda function" - value = aws_lambda_function.lambda.invoke_arn + value = element(concat(aws_lambda_function.lambda.*.invoke_arn,aws_lambda_function.lambda_from_s3.*.invoke_arn),0) } output "function_name" { description = "The name of the Lambda function" - value = aws_lambda_function.lambda.function_name + value = element(concat(aws_lambda_function.lambda.*.function_name,aws_lambda_function.lambda_from_s3.*.function_name),0) } output "function_qualified_arn" { description = "The qualified ARN of the Lambda function" - value = aws_lambda_function.lambda.qualified_arn + value = element(concat(aws_lambda_function.lambda.*.qualified_arn,aws_lambda_function.lambda_from_s3.*.qualified_arn),0) } output "role_arn" { diff --git a/variables.tf b/variables.tf index f42069f..75cbc73 100644 --- a/variables.tf +++ b/variables.tf @@ -17,6 +17,12 @@ variable "source_path" { type = string } +variable "s3_bucket_lambda_package" { + description = "s3 bucket to upload lambda package, and deploy lambda code from there, rather than direct post via api - enables fatter lambdas" + type = string + default = null +} + # Optional variables specific to this module. variable "build_command" {