首页 > 解决方案 > 在 AWS Lambda 上,Openpyxl 不跟踪图像

问题描述

当我有model.xlsx一个图像并且此代码在 Windows 上完美运行时。(保留图像output.xlsx

import openpyxl

wb = openpyxl.load_workbook('model.xlsx')
#doing some stuff on the wb
wb.save('output.xlsx')

现在,当我在我的 AWS Lambda 上执行此操作时,一切正常,但我在output.xlsx. 没有引发错误消息。

import json
import openpyxl
from tempfile import NamedTemporaryFile
import boto3
import botocore


def lambda_handler(event, context):
    s3_client = boto3.client('s3', aws_access_key_id='*****', aws_secret_access_key='*****')
    wb = openpyxl.load_workbook('model.xlsx')
    #doing some stuff on the wb
    with NamedTemporaryFile() as tmp:
        wb.save(tmp.name)
        tmp.seek(0)
        s3_client.upload_file(tmp.name, "my-bucket-name", "filename-in-the-bucket")

    return {
        'statusCode': 200,
        'body': json.dumps("Hello World")
    }

我应该向 AWS 提出一张票吗?打开pyxl?为什么没有错误信息?

标签: pythonamazon-web-servicesaws-lambdaopenpyxlxlsx

解决方案


好的,我不确定 100%,但我会假设 import likepip3 install --target ./theholypath openpyxl可以工作,但会因棘手的依赖关系(您没有并存储在其他地方的文件)而失败,就像今天使用 Pillow 失败一样。

因此,一些英雄为我们完成了这项工作,并将库完美地打包成我们称之为layer的东西。对于您需要的每个库,您可能会发现相应的层已经由好人构建。(如果幸运的话,不是每个库都有层)。

就我而言,我添加了 2 层:

  • arn:aws:lambda:eu-west-3:770693421928:layer:Klayers-python38-Pillow:8
  • arn:aws:lambda:eu-west-3:770693421928:layer:Klayers-python38-openpyxl:5

而且......它的工作原理!我output.xlsx现在有来自的图像model.xlsx,你甚至不需要做pip install --target my/path my_lib_name

现在,您可以在这里找到自己需要的层和实现方式。

警告:

某些图层版本将具有 expiry_date 字段。这是图层 > 将被删除的日期。

通常,图层计划在新图层版本发布 60 天后删除,> 针对该包发布。如果您使用该层的最新版本,则保证在该层被删除之前 > 至少 60 天。

与层一起部署的所有函数仍将无限期地工作,但您将无法 > 部署引用已删除层版本的新函数。


推荐阅读