我制作了一个在 S3 文件上传时触发的 lambda 函数。
每当我手动上传文件时,lambda 触发器似乎都在工作。但是,当我使用 S3 预签名 URL(使用 API Gateway 和另一个 lambda 函数)将文件上传到 S3 存储桶时,即使文件已成功上传到 S3 存储桶,Lambda 触发器也不会被触发。
我确定 Lambda 是否需要更高的权限才能在预签名 URL 上传或其他操作时触发并处理文件。
我通过更改用于生成 s3 预签名 URL 的文件名字符找到了一个非常类似问题的解决方案:
我的目标是使用 AWS API 将文件上传到 s3,并在完成后调用 lambda 函数。
当我使用控制台将文件添加到 s3 存储桶时,lambda 函数正在工作。
当我使用 API 将文件添加到 s3 存储桶时,lambda 函数会正确触发,但随后生成错误:“调用 HeadObject 操作时发生错误 (403):禁止”
我在此官方 AWS 资源页面上使用了 python lambda 代码。
我发现文件名中的任何“空格”字符在 API 调用中都被 url 编码为“%20”,而这些字符又被 python lambda 代码替换为“+”字符。文件名中的“+”字符导致 lambda 函数生成 403 禁止响应。
删除文件名中的空格字符解决了我的问题。