Я использую AWS SAM с Python. Моя цель состоит в том, чтобы иметь две лямбды:
- Функция A: обычная синхронная лямбда, которая вызовет функцию B, а затем быстро вернется
- Функция B: длительная асинхронная лямбда-событие
Есть пара других SO вопросов, которые касаются этого сценария, но, насколько я могу судить, никто не коснулся того, как это сделать при локальном развертывании SAM.
Вот мой Файл шаблона SAM:
# 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
И мой Python lambda обработчик logi c:
# 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!")
Я развернул его локально:
# deploy.sh
sam build
sam local start-api
Все это хорошо до этого момента. Когда я вызываю PUT /functions/a
, я получаю следующую ошибку, указывающую, что функция B не может быть вызвана из функции 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
Кто-нибудь нашел исправление для этого? Вот что я попробовал:
- Проверено, что функция B может быть успешно вызвана из командной строки:
sam local invoke FunctionB # works great
Попытка изменить
InvocationType=Event
на
InvocationType=RequestResponse
и получение той же ошибки Создание экземпляра лямбда-клиента для ссылки на локальный 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"