如何在Docker容器的AWS Lambda函数中使用python-gnupg导入私钥?
问题:Lambda Docker容器中GPG导入私钥失败
背景
尝试部署Docker容器化的Python Lambda函数,功能是连接FTP获取加密文件并解密。使用gpg结合私钥解密,已通过Dockerfile安装gnupg,但导入私钥时持续报错:
gpg: Fatal: can't create directory /home/sbx_user1051/.gnupg: No such file or directory
gpg returned a non-zero error code: 2
当前Dockerfile
FROM amazon/aws-lambda-python:3.9 RUN yum update RUN yum install -y gnupg RUN yum -y install gcc g++ sudo COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" COPY . ${LAMBDA_TASK_ROOT} CMD [ "app.handler" ]
当前Python代码片段
import gnupg import os my_gpg = gnupg.GPG(gpgbinary="/usr/bin/gpg") my_gpg.import_keys_file("/var/task/keys/priv_key.asc", passphrase=os.getenv("PASSPHRASE"))
解决方案
方案1:手动创建默认GPG目录并配置权限
Lambda运行时使用sbx_user1051用户,该用户无权限在/home下自动创建目录。在Dockerfile中添加命令创建目录并设置正确权限:
修改后的Dockerfile:
FROM amazon/aws-lambda-python:3.9 RUN yum update -y && yum install -y gnupg gcc g++ sudo # 创建GPG目录并设置权限 RUN mkdir -p /home/sbx_user1051/.gnupg && \ chown -R sbx_user1051:sbx_user1051 /home/sbx_user1051/.gnupg && \ chmod 700 /home/sbx_user1051/.gnupg COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" COPY . ${LAMBDA_TASK_ROOT} CMD [ "app.handler" ]
方案2:指定GPG工作目录到Lambda可写路径
Lambda容器中/var/task目录是可写的,可将GPG的home目录指定到这里,避免权限问题:
- 修改Python代码,指定
homedir参数:
import gnupg import os # 指定GPG工作目录到/var/task下的.gnupg my_gpg = gnupg.GPG(gpgbinary="/usr/bin/gpg", homedir="/var/task/.gnupg") my_gpg.import_keys_file("/var/task/keys/priv_key.asc", passphrase=os.getenv("PASSPHRASE"))
- 在Dockerfile中提前创建该目录并设置权限:
FROM amazon/aws-lambda-python:3.9 RUN yum update -y && yum install -y gnupg gcc g++ sudo # 创建自定义GPG目录 RUN mkdir -p /var/task/.gnupg && chmod 700 /var/task/.gnupg COPY requirements.txt . RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" COPY . ${LAMBDA_TASK_ROOT} CMD [ "app.handler" ]
关键说明
- GPG要求密钥目录权限必须为
700(仅所有者可读写执行),否则会拒绝操作,所以必须设置chmod 700。 - 两种方案任选其一即可,方案2更灵活,避免依赖
/home目录的用户权限限制。
内容的提问来源于stack exchange,提问作者Jeff Gruenbaum
相关产品推荐
相关产品推荐

