请求编写定时触发的S3触发Lambda函数:每日给员工涨薪100
实现每日触发的Lambda函数,给S3中员工CSV的薪资加100
修改后的完整代码
import os import boto3 import csv from io import StringIO def lambda_handler(event, context): # 从环境变量获取存储桶和文件名,避免硬编码 bucket = os.environ.get('EMPLOYEE_BUCKET') file_key = os.environ.get('EMPLOYEE_FILE_KEY') if not bucket or not file_key: raise ValueError("请设置EMPLOYEE_BUCKET和EMPLOYEE_FILE_KEY环境变量") s3 = boto3.resource('s3') s3_object = s3.Object(bucket, file_key) # 读取并解析CSV内容 csv_content = s3_object.get()['Body'].read().decode('utf-8') reader = csv.reader(StringIO(csv_content)) headers = next(reader) # 找到薪资列的索引(假设表头是'薪资',如果是英文表头则改成'Salary') try: salary_index = headers.index('薪资') except ValueError: raise ValueError("CSV文件中未找到'薪资'表头") # 处理每一行数据,给薪资加100 processed_rows = [headers] for row in reader: try: current_salary = int(row[salary_index]) row[salary_index] = str(current_salary + 100) processed_rows.append(row) except ValueError: # 薪资不是数字的情况,跳过并记录日志 print(f"跳过无效行:{row},薪资字段不是有效数字") continue # 将处理后的数据写入S3(这里覆盖原文件,也可改为新文件名如'processed_' + file_key) output = StringIO() writer = csv.writer(output) writer.writerows(processed_rows) s3.Object(bucket, file_key).put(Body=output.getvalue()) return { 'statusCode': 200, 'body': f"成功处理{len(processed_rows)-1}条员工记录" }
关键改动说明
- 避免硬编码:用环境变量
EMPLOYEE_BUCKET和EMPLOYEE_FILE_KEY指定存储桶和文件路径,在Lambda控制台的函数配置中设置即可,无需修改代码。 - 适配表头变化:通过表头名称动态找到薪资列的索引,不用依赖固定列位置。
- 异常防护:处理表头不存在、薪资非数字的情况,避免函数直接崩溃,同时打印日志方便排查问题。
- 内存中处理:用
StringIO在内存中构建处理后的CSV内容,适配Lambda本地存储有限的特性。
每日9点触发配置
- 打开AWS EventBridge控制台,创建规则。
- 规则类型选择计划,设置计划表达式为
cron(0 1 ? * * *)(AWS使用UTC时间,北京时间上午9点对应UTC凌晨1点,根据你的时区自行调整)。 - 目标选择你的Lambda函数,完成规则创建。
内容的提问来源于stack exchange,提问作者Dakshayini HG
相关产品推荐
相关产品推荐

