raikumardipak
raikumardipak

Reputation: 1585

Getting error on invoking lambda through terraform after deployment. And finding no logs in Cloudwatch

My lambda file in python looks like this: greet_lambda.py

import os

def lambda_handler(event, context):
    return "{} from Lambda!".format(os.environ['greeting'])

My main.tf file is successfully deployed through terraform apply and looks like this:

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
    }
  }
}
provider "aws" {
   region = "us-east-1"
}
resource "aws_iam_role" "lambda_role" {
    name = "lambda_role"
    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}
resource "aws_lambda_function" "test_lambda" {
   function_name = "greet_lambda"
   s3_bucket = "dirai-terraform-lambda"
   s3_key    = "v1.0.0/greet_lambda.zip"
   handler = "greet_lambda.lambda_handler"
   runtime = "python3.7"
   role = aws_iam_role.lambda_role.arn
}

On invoking the lambda greet_lambda.py through the below command I get an error in output.txt file and no logs are generated in cloudwatch

$aws lambda invoke --region=us-east-1 --function-name=greet_lambda output.txt

Error in output.txt

{"errorMessage": "'greeting'", "errorType": "KeyError", "stackTrace": ["  File \"/var/task/greet_lambda.py\", line 4, in lambda_handler\n    return \"{} from Lambda!\".format(os.environ['greeting'])\n", "  File \"/var/lang/lib/python3.7/os.py\", line 681, in __getitem__\n    raise KeyError(key) from None\n"]}

Please advice where I am going wrong.

Upvotes: 1

Views: 456

Answers (1)

Marcin
Marcin

Reputation: 238189

os.environ['greeting'] tries to fetch lambda's environment variable called greeting. Your test_lambda does not have any such variables, defined using environment.

Not sure what you are trying to achieve with your lambda code, but maybe you are after:

import os

def lambda_handler(event, context):
    return "{} from Lambda!".format('greeting')

Update

To add managed policy use managed_policy_arns

resource "aws_iam_role" "lambda_role" {
    name = "lambda_role"

    managed_policy_arns = ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"]

    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

Upvotes: 4

Related Questions