Amazon web services Lambda通过API网关调用Lambda

Amazon web services Lambda通过API网关调用Lambda,amazon-web-services,aws-lambda,boto3,Amazon Web Services,Aws Lambda,Boto3,我好像没法让它工作。我通过C9创建了2个lambda。我使用boto3从一个lambda调用另一个lambda。通过C9一切似乎都很好,但当我发布并尝试通过API网关访问时,我总是收到端点请求超时错误 我知道这不可能是一个超时问题,因为我已经设置了yaml文件,以便有足够的时间执行,而lambda现在只返回一个字符串,非常简单 这是我当前的yaml文件。我想知道在第二个yaml中是否需要包含API网关的某些权限 Lambda1 AWSTemplateFormatVersion: '2010-09

我好像没法让它工作。我通过C9创建了2个lambda。我使用boto3从一个lambda调用另一个lambda。通过C9一切似乎都很好,但当我发布并尝试通过API网关访问时,我总是收到端点请求超时错误

我知道这不可能是一个超时问题,因为我已经设置了yaml文件,以便有足够的时间执行,而lambda现在只返回一个字符串,非常简单

这是我当前的yaml文件。我想知道在第二个yaml中是否需要包含API网关的某些权限

Lambda1

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
    api:
        Type: 'AWS::Serverless::Function'
        Properties:
        Description: ''
        Handler: api/lambda_function.lambda_handler
        MemorySize: 256
        Role: 'arn:aws:iam::820788395625:role/service-role/api_int-role'
        Runtime: python3.6
        Timeout: 30
        VpcConfig:
            SecurityGroupIds:
                - ...
            SubnetIds:
                - ...
        Policies: AWSLambdaFullAccess
Lambda2

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: An AWS Serverless Specification template describing your function.
Resources:
    api:
        Type: 'AWS::Serverless::Function'
        Properties:
            Description: ''
            Handler: api/lambda_function.lambda_handler
            MemorySize: 512
            Role: 'arn:aws:iam::820788395625:role/service-role/api_int-role'
            Runtime: python3.6
            Timeout: 15
            VpcConfig:
                SecurityGroupIds:
                    - ...
                SubnetIds:
                    - ...
我刚刚设置了一个直接指向Lambda2的API网关端点,它没有返回任何问题。所以

API网关->Lambda 2工作 API网关->Lambda 1->Lambda 2不工作

因此,出于某种原因,当我想通过Lambda 1通过API网关调用Lambda 2时,它不起作用

下面是调用第二个Lambda的代码

import json
import boto3

def lambda_handler(event, context):
    print('call boto3 client')
    lambda_client = boto3.client('lambda', region_name='us-east-1')
    print('boto3 client called')

    print('invoke lambda')
    env_response = lambda_client.invoke(
        FunctionName='cloud9-apiAlpha-api-TBSOYXLVBCLX',
        InvocationType='RequestResponse',
        Payload=json.dumps(event)
    )
    print('lambda invoked')

    print('env_response')
    print(env_response)
    print(env_response['Payload'])
    print(env_response['Payload'].read())

    return {
        'statusCode': 200,
        'headers': {
            'Content-Type': 'application/json', 
            'Access-Control-Allow-Methods': 'POST,GET,OPTIONS,PUT,DELETE',
            'Access-Control-Allow-Origin': '*'
        },
        'body': 'HELLO WORLD!',
        'isBase64Encoded': False
    }

现在,当我查看日志时,它会打印“invoke lambda”,但随后会停止并超时

1。如果没有一些配置,则无法从另一个lambda调用lambda。在.yml文件中,必须指定权限才能调用另一个Lambda。这可以通过在provider属性下添加iamRoleStatements部分来实现 或 通过将简单策略AWSLambdaRole添加到附加到lambda函数_1的现有角色


如果您使用的是InvocationType=RequestResponse,那么您可以从函数2返回一些响应。

最终找到了解决方案。我的问题的答案是Lambda 1和Lambda 2通过VPC运行,因此没有互联网连接。一旦我从Lambda 1中删除了VPC,Lambda 2的调用就没有任何问题了


只是想与大家分享一下,以防我可以为其他人节省一周的调试时间。LOL

您的角色是否有执行另一个lambda的适当权限?api_int-roleCan您能告诉我们如何调用lambda的实际代码吗?@AminAhmedKhan我被告知该角色有权执行另一个任务lambda@yorodm我已经分享了调用第二个lambdaI的代码如果您有超时问题,那么您可以异步调用lambda,或者增加调用lambdaI的超时阈值这是在C9中创建的,有一个模板。yml那么我也需要一个serverless.yml吗?我想你的lambda已经附加了一个现有角色,那么附加这个策略AWSLambdaRole是值得的。因此,在您的案例中,不需要对.yml文件进行任何更改,抱歉,如果我无法正确解释这些内容,那么一定有权限问题,因为在日志中,它会访问invoke_resp=lambda_client.invoke,然后挂起并最终超时OK,所以看起来这样做会使它工作负载=bytesencoded_payloadnice one json.loads应该会这样做
provider:  
    name: aws
    runtime: <runtime goes here> # e.g. python3.6 or nodejs6.10
    iamRoleStatements:
      - Effect: Allow
        Action:
          - lambda:InvokeFunction
        Resource: "*" 
global LAMBDA_CLIENT
if not LAMBDA_CLIENT:
    LAMBDA_CLIENT = boto3.client('lambda')
try:
    encoded_payload = json.dumps({'message': 'this is an invokcation call form lambda_1'}).encode(UTF_8)

    invoke_resp = lambda_client.invoke(
        FunctionName='function_2',
        InvocationType='RequestResponse',
        Payload=encoded_payload)

    status_code = invoke_resp['StatusCode']
    if status_code != 200:
        LOGGER.error('error ')
    paylaod = invoke_resp['Payload'].read()
    resp = json.loads(payload)
    print(resp)
except Exception: