如何将S3 Bucket中文件转换为CSV/JSON并导入Azure Sentinel
S3文档转CSV/JSON适配Azure Sentinel的实操方案
一、自动搞定带task-id的路径匹配
不用手动写路径检索逻辑,直接在Lambda的触发配置里做:
- 给Lambda加S3触发规则,用通配符匹配路径,比如
s3://你的桶名/*/export-docs/*.doc(根据实际文档后缀调整),不管中间的task-id是什么,只要符合前缀+文档后缀的结构,新文件生成就自动触发Lambda。 - 触发事件选
s3:ObjectCreated:*,彻底省掉轮询SNS的步骤,文件一出来就处理。
二、Lambda里的转换代码示例
用Python写最方便,直接调用对应文档处理库:
import boto3 from docx import Document import csv s3 = boto3.client('s3') def lambda_handler(event, context): # 从触发事件里直接拿文件信息,不用自己找路径 bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] # 下载到Lambda临时目录 local_file = f'/tmp/{key.split("/")[-1]}' s3.download_file(bucket, key, local_file) # 读取docx表格转CSV(其他格式换对应库,比如pdfplumber处理PDF) doc = Document(local_file) target_table = doc.tables[0] # 假设第一个表格是要导出的数据 csv_data = [] for row in target_table.rows: csv_data.append([cell.text.strip() for cell in row.cells]) # 生成目标文件路径,保留原task-id目录方便溯源 target_key = key.replace('.docx', '.csv') output_file = '/tmp/output.csv' with open(output_file, 'w', newline='') as f: writer = csv.writer(f) writer.writerows(csv_data) # 上传回S3 s3.upload_file(output_file, bucket, target_key) # 可选:删除原文档或者移到归档目录,避免重复触发 # s3.delete_object(Bucket=bucket, Key=key)
三、批量处理历史文件
如果有一堆旧文档要转,写个一次性脚本跑:
import boto3 from docx import Document import csv s3 = boto3.client('s3') bucket_name = '你的桶名' prefix = 'export-tasks/' # 你的文档根路径 def convert_file(key): # 复用上面的转换逻辑 local_file = f'/tmp/{key.split("/")[-1]}' s3.download_file(bucket_name, key, local_file) # ... 省略转换和上传代码 ... # 遍历所有符合条件的文件 response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix) for obj in response['Contents']: if obj['Key'].endswith('.docx'): # 过滤文档后缀 convert_file(obj['Key'])
把这个代码打包成Lambda层或者直接运行,一次性处理所有历史文件。
四、Azure Sentinel采集配置
- 把转换后的CSV/JSON所在的S3路径配置到Sentinel的S3数据源,给Sentinel授权访问该Bucket的权限。
- 要实时采集的话,要么让Sentinel自动扫描S3目录,要么在Lambda转换完成后发消息到SNS,让Sentinel订阅这个主题触发采集。
内容的提问来源于stack exchange,提问作者LinuBajy007
相关产品推荐
相关产品推荐

