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
}
}
}
我已经使用 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
}
}
}