首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用API网关将事件参数传递给AWS Lambda函数?

如何使用API网关将事件参数传递给AWS Lambda函数?
EN

Stack Overflow用户
提问于 2020-12-17 02:56:18
回答 1查看 4K关注 0票数 1

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

我试图在Airtable脚本环境中访问相同的Lambda函数。为了做到这一点,我为Lambda函数设置了一个API网关触发器,但是我不知道如何在普通的JS环境中传递输入参数。下面是我的代码,它给了我“内部服务器错误”。

你的帮助将是绝对感谢的!

代码语言:javascript
复制
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 +电子邮件地址)请原谅我的代码质量差!

代码语言:javascript
复制
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()

EN

回答 1

Stack Overflow用户

发布于 2020-12-17 08:47:37

我不是Python专家,我也不知道您是如何将API网关与Lambda集成起来的,但是我相信您的代码可能有两个问题:

1.内部服务器错误作为来自API端点的响应,也经常提到API与Lambda函数集成中的一个问题。在本例中,我看不到要将有效响应返回到API网关的位置。在您的示例中,可能会返回batch.execute()的返回值,对吗?但是,在默认情况下,API需要一个包含statusCodebody以及可选的headers的对象。您可以查看用于Python的AWS Lambda处理程序文档及其示例。另外,这个文件页可能对您很感兴趣。

2.)在您的函数中,您正在访问像event['gdrive_folder_id']这样的事件数据。但是,我看不出您正在解析某个地方的事件数据。您是否在您的API网关之间使用自定义集成?因为在代理集成的情况下,API发送一个具有body字段的对象,然后从该对象中读取HTTP。参见此文档页上的示例。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65334080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档