【问题标题】:How to send PDF from one lambda to the other?如何将 PDF 从一个 lambda 发送到另一个?
【发布时间】:2021-07-06 08:31:52
【问题描述】:

我正在尝试将 S3 存储桶中的 PDF 文件从一个 lambda 发送到一秒。为此,我正在从 S3 存储桶中下载 tmp 文件夹中的 PDF,然后调用第二个 lambda。

我的代码:

s3r = boto3.resource('s3')
client = boto3.client('lambda')
s3r.meta.client.download_file(
    Bucket='my_bucket',
    Key='pdf_folder' + '/{}'.format(pdf_name),
    Filename='/tmp/'+pdf_name
)

然后我尝试调用第二个 lambda 并将 PDF 作为有效负载发送,如下所示:

client.invoke(
    FunctionName='second_lambda',
    InvocationType="RequestResponse",
    Payload={
        'pdf': '/tmp/'+pdf_name,
        'email': receiver_email,
    }
)

但我收到以下错误:

botocore.exceptions.ParamValidationError:参数验证失败: 参数有效负载的类型无效,值:{'pdf': '/tmp/test_pdf_ff9cf3167ae6fc1552f340a7abc529970fb8cf5a65f8bc825d772fa5e707c81d.pdf', 'email':receiver_email},类型:,有效类型:, , 类文件对象

我做错了什么?

【问题讨论】:

  • 为什么 lambda #2 不能从 s3 读取 pdf?
  • @balderman 这是最初的想法,但我试图使 lambda #2 尽可能通用,以防 pdf 不在 S3 存储桶中。还连接了其他功能,这就是为什么将 pdf 从 #1 发送到 #2 是有意义的
  • pdf 文件可能很大。您有信心永远不会达到有效负载大小的限制吗?
  • @Marcin 你能告诉我最大有效载荷限制是多少吗?同步是 6MB,异步是 256KB?
  • @Junkrat 是的,没错。

标签: python amazon-web-services amazon-s3 aws-lambda boto3


【解决方案1】:

Payload 只能是“字节或可查找的类文件对象”。但是你有一本字典。

要提供类似文件的对象,您可以这样做:

with open('/tmp/'+pdf_name, 'rb') as f:
   client.invoke(
      FunctionName='second_lambda',
      InvocationType="RequestResponse",
      Payload=f
  )

更新:

您可以将文件编码为base64,放入dict,然后将dict转换为json,然后转换为bytes

import base64
import json

with open('/tmp/'+pdf_name, 'rb') as f:
   client.invoke(
      FunctionName='second_lambda',
      InvocationType="RequestResponse",
      Payload=json.dumps({
        'pdf': base64.b64encode(f.read()).decode("ascii"),
        'email': receiver_email,
    }).encode()
  )

或者pickle:

import pickle

with open('/tmp/'+pdf_name, 'rb') as f:
   client.invoke(
      FunctionName='second_lambda',
      InvocationType="RequestResponse",
      Payload=pickle.dumps({
        'pdf': f.read(),
        'email': receiver_email,
    })
  )

【讨论】:

  • 我还必须将email 作为有效负载的一部分与 PDF 一起发送。正如您在代码的invoke 部分的有效负载中看到的那样。有什么将两者结合的建议吗?
  • @Junkrat 我用新的方式更新了这个问题。显然接收函数必须逆过程。
  • 非常感谢。我会试一试,然后接受答案
  • @Junkrat 我添加了泡菜版本。
  • @Junkrat Base64 将产生字节,这不适用于 json.dumps。编码将这些字节更改为字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-17
  • 2014-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多