Как вызвать AWS лямбду из другой лямбды в пределах локальной SAM? - PullRequest
3 голосов
/ 12 февраля 2020

Я использую 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

Кто-нибудь нашел исправление для этого? Вот что я попробовал:

  1. Проверено, что функция 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"
...