dherault / serverless-offline

Emulate AWS λ and API Gateway locally when developing your Serverless project
MIT License
5.19k stars 796 forks source link

Go Lang Error - "Proxy Handler could not detect JSON: Serverless" #853

Closed JimLynchCodes closed 4 years ago

JimLynchCodes commented 4 years ago

Hi, I created a new project like this (INSIDE OF GOPATH/src!!!!):

serverless create -t aws-go-dep -p myservice

I go into it and run make

cd myservice

here is my file in hello/main.go:

package main

import (
    "bytes"
    "context"
    "encoding/json"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

// Response is of type APIGatewayProxyResponse since we're leveraging the
// AWS Lambda Proxy Request functionality (default behavior)
//
// https://serverless.com/framework/docs/providers/aws/events/apigateway/#lambda-proxy-integration
type Response events.APIGatewayProxyResponse

// Handler is our lambda handler invoked by the `lambda.Start` function call
func Handler(ctx context.Context) (Response, error) {
    var buf bytes.Buffer

    body, err := json.Marshal(map[string]interface{}{
        "message": "Go Serverless v1.0! Your function executed successfully!",
    })
    if err != nil {
        return Response{StatusCode: 404}, err
    }
    json.HTMLEscape(&buf, body)

    resp := Response{
        StatusCode:      200,
        IsBase64Encoded: false,
        Body:            buf.String(),
        Headers: map[string]string{
            "Content-Type":           "application/json",
            "X-MyCompany-Func-Reply": "hello-handler",
        },
    }

    return resp, nil
}

func main() {
    lambda.Start(Handler)
}

I then run serverless offline:

sls offline start --port 5001

It seems to start up fine:

Serverless: Starting Offline: dev/us-east-1.

Serverless: Routes for hello:
Serverless: GET /hello
Serverless: POST /{apiVersion}/functions/myservice-dev-hello/invocations

Serverless: Routes for world:
Serverless: GET /world
Serverless: POST /{apiVersion}/functions/myservice-dev-world/invocations

Serverless: Offline [HTTP] listening on http://localhost:5001
Serverless: Enter "rp" to replay the last request

Then I try to call to the GET endpoint at http://localhost:5001/help

but I get the error:

Proxy Handler could not detect JSON: Serverless: Packaging service...

Proxy Handler could not detect JSON: Serverless: Excluding development dependencies...

Proxy Handler could not detect JSON: Serverless: Building Docker image...

Proxy Handler could not detect JSON:  

Proxy Handler could not detect JSON:   Error --------------------------------------------------

  Error: spawn docker ENOENT
      at Process.ChildProcess._handle.onexit (internal/child_process.js:190:19)
      at onErrorNT (internal/child_process.js:362:16)
      at _combinedTickCallback (internal/process/next_tick.js:139:11)
      at process._tickDomainCallback (internal/process/next_tick.js:219:9)

Proxy Handler could not detect JSON:      For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

Proxy Handler could not detect JSON:   Get Support --------------------------------------------
     Docs:          docs.serverless.com

Proxy Handler could not detect JSON:      Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

Proxy Handler could not detect JSON:   Your Environment Information ---------------------------
     Operating System:          darwin
     Node Version:              8.16.0

Proxy Handler could not detect JSON:      Framework Version:         1.59.1
     Plugin Version:            3.2.5

Proxy Handler could not detect JSON:      SDK Version:               2.2.1

Proxy Handler could not detect JSON:      Components Core Version:   1.1.2

Proxy Handler could not detect JSON:      Components CLI Version:    1.4.0

Serverless: Replying timeout after 30000ms
^CServerless: Got SIGINT signal. Offline Halting...
Serverless: Halting offline server

Also, My serverless.yml then looks like this:

# Welcome to Serverless!
#
# This file is the main config file for your service.
# It's very minimal at this point and uses default values.
# You can always add more config options for more control.
# We've included some commented out config examples here.
# Just uncomment any of them to get that config option.
#
# For full config options, check the docs:
#    docs.serverless.com
#
# Happy Coding!

service: myservice
# app and org for use with dashboard.serverless.com
#app: your-app-name
#org: your-org-name

# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"
frameworkVersion: '>=1.28.0 <2.0.0'

provider:
  name: aws
  runtime: go1.x

# you can overwrite defaults here
#  stage: dev
#  region: us-east-1

# you can add statements to the Lambda function's IAM Role here
#  iamRoleStatements:
#    - Effect: "Allow"
#      Action:
#        - "s3:ListBucket"
#      Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ]  }
#    - Effect: "Allow"
#      Action:
#        - "s3:PutObject"
#      Resource:
#        Fn::Join:
#          - ""
#          - - "arn:aws:s3:::"
#            - "Ref" : "ServerlessDeploymentBucket"
#            - "/*"

# you can define service wide environment variables here
#  environment:
#    variable1: value1

package:
  exclude:
    - ./**
  include:
    - ./bin/**

functions:
  hello:
    handler: bin/hello
    events:
      - http:
          path: hello
          method: get
  world:
    handler: bin/world
    events:
      - http:
          path: world
          method: get
#    The following are a few example events you can configure
#    NOTE: Please make sure to change your handler code to work with those events
#    Check the event documentation for details
# events:
#    events:
#      - http:
#          path: users/create
#          method: get
#      - websocket: $connect
#      - s3: ${env:BUCKET}
#      - schedule: rate(10 minutes)
#      - sns: greeter-topic
#      - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
#      - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
#      - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
#      - iot:
#          sql: "SELECT * FROM 'some_topic'"
#      - cloudwatchEvent:
#          event:
#            source:
#              - "aws.ec2"
#            detail-type:
#              - "EC2 Instance State-change Notification"
#            detail:
#              state:
#                - pending
#      - cloudwatchLog: '/aws/lambda/hello'
#      - cognitoUserPool:
#          pool: MyUserPool
#          trigger: PreSignUp
#      - alb:
#          listenerArn: arn:aws:elasticloadbalancing:us-east-1:XXXXXX:listener/app/my-load-balancer/50dc6c495c0c9188/
#          priority: 1
#          conditions:
#            host: example.com
#            path: /hello

#    Define function environment variables here
#    environment:
#      variable2: value2

# you can add CloudFormation resource templates here
#resources:
#  Resources:
#    NewResource:
#      Type: AWS::S3::Bucket
#      Properties:
#        BucketName: my-new-bucket
#  Outputs:
#     NewOutput:
#       Description: "Description for the output"
#       Value: "Some output value"

plugins: 
  - serverless-offline
dnalborczyk commented 4 years ago

thank you for raising the issue @JimTheMan

your issue is somewhat related to: https://github.com/dherault/serverless-offline/issues/851#issuecomment-563333227 and hopefully will work with: https://github.com/dherault/serverless-offline/pull/845

JimLynchCodes commented 4 years ago

Thank you @dnalborczyk, for I now I have dreams of a glorious tomorrow. 😄 🙏 🙏

dnalborczyk commented 4 years ago

fixed in: https://github.com/dherault/serverless-offline/pull/845

dnalborczyk commented 4 years ago

@JimTheMan we just released initial docker support with v6.0.0 alpha 54. feel free to give it a try and report back with any bugs or improvements.