dherault / dherault/serverless-offline

Boto3/Python can't invoke lambda function.

Open
#1,666 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
5.3k
Forks
811
Avg merge
2d 4h
Merged PRs (30d)
3

Description

## Bug Report

**Current Behavior**
- Boto3 client runs into `Conneciton timed out`when trying to invoke serverless-offline's lambda port.
- Error log: ` Could not connect to the endpoint URL: "http://localhost:4006/2015-03-31/functions/slackService-dev-slack-service/invocations`

Using postman for httpPort triggers local lambda correctly.

**Sample Code**

`serverless.yml`:

```
service: slackService
frameworkVersion: "3"

provider:
name: aws
runtime: python3.8
stackName: ${opt:stage, 'dev'}-${self:service}
deploymentBucket:
name: ${opt:stage, 'dev'}-slack-service

plugins:
- serverless-python-requirements
- serverless-deployment-bucket
- serverless-latest-layer-version
- serverless-offline

functions:
slack-service:
handler: app.dispatcher.dispatcher
events:
- httpApi: "POST /slack-service"

custom:
pythonRequirements:
dockerizePip: true
serverless-offline:
lambdaPort: 4006
httpPort: 4005

```

- file: dispatcher.py
```
import json

def dispatcher(event, context):
body = {
"message": "Go Serverless v3.0! Your function executed successfully!",
"input": event,
}
print("event")
print(event)
record = event["Records"][0]

response = {"statusCode": 200, "body": json.dumps(body)}

return response
```

Output from running `sls offline start`:
```
Starting Offline at stage dev (us-east-1)

Offline [http for lambda] listening on http://localhost:4006
Function names exposed for local invocation by aws-sdk:
* slack-service: slackService-dev-slack-service
│ POST | http://localhost:4005/slack-service │
│ POST | http://localhost:4005/2015-03-31/functions/slack-service/invocations │
```

How I'm invoking it:
```
lambda_client = boto3.client(
"lambda",
region_name="local",
aws_access_key_id="test",
aws_secret_access_key="test2",
endpoint_url="http://localhost:4006",
)

lambda_client.invoke(
FunctionName="slackService-dev-slack-service",
Payload=(json.dumps({"eventId": event.id})),
)
```

error msg:

**Expected behavior/code**
- I believe we are supposed to use the `lambdaPort` when we want to invoke the function thru lambda client, but it's not working.
- Tried httpPorts just in case as well but those are failling as well.

**Environment**

- `serverless` version:
- Framework Core: 3.25.1
- Plugin: 6.2.2
- SDK: 4.3.2
- `serverless-offline` version: 12.0.4
- `node.js` version: v16.14.0
- `OS`: macOS 12.2.1

_optional, if you are using any of the following frameworks to invoke handlers_

- `python` version: 3.8.9

**Possible Solution**

**Additional context/Screenshots**

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.