如何在AWS Lambda中读取AWS S3的CSV文件,print无输出如何解决?
问题原因及解决方案
核心问题原因
- 直接打印
csv.reader对象输出无效:csv.reader()返回的是可迭代的阅读器对象,直接打印只会输出对象的内存地址,不会输出CSV文件的实际内容,需要遍历迭代器才能读取内容。 - S3事件中的对象Key未做URL解码:S3触发事件返回的
object.key是经过URL编码的,若文件名包含空格、中文等特殊字符,直接使用该Key调用get_object会报404错误,触发异常后仅会打印错误信息,无法输出CSV内容。 - Lambda执行角色缺少对应权限:如果Lambda的执行IAM角色没有目标S3桶的
s3:GetObject权限,或者S3文件使用KMS加密时没有对应KMS密钥的解密权限,调用get_object会抛出权限异常,无法读取文件。 - 未正确查看日志输出:Lambda的
print语句输出会上报到CloudWatch日志组,Lambda控制台的默认执行结果页不会展示打印内容,需要进入对应CloudWatch日志流查看完整输出。
修正后代码
import json import boto3 import csv import urllib.parse s3_client = boto3.client('s3') def lambda_handler(event, context): try: bucket_name = event["Records"][0]["s3"]["bucket"]["name"] # 对S3返回的Key做URL解码,解决特殊字符的问题 s3_file_name = urllib.parse.unquote_plus(event["Records"][0]["s3"]["object"]["key"], encoding='utf-8') csv_file = s3_client.get_object(Bucket=bucket_name, Key=s3_file_name) data = csv_file['Body'].read().decode('utf-8').splitlines(True) reader = csv.reader(data) # 遍历迭代器打印每一行CSV内容 print("CSV文件内容:") for row in reader: print(row) except Exception as err: print("运行异常:", err) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
验证步骤
- 确认Lambda执行角色的IAM策略已添加对应S3桶的
s3:GetObject权限,示例策略片段:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::替换为你的桶名/*" }
- 执行测试后,进入Lambda控制台的「监控」选项卡,点击「查看CloudWatch日志」,进入最新的日志流即可查看
print输出的内容。 - 若S3文件使用KMS加密,还需要在执行角色策略中添加
kms:Decrypt权限。
内容的提问来源于stack exchange,提问作者Adeesha_Anjana
相关产品推荐
相关产品推荐

