3、创建第一个定时Lambda函数:控制台创建、测试

好,我们直接上手。前面聊了那么多理论,现在终于到动手环节了。我个人习惯是先把“跑通最小闭环”放在第一位 —— 你想想看,只有看到代码真的跑起来,后面那些复杂配置才有意义。

这一章的目标很简单:在 AWS 控制台里创建一个 Lambda 函数,让它按 Cron 表达式定时执行,并在 CloudWatch Logs 里留下日志。 说白了,就是给后面三十天的巡检工作搭个“调度引擎”。

核心逻辑:把“手动检查”变成“定时触发”,这就是 Lambda + EventBridge 的组合拳。

创建定时Lambda流程:控制台操作、配置与测试 创建定时 Lambda 函数的三个步骤 1. 创建 Lambda 函数 控制台 → 从头创建 2. 配置定时触发器 EventBridge → Cron 表达式 3. 测试并验证 模拟事件 → 检查日志 编写函数代码 日志打印 + 异常处理 Cron 表达式配置 每分钟/每5分钟/定时 💡 核心要点 首次创建建议使用“从头创建”而非蓝图,理解完整配置链路

3.1 控制台创建:从头开始

登录 AWS 控制台,搜索 Lambda,进入服务页面。点击「创建函数」按钮。嗯,这里要注意:别选“使用蓝图”。为什么?蓝图虽然快,但隐藏了很多细节。我第一次用 Lambda 就是选的蓝图,结果后来改配置时一头雾水。

选择「从头创建」,按下面这张表填就行:

配置项 推荐值 说明
函数名称 log-audit-patrol 见名知意,表明职责
运行时 Python 3.12 我习惯用最新稳定版,生态好
架构 x86_64 兼容性最好,省钱省心
权限 创建基础角色 系统会帮你建一个最小权限角色

我的小习惯:函数名用连字符(-)而不是下划线(_)。Lambda 资源 ARN 里连字符可读性更好,排查问题时一眼就能认出来。

点击「创建函数」,大概等 5 到 10 秒。你会看到一个在线代码编辑器,左边是函数代码,下面是测试事件配置。我个人觉得 AWS 这个编辑器做得还不错 —— 对于简单的日志巡检来说,完全够用,不需要本地 IDE。

3.2 配置定时触发器:EventBridge 才是核心

创建完函数,页面会自动跳到函数详情页。往下翻,找到「触发器配置」区域。点击「添加触发器」。

在触发器列表里,选择 EventBridge (CloudWatch Events)。这里要说明一下:EventBridge 是 CloudWatch Events 的升级版,功能更多。但 Lambda 控制台里它俩的入口是分开的。我建议直接用 EventBridge。

配置内容如下:

  • 规则类型 → 选择“创建新规则”
  • 规则名称 → patrol-every-5min
  • 调度表达式 → 选择“Cron 表达式”

表达式填什么?我们想要每 5 分钟触发一次:

cron(0/5 * * * ? *)

你看,这个 Cron 格式跟 Linux 的有点不一样。它有 6 个字段,多了一个「年份」字段(最后一位)。而且「星期几」和「月份中的日期」不能同时指定,要留一个为 ?。我曾经在这个坑里摔过一次 —— 写了个 * 代替 ?,结果函数在特定日期就是不触发,查了半天才发现。

Cron 位置 含义 示例取值
第 1 位 分钟 0/5 表示从 0 分开始,每 5 分钟
第 2 位 小时 * 表示任意小时
第 3 位 日 * 表示任意天
第 4 位 月 * 表示任意月
第 5 位 星期 ? 表示不指定
第 6 位 年份 * 表示任意年份

注意:cron(0/5 * * * ? *) 与 cron(*/5 * * * ? *) 不一样!前者在整点 0,5,10... 分钟触发;后者在每分钟的 0,5,10... 秒触发,触发次数会非常频繁。谨慎选择。

点击「添加」,触发器就配置好了。回到函数详情页,你会看到触发器列表里多了一条记录,状态显示为“已启用”。

3.3 编写测试事件:模拟触发

好,代码还没写呢。我们来写一段最简单的日志打印代码:

import json
import logging
from datetime import datetime

# 配置日志输出
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    """
    定时巡检入口函数
    每次触发记录当前时间 + 事件来源
    """
    now = datetime.utcnow().isoformat()
    source = event.get('source', 'unknown')
    
    message = f"[巡检日志] 时间: {now} | 来源: {source}"
    logger.info(message)
    
    # 返回结果给 Lambda 执行环境
    return {
        'statusCode': 200,
        'body': json.dumps({
            'message': message,
            'timestamp': now
        })
    }

我个人写 Lambda 函数时,有个固定习惯:把日志级别设置为 INFO,并且每条日志都带上时间戳和事件来源。这看起来不起眼,但在排查触发次数、判断延迟时特别有用。

写完代码,点击「Deploy」。别忘!很多新手在这里栽跟头 —— 代码改了半天,没部署,触发的还是老版本。

接下来,测试。点击页面右上角的「Test」按钮,弹出一个配置测试事件的窗口:

  • 事件名称 → TestEvent
  • 事件 JSON → 选默认模板,或者用这个:
{
  "source": "aws.events",
  "detail-type": "Scheduled Event",
  "resources": [],
  "detail": {},
  "time": "2024-01-01T00:00:00Z"
}

点击「创建」,然后点击「Test」。稍等几秒钟,你会看到返回结果:

{
  "statusCode": 200,
  "body": "{\"message\": \"[巡检日志] 时间: 2024-01-01T00:00:00 | 来源: aws.events\", \"timestamp\": \"2024-01-01T00:00:00\"}"
}

绿色勾号表示执行成功!这时候,去 CloudWatch Logs 里看看:

  1. 在 Lambda 页面点击「监控」标签
  2. 点击「查看 CloudWatch 日志」
  3. 你会看到一个以 /aws/lambda/log-audit-patrol 命名的日志组
  4. 点进去,能看到刚才测试生成的日志流

日志内容大概长这样:

START RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
[巡检日志] 时间: 2024-01-01T00:00:00 | 来源: aws.events
END RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Duration: 2.10 ms Billed Duration: 3 ms Memory Size: 128 MB Max Memory Used: 38 MB

检查一下:Duration 只有几毫秒,说明函数执行很快。Max Memory Used 38 MB,远低于 128 MB 限制。这是正常现象。如果你的 Duration 超过 1000 ms,就要考虑优化代码了。

3.4 验证定时触发是否生效

配置完 Cron 触发器之后,怎么确认它真的在按计划跑?你可以等 5 分钟,然后去 CloudWatch Logs 里看日志组。正常情况下,每 5 分钟会新增一条日志流。

不过我个人更常用的方法是:手动缩短 Cron 间隔,先测一分钟的版本。把表达式改成 cron(* * * * ? *) —— 每分钟触发一次。等看到日志稳定输出后,再改回 cron(0/5 * * * ? *)。这样一来,你能快速确认触发器配置是对的,而不是傻等 5 分钟。

避坑提醒:测试完记得改回来!我曾经有一次忘了改回到正常频率,结果每分钟触发一次的函数跑了整整一个周末。月底看到账单时,虽然没花多少钱(Lambda 费用极低),但 CloudWatch Logs 的存储费用确实涨了不少。

好,到这里,你已经成功创建并测试了一个定时 Lambda 函数。它每 5 分钟打印一次巡检日志。后面的章节,我们会在这个基础上,加入真正的日志分析和报警逻辑。