我有一个本地python代码,GPG加密一个文件。我需要把它转换成AWS,一旦一个文件被添加到AWS S3中,它就触发了这个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,并在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:无法导入模块“lambda_function”:没有名为“gnupg”的跟踪模块(最近一次调用):
发布于 2021-06-23 12:46:32
您可以创建一个适合于python在AWS上使用的gpg
二进制文件。您将需要
sudo yum install -y gcc make glibc-static
)下载GnuPG源代码包并验证其签名之后,使用
$ tar xjf gnupg-1.4.23.tar.bz2
$ cd gnupg-1.4.23
$ ./configure
$ make CFLAGS='-static'
$ cp g10/gpg /path/to/your/lambda/
您还需要从python中获取gnupg.py
模块,您可以使用pip获取该模块:
$ cd /path/to/your/lambda/
$ pip install -t . python-gnupg
您的Lambda源结构现在如下所示:
.
├── gnupg.py
├── gpg
└── lambda_function.py
更新函数,将gpg
二进制文件的位置传递给python构造函数:
gpg = gnupg.GPG(gnupghome='/.gnupg', gpgbinary='./gpg')
使用zip
打包Lambda函数:
$ chmod o+r gnupg.py lambda_function.py
$ chmod o+rx gpg
$ zip lambda_function.zip gnupg.py gpg lambda_function.py
发布于 2021-06-11 19:10:22
由于在pythoni.e gnupg
本身中使用gpg需要一些系统依赖项,因此需要使用容器运行时环境:https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html构建您的lambda代码。
使用docker将允许您安装基础系统依赖项以及导入您的密钥。
Dockerfile将如下所示:
FROM public.ecr.aws/lambda/python:3.8
RUN apt-get update && apt-get install gnupg
# copy handler file
COPY app.py <path-to-keys> ./
# Add keys to gpg
RUN gpg --import <path-to-private-key>
RUN gpg --import <path-to-public-key>
# Install dependencies and open port
RUN pip3 install -r requirements.txt
CMD ["app.lambda_handler"]
app.py
将是您的lambda代码。请随时复制除主lambda处理程序之外的任何必要文件。
一旦容器映像被构建和上传。lambda现在可以使用映像(包括它的所有依赖项)。lambda代码将在容器化环境中运行,该环境包含gnupg和导入的密钥。
资源:
https://docs.aws.amazon.com/lambda/latest/dg/python-image.html https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html https://medium.com/@julianespinel/how-to-use-python-gnupg-to-decrypt-a-file-into-a-docker-container-8c4fb05a0593
发布于 2021-08-21 06:58:52
gpg现在已经安装在public.ecr.aws/lambda/python:3.8
中了。
然而,尽管如此,兰博达似乎并没有提供这种服务。因此,您仍然需要将gpg可执行文件放到Lambda环境中。
我用的是码头图像。
我的Dockerfile是:
FROM public.ecr.aws/lambda/python:3.8
COPY .venv/lib/python3.8/site-packages/ ./
COPY test_gpg.py .
CMD ["test_gpg.lambda_handler"]
.venv
是包含我需要的python包的python目录。
https://stackoverflow.com/questions/67782720
复制相似问题