我有一个用python编写的AWS Lambda函数,它是由我设置的Zapier触发器启动的。当我将一些输入参数传递给Zapier触发器中的函数时,我可以使用诸如event[parameter1]之类的变量来访问python代码中的输入参数。效果很好。
我试图在Airtable脚本环境中访问相同的Lambda函数。为了做到这一点,我为Lambda函数设置了一个API网关触发器,但是我不知道如何在普通的JS环境中传递输入参数。下面是我的代码,它给了我“内部服务器错误”。
你的帮助将是绝对感谢的!
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());Edited,下面是Lambda函数的代码和Zapier成功执行之后的最新cloudwatch日志。这是一个简单的代码,自动化谷歌驱动器文件夹共享基于2个输入。(文件夹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()

发布于 2020-12-17 08:47:37
我不是Python专家,我也不知道您是如何将API网关与Lambda集成起来的,但是我相信您的代码可能有两个问题:
1.内部服务器错误作为来自API端点的响应,也经常提到API与Lambda函数集成中的一个问题。在本例中,我看不到要将有效响应返回到API网关的位置。在您的示例中,可能会返回batch.execute()的返回值,对吗?但是,在默认情况下,API需要一个包含statusCode和body以及可选的headers的对象。您可以查看用于Python的AWS Lambda处理程序文档及其示例。另外,这个文件页可能对您很感兴趣。
2.)在您的函数中,您正在访问像event['gdrive_folder_id']这样的事件数据。但是,我看不出您正在解析某个地方的事件数据。您是否在您的API网关之间使用自定义集成?因为在代理集成的情况下,API发送一个具有body字段的对象,然后从该对象中读取HTTP。参见此文档页上的示例。
以下是您可以自己检查的更多内容:您是否也检查了打印event数据时得到了什么?另外,batch.execute()是在等待批处理,还是返回任何内容?如果是的话,它会返回什么?
这里有一个注意事项:您还没有告诉我们关于API和Lambda函数之间的集成的任何信息。由于您可以在API网关和AWS Lambda之间进行一些映射,所以有可能在Lambda函数之外转换请求和响应,因此,我以上的建议是错误的。请告诉我这是否属实,我们可以进一步调查。
https://stackoverflow.com/questions/65334080
复制相似问题