Why do I get "Error: handler and runtime must be set when PackageType is Zip" when deploying a Lambda function using Terraform?

Why do I get "Error: handler and runtime must be set when PackageType is Zip" when deploying a Lambda function using Terraform?

我已经使用 Terraform 定义了一个 Lambda 函数,如下所示:

resource "aws_lambda_function" "this" {
  filename = "${path.module}/src/existing-files-lambda.zip"
  function_name = "ingest-existing-files-lambda"
  role = aws_iam_role.lambda.arn

  runtime = "python3.9"
  timeout = 900
  environment {
   variables = {
      source_bucket_arn = var.source_bucket_arn  
      destination_bucket_arn = var.destination_bucket_arn  
    }
  }
}

resource "aws_iam_role" "lambda" {
  name = "${var.prefix}-lambda-ingest"
  path = "/service-role/"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [{
      Effect    = "Allow"
      Principal = { Service = "lambda.amazonaws.com" }
      Action    = "sts:AssumeRole"
    }]
  })
}

我的 python 文件是这样的:

import os


def lambda_handler(event, context):
    print('Hello world from Terraform')
    return {
        'statusCode': 200,
    }

但是,我目前收到的错误是:

│ Error: handler and runtime must be set when PackageType is Zip
│ 
│   with module.ingest_lambda.aws_lambda_function.this,
│   on ingest_lambda/main.tf line 8, in resource "aws_lambda_function" "this":
│    8: resource "aws_lambda_function" "this" {

handler 这里要填什么?

我已经指定了 runtime

我认为您需要在此处添加处理程序:

resource "aws_lambda_function" "this" {
  filename = "${path.module}/src/existing-files-lambda.zip"
  function_name = "ingest-existing-files-lambda"
  handler = "ingest-existing-files-lambda.lambda_handler"
  role = aws_iam_role.lambda.arn

  runtime = "python3.9"
  timeout = 900
  environment {
   variables = {
      source_bucket_arn = var.source_bucket_arn  
      destination_bucket_arn = var.destination_bucket_arn  
    }
  }
}

检查您的 AWS 控制台,在执行上述语句后在 lambda 服务中正确设置处理程序。

您已经定义了 Lambda 函数运行时,但您没有提到函数的入口点在哪里。


那就是handler argument specifies - it is the method in your function code that processes events.

它的格式应该类似于:

def handler_name(event, context): 
    ...
    return some_value

处理程序参数的值由以下内容组成,以点分隔:

  • Lambda 处理函数所在文件的名称
  • Python 处理函数的名称。

例如 ingest-existing-files-lambda.lambda_handler 调用 ingest-existing-files-lambda.py 中定义的 lambda_handler 函数。

如果您的 Lambda 处理程序方法被调用 lambda_handler 并且在 ingest-existing-files-lambda.py 内,这应该有效:

resource "aws_lambda_function" "this" {
  filename = "${path.module}/src/existing-files-lambda.zip"
  function_name = "ingest-existing-files-lambda"
  handler = "ingest-existing-files-lambda.lambda_handler"
  role = aws_iam_role.lambda.arn

  runtime = "python3.9"
  timeout = 900
  environment {
   variables = {
      source_bucket_arn = var.source_bucket_arn  
      destination_bucket_arn = var.destination_bucket_arn  
    }
  }
}