AWS Lambda使用PyPDF2打开S3存储桶PDF提示访问被拒绝如何解决
问题排查与解决步骤
1. 修正S3文件读取逻辑
你当前代码使用open('S3 FILE URL', 'rb')读取S3文件的写法本身存在错误:Python内置的open()函数仅能读取本地文件系统的资源,无法直接解析S3的HTTP/HTTPS URL或S3协议路径。你需要先通过boto3将S3文件读取到Lambda的临时内存中,再传递给PyPDF2处理,参考代码如下:
import boto3 from PyPDF2 import PdfFileReader from io import BytesIO # 初始化S3客户端 s3 = boto3.client('s3') # 替换为实际的S3桶名和文件Key(即S3中文件的存储路径,不是完整URL) bucket_name = "你的存储桶名称" file_key = "path/to/your/target.pdf" # 从S3读取文件内容到内存 response = s3.get_object(Bucket=bucket_name, Key=file_key) pdf_content = response['Body'].read() # 传递给PyPDF2处理 pdf = PdfFileReader(BytesIO(pdf_content)) if pdf.isEncrypted: pdf.decrypt('') width = int(pdf.getPage(0).mediaBox.getWidth()) height = int(pdf.getPage(0).mediaBox.getHeight())
你当前关闭S3全部公共访问的配置符合安全规范,不需要为了该需求开启公共访问权限,所有访问都可以通过IAM权限配置实现。
2. 访问拒绝报错权限排查步骤
如果修改读取逻辑后仍然返回访问拒绝报错,按以下顺序排查:
- 检查Lambda执行角色的IAM权限:Lambda绑定的执行角色必须添加允许
s3:GetObject操作的权限策略,且资源范围需要覆盖目标S3桶内的对象,参考策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名称/*" } ] }
- 检查S3桶策略是否存在访问限制:如果桶配置了自定义桶策略,确认没有禁止Lambda执行角色的访问,也没有限制仅能从指定IP、VPC访问(未配置VPC的Lambda默认通过公网访问S3,若桶策略仅允许VPC端点访问则会触发报错)
- 检查目标PDF文件的所有权与ACL:确认文件所有者为当前AWS账号,且文件ACL没有限制Lambda执行角色的读取权限
- 检查S3桶加密配置:如果桶开启了KMS自定义密钥加密,需要给Lambda执行角色添加
kms:Decrypt权限才能读取文件内容 - 核对桶名、文件路径拼写:S3路径大小写敏感,桶名、文件Key拼写错误也会返回访问拒绝类报错
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

