You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手向:将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),点击创建策略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:10:25