javascript - 如何使用 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()
解决方案
我不是 Python 专家,也不知道您如何设置 API Gateway 与 Lambda 的集成,但我相信您的代码可能存在两个问题:
1.)作为 API Gateway 端点响应的Internal Server Error通常也指 API Gateway 和您的 Lambda 函数之间的集成问题。在这种情况下,我看不到您将有效响应返回到 API 网关的位置。在您的示例中,batch.execute()
可能会返回的返回值,对吗?但是,默认情况下,API 网关需要一个包含 astatusCode
和body
可选的对象headers
。您可以查看适用于 Python 的 AWS Lambda 处理程序文档及其示例。此外,您可能会对这个文档页面感兴趣。
2.) 在您的函数中,您正在访问事件数据,例如event['gdrive_folder_id']
. 但是,我看不到您正在某处解析事件数据。您是否在 API 网关之间使用自定义集成?因为在代理集成的情况下,API 网关会发送一个具有body
字段的对象,您需要从那里读取 HTTP 正文。请参阅此文档页面上的示例。
以下是您可以自行检查的更多内容:您是否还检查了刚打印event
数据时得到的结果?另外,是在batch.execute()
等待批处理还是返回任何东西?如果是这样,它会返回什么?
请注意:您没有告诉我们任何有关您的 API 网关和 Lambda 函数之间的集成的信息。由于您可以在 API Gateway 和 AWS Lambda 之间进行一些映射,因此您可能在 Lambda 函数之外转换请求和响应,因此,我上面的建议是错误的。让我知道这是否属实,我们可以进一步调查。
推荐阅读
- amazon-web-services - 使用 Python 为 AWS API Gateway 发出签名的 IAM_AUTH 请求
- oracle - 显示 PLSQL 中的所有对象值
- lodash - 从数组中删除具有特定“键:值”的对象
- javascript - React HOC 与 Helper 类?
- javascript - 尝试在调整大小后将 jquery 设置为触发一次
- android - 文本没有出现在 ios / android 设备上,但在模拟器上工作正常
- protocol-buffers - 反序列化缓冲区协议缓冲区
- netlogo - 修改以修复从补丁到观察者 netlogo 的上下文
- python - 为什么我得到错误的输出?
- javascript - 如何使用Javascript制作一个在页面上显示经过时间的按钮