I am using AWS SAM with Python. My goal is to have two Lambdas:
- Function A: A normal synchronous Lambda which will invoke Function B, then return quickly
- Function B: A long-running asynchronous Event Lambda
There are a couple other SO questions which deal with this scenario, but as far as I can tell none have touched on how to do it when deploying SAM locally.
Here is my SAM template file:
# template.yaml
Resources:
FunctionA:
# PUT /functions/a, should invoke FunctionB asynchronously
Type: AWS::Serverless::Function
Properties:
CodeUri: api/
Handler: functions.a
Runtime: python3.7
Events:
FunctionA:
Type: Api
Properties:
Path: /functions/a
Method: put
FunctionB:
# Long-running asynchronous function
Type: AWS::Serverless::Function
Properties:
FunctionName: 'FunctionB'
CodeUri: api/
Handler: functions.b
Runtime: python3.7
EventInvokeConfig:
MaximumRetryAttempts: 2
DestinationConfig:
OnSuccess:
Type: SQS
OnFailure:
Type: SQS
And my Python lambda handler logic:
# functions.py
def a(event, context):
boto3.client('lambda').invoke(
FunctionName='FunctionB',
InvocationType='Event',
Payload='some_data'.encode('UTF-8')
)
return { "statusCode": 200, "body": {} }
def b(data):
print("SUCCESS!")
I deploy it locally:
# deploy.sh
sam build
sam local start-api
All is well until this point. When I call PUT /functions/a
, I get the following error indicating that Function B could not be invoked from Function A:
[ERROR] ResourceNotFoundException: An error occurred (ResourceNotFoundException) when calling the Invoke operation: Function not found: arn:aws:lambda:us-east-2:[iam-user-id]:function:FunctionB
Has anyone found a fix for this? Here's what I've tried:
- Verified that Function B can be invoked successfully via the command line:
sam local invoke FunctionB # works great
- Attempted to change the
InvocationType=Event
toInvocationType=RequestResponse
and received the same error - Instantiated the lambda client to reference the local URL
boto3.client('lambda', endpoint_url='http://localhost:3000')
# [ERROR] EndpointConnectionError: Could not connect to the endpoint URL: "http://localhost:3000/2015-03-31/functions/ScheduleShowsAsyncFunction/invocations"