Lambda вызывает Lambda через API-шлюз - PullRequest
0 голосов
/ 07 сентября 2018

Я не могу заставить это работать. Я создаю 2 лямбды через C9. Я использую boto3 для вызова одной лямбды из другой. Похоже, что все работает нормально через C9, но когда я публикую и пытаюсь получить доступ через API-шлюз, я получаю ошибки «Время ожидания запроса конечной точки».

Я знаю, что это не может быть проблемой тайм-аута, потому что я настроил свои файлы yaml так, чтобы у меня было достаточно времени для выполнения, и лямбда-код на данный момент очень прост (только возвращает строку)

вот мой текущий файл yaml. Мне интересно, возможно, есть какие-то разрешения, которые мне нужно включить для API Gateway во втором yaml

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:
                    - ...

Я просто настроил конечную точку шлюза API непосредственно на Lambda2, и она не доставила проблем Итак ...

API Gateway -> Lambda 2 (работает) API Gateway -> Lambda 1 -> Lambda 2 (не работает)

По какой-то причине, когда я хочу вызвать Lambda 2 через Lambda 1 через API-шлюз, это не работает.

Вот код, который вызывает 2-ю лямбду

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'), но затем останавливаются и время ожидания

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Наконец-то нашел решение. Ответом на мою конкретную проблему было то, что Lambda 1 и Lambda 2 работали через VPC, таким образом, нет подключения к Интернету. Как только я удалил VPC из Lambda 1, вызов Lambda 2 работал без каких-либо проблем.

Просто хотел поделиться, на случай, если я смогу спасти кого-то еще на несколько недель отладки LOL

0 голосов
/ 08 сентября 2018

1. Вызов лямбды из другой лямбды невозможен без какой-либо настройки. В вашем файле .yml должно быть указано разрешение для вызова другой лямбды. Это можно сделать, добавив раздел iamRoleStatements под свойством провайдера. or добавив простую политику AWSLambdaRole к существующей роли, прикрепленной к лямбде function_1.

provider:  
    name: aws
    runtime: <runtime goes here> # e.g. python3.6 or nodejs6.10
    iamRoleStatements:
      - Effect: Allow
        Action:
          - lambda:InvokeFunction
        Resource: "*" 

or do this add/attach this policy to your existing role attached to your lambda function_1 AWSLambdaRole

2. Вызов lambda function_1 кода прилагается.

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:

ЕСЛИ вы используете InvocationType = RequestResponse, тогда вы можете вернуть некоторую форму ответа function_2.

...