SAM AWS Lambda Works But Never Returns while Reporting a Timeout Issue

1k views Asked by At

I have a weird issue running AWS SAM Lambda functions which I discovered through the AWS SAM API tools. My lambda request fully completes but no response is received by the call to the function.

Technology: Windows 10 + AWS CLI + AWS SAM + IntelliJ with the AWS toolkit installed

I run SAM from the command line.

Attempts to rectify this issue include:

  • reinstalling Docker for Windows with WSL
  • cleared all data folders for Docker
  • Drop all docker containers and images
  • running Docker without WSL using Hyper-V
  • reinstalling the AWS CLI and SAM CLI from scratch after a full reinstall
  • repairing the AWS CLI and SAM CLI
  • restarted my computer
  • Updating the timeuot in my template.yaml to 10 seconds
  • A combination of the above

There is still no response. The function is the basic one created by Intellij for node.js 12. The console.log statements work. The strange part is that it appeared to work for the first several attempts but became unresponsive I tried to use serverless to match the aws-lambda api package example in NodeJS for CORS.

My app.js code:

// const axios = require('axios')
// const url = 'http://checkip.amazonaws.com/';
let response;

/**
 *
 * Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format
 * @param {Object} event - API Gateway Lambda Proxy Input Format
 *
 * Context doc: https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html 
 * @param {Object} context
 *
 * Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
 * @returns {Object} object - API Gateway Lambda Proxy Output Format
 * 
 */
exports.lambdaHandler = async (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    context.callbackWaitsForEmptyEventLoop = false
    try {
        // const ret = await axios(url);
        response = {
            'statusCode': 200,
            'body': JSON.stringify({
                message: 'hello world',
                // location: ret.data.trim()
            })
        }
    } catch (err) {
        console.log('[Handler] - Main function: ', err);
        return err;
    }
    console.log(response)
    callback(null, response) 
    //return response * also fails with the same output
};

My template.yml:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  AWS

  Sample SAM Template for AWS
  
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs12.x
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn

The commands used to start lambda [same error occurs using start-api]: sam local start-lambda

Docker is running.

The command then used to test the function:

aws lambda invoke --function-name "HelloWorldFunction" --endpoint-url "http://127.0.0.1:3001" --no-verify-ssl out.txt

The console logs:

Mounting C:\xxxxx\HelloWorldFunction as /var/task:ro,delegated inside runtime container
EST←[0m
2020-10-20T02:19:57.531Z        52435aa1-18cd-10ea-6238-f3065012cca7
2020-10-20T02:19:57.535Z        52435aa1-18cd-10ea-6238-f3065012cca7
        INFO    { statusCode: 200, body: '{"message":"hello world"}' }
←[32mEND RequestId: 52435aa1-18cd-10ea-6238-f3065012cca7←[0m
←[32mREPORT RequestId: 52435aa1-18cd-10ea-6238-f3065012cca7     Init Duration: 289.89 ms        Duration: 8.17 ms       Billed Duration: 100 ms
        Memory Size: 128 MB     Max Memory Used: 48 MB  ←[0m
Function 'HelloWorldFunction' timed out after 3 seconds
Invoking app.lambdaHandler (nodejs12.x)
Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-nodejs12.x:rapid-1.6.2.

Mounting  C:\xxxxx\HelloWorldFunction as /var/task:ro,delegated inside runtime container
←[32mSTART RequestId: be9410b4-deee-1639-5c0d-b08114bfb814 Version: $LATEST←[0m
2020-10-20T02:20:26.016Z        be9410b4-deee-1639-5c0d-b08114bfb814
        INFO    Received event: {}
2020-10-20T02:20:26.021Z        be9410b4-deee-1639-5c0d-b08114bfb814
        INFO    { statusCode: 200, body: '{"message":"hello world"}' }
←[32mEND RequestId: be9410b4-deee-1639-5c0d-b08114bfb814←[0m
←[32mREPORT RequestId: be9410b4-deee-1639-5c0d-b08114bfb814     Init Duration: 163.68 ms        Duration: 9.80 ms       Billed Duration: 100 ms
        Memory Size: 128 MB     Max Memory Used: 46 MB  ←[0m
Function 'HelloWorldFunction' timed out after 3 seconds

Does anyone know what the issue may be? How can I solve this?

0

There are 0 answers