gpt4 book ai didi

python - 如何从 SAM 本地中的另一个 lambda 调用 AWS lambda?

转载 作者:行者123 更新时间:2023-12-03 14:47:58 26 4
gpt4 key购买 nike

我正在将 AWS SAM 与 Python 结合使用。我的目标是拥有两个 Lambda:

  • 函数A:一个普通的同步Lambda,它将调用函数B,然后快速返回
  • 函数 B:长时间运行的异步事件 Lambda

  • 还有一些其他问题可以处理这种情况,但据我所知,没有人涉及在本地部署 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 处理程序逻辑:

    # 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 ,我收到以下错误,表明无法从函数 A 调用函数 B:
    [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=EventInvocationType=RequestResponse并收到相同的错误
  • 实例化 lambda 客户端以引用本地 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"

    最佳答案

    您可以使用 sam local start-lambda要运行 FunctionA,它将在端口 3001 上进行模拟,并使用 lambda 客户端从 FunctionB 调用它:boto3.client('lambda', endpoint_url='http://docker.for.mac.localhost:3001')您必须使用 InvocationType=RequestResponse因为尚不支持 Event https://github.com/awslabs/aws-sam-cli/pull/749
    如果 FunctionB 是长时间运行的并且因为您只能使用 RequestResponse 您可以更改 lambda 客户端配置以增加超时:

    config_lambda = Config(retries={'total_max_attempts': 1}, read_timeout=1200)

    lambda_client = boto3.client('lambda',
    config=config_lambda,
    endpoint_url='http://docker.for.mac.localhost:3001')

    关于python - 如何从 SAM 本地中的另一个 lambda 调用 AWS lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60181387/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com