【发布时间】:2021-08-19 06:58:00
【问题描述】:
我有一个 GPG 加密文件的本地 python 代码。一旦将文件添加到触发此 lambda 的 AWS S3,我需要将其转换为 AWS Lambda。
我的本地代码
import os
import os.path
import time
import sys
gpg = gnupg.GPG(gnupghome='/home/ec2-user/.gnupg')
path = '/home/ec2-user/2021/05/28/'
ptfile = sys.argv[1]
with open(path + ptfile, 'rb')as f:
status = gpg.encrypt_file(f, recipients=['user@email.com'], output=path + ptfile + ".gpg")
print(status.ok)
print(status.stderr)
当我将此文件作为 python3 encrypt.py file.csv 执行时,这非常有用,结果是 file.csv.gpg
我正在尝试将其移至 AWS Lambda 并在将 file.csv 上传到 S3 时调用。
import json
import urllib.parse
import boto3
import gnupg
import os
import os.path
import time
s3 = boto3.client('s3')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
try:
gpg = gnupg.GPG(gnupghome='/.gnupg')
ind = key.rfind('/')
ptfile = key[ind + 1:]
with open(ptfile, 'rb')as f:
status = gpg.encrypt_file(f, recipients=['email@company.com'], output= ptfile + ".gpg")
print(status.ok)
print(status.stderr)
我的 AWS Lambda 代码 zip 在 AWS 中创建了一个文件夹结构
我在运行时看到的错误是 [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function': No module named 'gnupg' Traceback(最近一次通话最后一次):
【问题讨论】:
-
首先,您需要 Deploy Python Lambda functions with .zip file archives - AWS Lambda 以包含
gnupg库。进程所需的任何文件(例如私钥)都需要包含在 Zip 中或从 S3 下载。 -
@JohnRotenstein 我更新了我的代码结构并注意到运行时错误。
-
gnupg库不是标准的 Python 库。它需要作为 部署包 包含在内,以便 Python 可以使用该库(而不仅仅是您的.gnupg目录)。这与尝试在没有安装gnupg的新计算机上运行程序的情况相同——您需要使用pip安装它。对于 Lambda 函数,您可以在虚拟环境中进行安装,然后按照我之前评论中链接的说明将结果打包到 zip 文件中。
标签: python amazon-s3 aws-lambda python-3.8 gnupg