首页 > 解决方案 > 如何使用 API Gateway 将事件参数传递给 AWS Lambda 函数?

问题描述

我有一个用 python 编写的 AWS Lambda 函数,它由我设置的 Zapier 触发器启动。当我将一些输入参数传递给 Zapier 触发器中的函数时,我可以使用诸如event[parameter1]. 它完美地工作。

我正在尝试在 Airtable 脚本环境中访问相同的 Lambda 函数。为了做到这一点,我为 Lambda 函数设置了一个 API Gateway 触发器,但我不知道如何在 vanilla JS 环境中传递输入参数。下面是我拥有的代码,它给了我"Internal Server Error"

您的帮助将不胜感激!

const awsUrl = "https://random-id.execute-api.us-west-2.amazonaws.com/default/lambda-function";
let event = {
    "queryStringParameters": {
        "gdrive_folder_id": consFolderId,
        "invitee_email": email
    }
};

let response = await fetch(awsUrl, {
    method: "POST",
    body: JSON.stringify(event),
    headers: {
        "Content-Type": "application/json",
    }
});
console.log(await response.json());

[编辑] 另外,这是 Lambda 函数的代码和 Zapier 调用成功执行后最新的 cloudwatch 日志。这是一个基于 2 个输入自动共享 Google Drive 文件夹的简单代码。(文件夹 ID + 电子邮件地址)代码质量差请多多包涵!

from __future__ import print_function
from googleapiclient.discovery import build
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'service.json'


def lambda_handler(event, context):
    """Shows basic usage of the Drive v3 API.
    Prints the names and ids of the first 10 files the user has access to.
    """
    # 2-legged OAuth from Google service account
    creds = service_account.Credentials.from_service_account_file(
        SERVICE_ACCOUNT_FILE, scopes=SCOPES)

    drive_service = build('drive', 'v3', credentials=creds)

    # change multiple permissions with batch requests
    folder_id = event['gdrive_folder_id']
    email_address = event['invitee_email']

    def callback(request_id, response, exception):
        if exception:
            # Handle error
            print(exception)
        else:
            print("Permission Id: {}".format(response.get('id')))

    batch = drive_service.new_batch_http_request(callback=callback)
    user_permission = {
        'type': 'user',
        'role': 'writer',
        'emailAddress': email_address
    }
    batch.add(drive_service.permissions().create(
            fileId=folder_id,
            body=user_permission,
            fields='id',
    ))
    batch.execute()

CloudWatch 日志

标签: javascriptamazon-web-servicesaws-lambdaaws-api-gatewayairtable

解决方案


我不是 Python 专家,也不知道您如何设置 API Gateway 与 Lambda 的集成,但我相信您的代码可能存在两个问题:

1.)作为 API Gateway 端点响应的Internal Server Error通常也指 API Gateway 和您的 Lambda 函数之间的集成问题。在这种情况下,我看不到您将有效响应返回到 API 网关的位置。在您的示例中,batch.execute()可能会返回的返回值,对吗?但是,默认情况下,API 网关需要一个包含 astatusCodebody可选的对象headers。您可以查看适用于 Python 的 AWS Lambda 处理程序文档及其示例。此外,您可能会对这个文档页面感兴趣。

2.) 在您的函数中,您正在访问事件数据,例如event['gdrive_folder_id']. 但是,我看不到您正在某处解析事件数据。您是否在 API 网关之间使用自定义集成?因为在代理集成的情况下,API 网关会发送一个具有body字段的对象,您需要从那里读取 HTTP 正文。请参阅此文档页面上的示例。

以下是您可以自行检查的更多内容:您是否还检查了刚打印event数据时得到的结果?另外,是在batch.execute()等待批处理还是返回任何东西?如果是这样,它会返回什么?

请注意:您没有告诉我们任何有关您的 API 网关和 Lambda 函数之间的集成的信息。由于您可以在 API Gateway 和 AWS Lambda 之间进行一些映射,因此您可能在 Lambda 函数之外转换请求和响应,因此,我上面的建议是错误的。让我知道这是否属实,我们可以进一步调查。


推荐阅读