You need to enable JavaScript to run this app. AWS Lambda运行Python脚本报filecontent未定义错误 无法推送S3数据到Splunk
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 05:06:02