【问题标题】:How to pass event parameters to AWS Lambda function using API Gateway?如何使用 API Gateway 将事件参数传递给 AWS Lambda 函数?
【发布时间】:2020-12-17 02:56:18
【问题描述】:

我有一个用 python 编写的 AWS Lambda 函数,它由我设置的 Zapier 触发器启动。当我将一些输入参数传递给 Zapier 触发器中的函数时,我可以通过使用诸如event[parameter1] 之类的变量来访问我的 python 代码中的输入参数。效果很好。

我正在尝试在 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()

【问题讨论】:

  • “内部服务器错误”通常会恢复为您的 Lambda 函数中的问题(代码、超出内存限制或超时)。您能否向我们展示 Lambda 函数代码及其日志(来自 CloudWatch>Log Groups>/aws/lambda/)?
  • 那个,另外你可以尝试从 AWS 控制台调用 lambda(或者他们现在称之为 gui 的任何东西)。 API 网关/lambda 的设置可能很棘手,但如果它在另一个应用程序中工作,那么您已经完成了所有艰苦的工作,所以问题可能出在新代码发布请求的方式上。添加一些代码来记录 lambda 获取的参数的 repr,尤其是。如果日志显示 TypeError 异常。
  • @KoushikShomChoudhury 非常感谢您的回复!我已附上 Lambda 函数和 CloudWatch Log 的源代码。
  • @JayEye 感谢您的评论!所以你的意思是,JS代码中的http请求可能是问题?

标签: javascript amazon-web-services aws-lambda aws-api-gateway airtable


【解决方案1】:

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

1.) Internal Server Error 作为 API Gateway 端点的响应,通常也指 API Gateway 与您的 Lambda 函数之间的集成问题。在这种情况下,我看不到您将有效响应返回到 API 网关的位置。在您的示例中,batch.execute() 的返回值可能已返回,对吧?但是,默认情况下,API 网关需要一个包含 statusCode 和 body 以及可选的 headers 的对象。您可以查看AWS Lambda handler documentation for Python 及其示例。您也可能对这个documentation page 感兴趣。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 2020-02-26
    • 2016-04-10
    • 1970-01-01
    • 2017-12-25
    • 2017-12-30
    • 2021-10-23
    • 1970-01-01
    • 2015-11-10
    相关资源
    最近更新 更多