Lamda Function Execution Error

0

I created a python program that counts number of RDs instances anad prints it. Program runs fine in standlaone mode in Windows. I want to add this to AWS as Lambda Function.

#!/usr/bin/env python3

from boto3 import client

client = client('rds')

rds_instances = client.describe_db_instances(Filters=[{'Name':'engine', 'Values':['oracle-ee']}])

#print out just the number like your shell script
print(len(rds_instances['DBInstances']))

#Just a little additional code to show you how to access the results from the describe_db_instances call:
if len(rds_instances['DBInstances']) != 0:
    for db_instance in rds_instances['DBInstances']:
        db_engine = db_instance.get('Engine')
        print(db_engine)

I created a new IAM role "Lambda-Role" and gave it "administratorAcceess" policy because the policy "AWSLambda_FullAccess" generated a permission error for script to run a Boto or CLI command. I know this is not secure and I have to change it later.

However, I an getting this error even though the program does print the output. Do you know what is causing this and how to fix it?

Details Execution function: failed

{ "errorMessage": "Handler 'lambda_handler' missing on module 'lambda_function'", "errorType": "Runtime.HandlerNotFound", "requestId": "bfe08f55-5bb3-4d59-8c4d-fb448a4ec15c", "stackTrace": [] }

Log Output

{ 1 oracle-ee START RequestId: bfe08f55-5bb3-4d59-8c4d-fb448a4ec15c Version: $LATEST [ERROR] Runtime.HandlerNotFound: Handler 'lambda_handler' missing on module 'lambda_function' Traceback (most recent call last):END RequestId: bfe08f55-5bb3-4d59-8c4d-fb448a4ec15c REPORT RequestId: bfe08f55-5bb3-4d59-8c4d-fb448a4ec15c Duration: 20.24 ms Billed Duration: 21 ms Memory Size: 128 MB Max Memory Used: 78 MB Init Duration: 761.92 ms

1 回答
1
已接受的回答

Hello.

Try your Python code as below.
The Lambda function executes the handler method when the function is called, so you need to define the function as follows.
https://docs.aws.amazon.com/lambda/latest/dg/python-handler.html

#!/usr/bin/env python3

from boto3 import client

client = client('rds')

def lambda_handler(event, context):

    rds_instances = client.describe_db_instances(Filters=[{'Name':'engine', 'Values':['oracle-ee']}])

    #print out just the number like your shell script
    print(len(rds_instances['DBInstances']))

    #Just a little additional code to show you how to access the results from the describe_db_instances call:
    if len(rds_instances['DBInstances']) != 0:
        for db_instance in rds_instances['DBInstances']:
            db_engine = db_instance.get('Engine')
            print(db_engine)
profile picture
专家
已回答 4 个月前
profile pictureAWS
专家
已审核 4 个月前
  • I did add that new line after client variable statement but I get a runtime error now. See below. <<< def lambda_handler(event, context): >>>>

    I also tried addding the "Return" statement at the end but still did not resolve error.

    ====================================== Test Event Name RDS-Event

    Response { "errorMessage": "Syntax error in module 'lambda_function': expected an indented block after function definition on line 7 (lambda_function.py, line 9)", "errorType": "Runtime.UserCodeSyntaxError", "requestId": "32bc3e87-6cd7-4524-9c4e-2f2a45d21dab", "stackTrace": [ " File "/var/task/lambda_function.py" Line 9\n rds_instances = client.describe_db_instances(Filters=[{'Name':'engine', 'Values':['oracle-ee']}])\n" ] }

    Function Logs START RequestId: 32bc3e87-6cd7-4524-9c4e-2f2a45d21dab Version: $LATEST [ERROR] Runtime.UserCodeSyntaxError: Syntax error in module 'lambda_function': expected an indented block after function definition on line 7 (lambda_function.py, line 9) Traceback (most recent call last):   File "/var/task/lambda_function.py" Line 9     rds_instances = client.describe_db_instances(Filters=[{'Name':'engine', 'Values':['oracle-ee']}])END RequestId: 32bc3e87-6cd7-4524-9c4e-2f2a45d21dab REPORT RequestId: 32bc3e87-6cd7-4524-9c4e-2f2a45d21dab Duration: 1.75 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 34 MB

    Request ID 32bc3e87-6cd7-4524-9c4e-2f2a45d21dab

  • There seems to be an indentation problem in the error. However, I was unable to reproduce the same error even when running it with my AWS account. So please make sure you have copied and pasted my code correctly.

  • You are correct. It is strange that when I copy/paste your code which is exactly what I had it worked. Can I ask what permission roles did you grant the IAM role attached to Lambda so it can run the function? I used the "AdministratorAccess" but that is not secure. I tried "LambdaFullAccess" role before but it gave me permissions issue.

  • You are correct. It is strange that when I copy/paste your code which is exactly what I had it worked.

    Python is a programming language that divides blocks by indentation, so if the indentation is even slightly off, an error will occur.

    Can I ask what permission roles did you grant the IAM role attached to Lambda so it can run the function?
    I used the "AdministratorAccess" but that is not secure. I tried "LambdaFullAccess" role before but it gave me permissions issue.

    We have set permissions to output logs from Lambda to CloudWatch Logs and permissions to view RDS instances.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "logs:CreateLogGroup",
                "Resource": "arn:aws:logs:ap-northeast-1:1111111111111:*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "logs:CreateLogStream",
                    "logs:PutLogEvents"
                ],
                "Resource": [
                    "arn:aws:logs:ap-northeast-1:1111111111111:log-group:/aws/lambda/rdstest:*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "rds:DescribeDBInstances"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }
    
  • Are you suggesting to create a custom policy you listed and assign it to a new role for lambda access instead of using the ones provided by amazon?

    Does the policy depend on which region the service is running that needs to be updated because i see "ap-northeast"

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则