新手向:将Python代码部署到AWS Lambda并按小时生成CSV的步骤
AWS Lambda部署Python成本统计代码并配置每小时运行的分步指南
以下是针对你的需求的详细实操指南,包含代码适配、Lambda部署、定时触发配置的全流程:
一、代码适配(适配Lambda运行环境)
原代码依赖本地AWS Profile且仅用print输出,无法在Lambda中正常工作,先修改代码如下:
import boto3 import datetime import csv from io import StringIO # 初始化Cost Explorer和S3客户端(Lambda用执行角色自动获取权限) cd = boto3.client('ce', region_name='eu-west-2') s3 = boto3.client('s3') # 时间范围(可根据需求改为动态,比如取前一天) start = '2022-12-01' end = '2022-12-20' time_suffix = ' 00:00' # 替换成你自己的S3桶名和文件路径前缀 S3_BUCKET = 'your-cost-report-bucket' S3_KEY = f'cost-reports/cost_report_{datetime.datetime.utcnow().strftime("%Y%m%d_%H%M%S")}.csv' results = [] token = None # 分页获取Cost Explorer数据 while True: kwargs = {'NextPageToken': token} if token else {} data = cd.get_cost_and_usage( TimePeriod={'Start': start, 'End': end}, Granularity='MONTHLY', Metrics=['UnblendedCost'], Filter={ "And": [ {"Dimensions": {"Key": "SERVICE","Values": ["Amazon Relational Database Service", "Amazon Elastic Compute Cloud - Compute"]}}, {"Tags": {"Key": "Name", "Values": ["qa-mssql"]}}, ] }, GroupBy=[{'Type': 'TAG', 'Key': 'app'}, {'Type': 'TAG', 'Key': 'Name'}], **kwargs ) results += data['ResultsByTime'] token = data.get('NextPageToken') if not token: break def generate_csv(): # 生成CSV内容 output = StringIO() writer = csv.writer(output) # 写入表头 writer.writerow(['date', 'teams', 'resource_names', 'Amounts', 'resource_type']) for result_by_time in results: for group in result_by_time['Groups']: amount = group['Metrics']['UnblendedCost']['Amount'] resource_type = 'mssql' # 清理标签键前缀 keys = [key.replace('app$', '').replace('Name$', '') for key in group['Keys']] teams = keys[0] if len(keys) > 0 else '' resource_names = keys[1] if len(keys) > 1 else '' # 写入数据行 writer.writerow([ f"{result_by_time['TimePeriod']['End']}{time_suffix}", teams, resource_names, amount, resource_type ]) # 上传CSV到S3 s3.put_object( Bucket=S3_BUCKET, Key=S3_KEY, Body=output.getvalue(), ContentType='text/csv' ) return f"CSV文件已上传至:s3://{S3_BUCKET}/{S3_KEY}" def lambda_handler(event, context): # Lambda必选的执行入口函数 try: message = generate_csv() return { 'statusCode': 200, 'body': message } except Exception as e: return { 'statusCode': 500, 'body': f"生成CSV失败:{str(e)}" }
修改说明:
- 移除本地AWS Profile依赖:Lambda通过执行角色自动获取权限,无需指定
profile_name - 替换print输出为S3存储:Lambda无本地文件系统,生成的CSV需上传到S3持久化
- 新增Lambda入口函数:
lambda_handler是Lambda执行的固定入口 - 清理无用依赖:删掉
argparse、random、pandas等未使用的库,减小部署包体积
二、Lambda部署步骤
1. 创建Lambda函数
- 登录AWS控制台,进入Lambda服务页面
- 点击创建函数,选择从头开始创作:
- 函数名称:比如
CostReportGenerator - 运行时:选Python 3.11(或其他兼容版本)
- 架构:保持默认
x86_64 - 点击创建函数
- 函数名称:比如
2. 上传代码
- 进入函数的代码标签页,把上面修改后的代码粘贴到
lambda_function.py编辑器中 - 注意:当前代码仅依赖boto3,Lambda默认已包含,无需额外打包依赖
3. 配置IAM执行角色权限
- 切换到配置标签页,点击权限选项卡,找到执行角色并点击角色名称跳转到IAM控制台
- 在IAM角色页面,点击添加权限 -> 创建内联策略:
- 选择JSON标签,粘贴以下策略(替换成你的S3桶名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ce:GetCostAndUsage", "Resource": "*" }, { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-cost-report-bucket/*" } ] } - 给策略命名(比如
CostReportPermissions),点击创建策略
- 选择JSON标签,粘贴以下策略(替换成你的S3桶名):
4. 测试函数
- 回到Lambda函数页面,点击测试按钮:
- 创建测试事件:随便填个事件名称(比如
TestEvent),事件内容保持默认JSON即可 - 点击保存后再次点击测试,查看执行结果:返回200状态码说明成功,可去S3桶查看生成的CSV
- 创建测试事件:随便填个事件名称(比如
三、配置每小时定时触发
1. 添加EventBridge触发器
- 在Lambda函数的配置标签页,点击触发器选项卡,点击添加触发器
- 触发器类型选EventBridge(CloudWatch Events)
- 选择创建新规则:
- 规则名称:比如
HourlyCostReportTrigger - 规则类型:计划表达式
- 计划表达式:输入
rate(1 hour)(表示每小时运行一次) - 点击添加完成配置
- 规则名称:比如
四、验证定时任务
- 等待一小时后,检查S3桶是否有新的CSV文件生成
- 也可在CloudWatch控制台的事件->规则中查看触发历史,或在Lambda的监控标签页查看执行日志
内容的提问来源于stack exchange,提问作者Ashif Shaikh
相关产品推荐
相关产品推荐

