AWS Lambda运行Python脚本报filecontent未定义错误 无法推送S3数据到Splunk
问题修复说明
1 直接报错的修复
报错
NameError: name 'filecontent' is not defined是变量名拼写不一致导致的:
代码中定义的变量名为file_content(带下划线),但在for value in filecontent.split('\n')行中误写为没有下划线的filecontent,直接把这行的filecontent改成file_content即可解决该报错。
2 其他隐藏问题的修正建议
脚本还存在多个语法和逻辑错误,即使解决了上述报错也无法正常运行,需要同步修改:
- 修正未定义变量问题:代码中
print(raja)的raja没有定义,要么删除该行,要么替换为你需要打印的实际变量(比如打印Splunk请求返回值) - 修正缩进与重复定义问题:
lambda_handler内部嵌套的get_object函数缩进错误,且你已经在全局定义过get_object函数,直接删除lambda_handler内部重复定义的这部分代码即可 - 修正逻辑错误:你已经按行切分了文件内容,但是循环里还是把整个
file_content作为事件发送,没有用到切分后的单行内容value,建议把data_json = str(file_content)改成data_json = str(value),避免重复发送全量文件内容 - 修正依赖弃用问题:
from botocore.vendored import requests已经被AWS弃用,建议在Lambda层中添加独立的requests库,或者替换为Python标准库urllib实现POST请求 - 可选优化:如果要关闭SSL警告,先导入
urllib3,再取消注释urllib3.disable_warnings()行,避免运行时报SSL相关告警 - 安全优化:
get_secrets函数中直接用eval解析密钥字符串有注入风险,建议替换为json.loads解析,需要先导入json库。
3 修正后的核心代码片段
# 补充导入缺失的依赖库 import json import urllib3 import requests # 提前在Lambda层添加requests库,或者替换为urllib实现请求 # 关闭SSL告警 urllib3.disable_warnings() def lambda_handler(event, context): bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] session = boto3.Session() s3 = session.client('s3') obj = s3.get_object(Bucket=bucket, Key=key) file_content = obj["Body"].read().decode('utf-8') print("Returned Object: {}".format(obj)) print(file_content) # 修正变量名拼写错误 for value in file_content.split('\n'): # 跳过空行 if not value.strip(): continue # 改用切分后的单行内容作为事件 data_json = value.strip() payload = {} payload.update({"index": splunk_index}) payload.update({"source": "waf"}) payload.update({"event": data_json}) r = send_to_splunk(splunk_host, get_secrets('tropos-splunk')['splunk-hec-token-dev'], payload) # 替换未定义的raja变量,打印请求结果 print(f"发送到Splunk状态码: {r.status_code}, 返回内容: {r.text}") def get_secrets(secret_id): client = boto3.client(service_name='secretsmanager',region_name=region) get_secret_value_response = client.get_secret_value(SecretId=secret_id) # 替换eval为更安全的json解析 return json.loads(get_secret_value_response['SecretString'])
内容的提问来源于stack exchange,提问作者Raja Gudipudi
相关产品推荐
相关产品推荐

