首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在AWS Lambda函数中使用gnupg

如何在AWS Lambda函数中使用gnupg
EN

Stack Overflow用户
提问于 2021-06-01 04:26:23
回答 5查看 5K关注 0票数 3

我有一个本地python代码,GPG加密一个文件。我需要把它转换成AWS,一旦一个文件被添加到AWS S3中,它就触发了这个Lambda。

我的本地代码

代码语言:javascript
运行
复制
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时调用。

代码语言:javascript
运行
复制
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”的跟踪模块(最近一次调用):

EN

回答 5

Stack Overflow用户

发布于 2021-06-23 12:46:32

您可以创建一个适合于python在AWS上使用的gpg二进制文件。您将需要

  • GCC和相关工具( Amazon 2上的sudo yum install -y gcc make glibc-static)
  • pip
  • zip

下载GnuPG源代码包并验证其签名之后,使用

代码语言:javascript
运行
复制
$ 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获取该模块:

代码语言:javascript
运行
复制
$ cd /path/to/your/lambda/
$ pip install -t . python-gnupg

您的Lambda源结构现在如下所示:

代码语言:javascript
运行
复制
.
├── gnupg.py
├── gpg
└── lambda_function.py

更新函数,将gpg二进制文件的位置传递给python构造函数:

代码语言:javascript
运行
复制
gpg = gnupg.GPG(gnupghome='/.gnupg', gpgbinary='./gpg')

使用zip打包Lambda函数:

代码语言:javascript
运行
复制
$ chmod o+r gnupg.py lambda_function.py 
$ chmod o+rx gpg
$ zip lambda_function.zip gnupg.py gpg lambda_function.py 
票数 5
EN

Stack Overflow用户

发布于 2021-06-11 19:10:22

由于在pythoni.e gnupg本身中使用gpg需要一些系统依赖项,因此需要使用容器运行时环境:https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html构建您的lambda代码。

使用docker将允许您安装基础系统依赖项以及导入您的密钥。

Dockerfile将如下所示:

代码语言:javascript
运行
复制
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

票数 2
EN

Stack Overflow用户

发布于 2021-08-21 06:58:52

gpg现在已经安装在public.ecr.aws/lambda/python:3.8中了。

然而,尽管如此,兰博达似乎并没有提供这种服务。因此,您仍然需要将gpg可执行文件放到Lambda环境中。

我用的是码头图像。

我的Dockerfile是:

代码语言:javascript
运行
复制
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目录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67782720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档