数字海洋的12天(第5天) – 使用每日触发器自动化生日提醒

欢迎来到第五天数字海洋的12天活动昨天,您设置了生日提醒服务以在数字海洋函数上运行,这意味着它现在是无服务器和云就绪的。🎉 今天,您将更进一步,通过自动化使其按照自己的计划运行——无需手动输入。

在本指南结束时,您的服务(或任何其他您正在处理的功能)将每天在设定的时间自动运行。这意味着不再需要记得自己触发——它只需正常工作。

为什么要自动化?

将功能部署到云端是昨天的一大胜利,但手动运行它却违背了自动化的目的。今天的重点是调度服务自动运行——像钟表一样——这样您就可以设置它并忘记它。数字海洋函数内置了使用触发器的调度功能,正是为了这个目的,您有两种方式进行设置。

🚀 你将学到的内容

到今天结束时,你将知道如何:

  1. 设置一个每日触发器,自动运行你的函数。
  2. 学习两种方法来实现这一点——通过 DigitalOcean 控制面板或使用 doctl CLI 和 project.yml
  3. 测试设置以确保它正常工作。

🛠 你需要的工具

在开始之前,请确保你拥有以下内容:

  1. 已经在 DigitalOcean 部署的函数(例如,来自 第 4 天:构建生日提醒服务 的生日提醒服务),以便通过触发器进行自动化。
  2. 如果使用 doctl CLI,您需要您的函数的 project.yml 文件。您可以查看 第4天 的说明,了解如何安装和设置 doctl CLI,以及创建 project.yml 文件。

🧑‍🍳 第5天食谱:使用触发器自动化函数

步骤1:为您的函数设置触发器

DigitalOcean 为您提供 两种选择 来设置触发器:

  1. 选项1: 使用控制面板进行快速简便的设置。
  2. 选项2: 使用 doctl CLI 进行更强大和程序化的控制。

警告: 请记住,如果您使用 CLI 重新部署功能,在 控制面板 中创建的触发器将会丢失。如果您经常需要重新部署,请使用 选项 2 将触发器直接添加到 project.yml 文件中。

选项 1:使用控制面板创建触发器

通过 DigitalOcean 控制面板设置触发器是最简单的方法。这很快,不需要任何设置,适合简单的一次性配置。

  • 在 DigitalOcean 控制面板上导航至 主函数页面
  • 找到您的函数(例如,reminders/birthdays)并点击 触发器 选项卡。

  • 点击 创建触发器,为您的触发器添加一个 名称。这个名称可以是任何描述性的,例如 daily-birthday-trigger。名称只能包含字母数字字符、短横线和句点。
  • 添加一个 cron 表达式 来设置调度。例如,0 9 * * * 意味着该功能将在每天上午 9:00 运行。

注意: 如果您不确定 cron 是如何工作的?查看 crontab.guru 获取便捷指南。

  • 保存 触发器。

一旦您创建了触发器,测试一下以确保一切按预期工作是个好主意。请跳转到下面的 测试自动化 部分了解如何操作。

警告: 虽然仪表板简单且有效,但如果您使用CLI重新部署该功能,这里创建的任何触发器将会被 覆盖或删除。对于频繁更新或程序化部署,请跳到 选项2

选项2:使用 doctl CLI 与 project.yml

您还可以通过直接将触发器添加到您的 project.yml 文件来创建触发器。这种方法对于频繁的重新部署更可靠,因为它确保您的触发器始终包含在功能的配置中。与之前描述的控制面板选项不同,这种方法可以防止触发器在重新部署期间被覆盖或丢失。

以下是您可以设置它的步骤:

  • 打开你的 project.yml 文件,来自 第4天:使用 DigitalOcean 函数部署生日通知。它可能看起来像这样:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
    
  • 在你的函数配置中添加一个 triggers 部分以定义计划:

    triggers:
      - name: daily-birthday-trigger
        sourceType: scheduler
        sourceDetails:
        cron: "0 9 * * *"
    
  • 最终更新的 project.yml 文件:

    packages:
      - name: reminders
        shared: false
        environment:
          DO_DB_NAME: "${DB_NAME}"
          DO_DB_USER: "${DB_USER}"
          DO_DB_PASSWORD: "${DB_PASSWORD}"
          DO_DB_HOST: "${DB_HOST}"
          DO_DB_PORT: "${DB_PORT}"
          TWILIO_ACCOUNT_SID: "${TWILIO_ACCOUNT_SID}"
          TWILIO_AUTH_TOKEN: "${TWILIO_AUTH_TOKEN}"
          TWILIO_PHONE_FROM: "${TWILIO_PHONE_FROM}"
          TWILIO_PHONE_TO: "${TWILIO_PHONE_TO}"
        functions:
          - name: birthdays
            runtime: python:default
            triggers:
              - name: daily-birthday-trigger
                sourceType: scheduler
                sourceDetails:
                  cron: "0 9 * * *"
    

    这告诉 DigitalOcean 每天上午 9:00 运行 birthdays 函数。

    1. triggers 部分: 定义触发器的名称、类型和时间表。您可以为触发器命名为任何描述性的名称,例如 daily-birthday-trigger

    2. cron: 指定函数每天在 UTC 时间运行的时间。例如,cron 表达式 0 9 * * * 会将函数安排在每天上午 9:00 运行。

  • 保存文件并通过从包含my-birthday-reminder-service文件夹的目录运行以下命令来部署它:

    doctl serverless deploy my-birthday-reminder-service
    

    重要提示: 确保从父目录运行命令,而不是在my-birthday-reminder-service文件夹内。错误的位置运行可能会导致类似以下的错误:

    ❯ doctl serverless deploy my-birthday-reminder-service
    错误:ENOENT:没有这样的文件或目录,lstat
    
  • 一旦部署成功,您将看到类似于以下的确认消息:

    已部署的函数
      - reminders/birthdays
    已部署的触发器:
      - daily-birthday-trigger
    

  • 前往您的仪表板,验证触发器是否已在函数部分创建。

专业提示:要测试您的触发器,请暂时将 cron 表达式设置为几分钟后(例如,如果现在是上午 9:25,则设置为28 9 * * *)。确认其有效后,将其更新回您计划的时间表并重新部署。

步骤 2:测试自动化

让我们测试您的触发器,以确保它们正常工作。您可以暂时将它们设置为在几分钟后运行,而不是等待它们按常规时间触发。以下是操作方法:

  • 将您的触发器的 cron 表达式设置为当前时间(以UTC为准)之后的几分钟。例如,如果现在是 UTC 时间 9:25 AM,请将 cron 表达式设置为28 9 * * *,这样函数将在 UTC 时间 9:28 AM 运行。

    注意:不确定如何将您的当地时间转换为 UTC?像时区转换器这样的工具可以提供帮助。

  • 保存更新后的触发器(如果使用控制面板)或重新部署您更新后的 project.yml 文件(如果使用 CLI):

    doctl serverless deploy my-birthday-reminder-service
    
  • 等待触发器执行,然后检查 激活 日志以确认函数成功运行:

    doctl serverless activations logs --function reminders/birthdays --last
    

注意:激活日志记录了关于您的功能何时执行的详细信息,包括是否成功运行或遇到错误。它们是验证触发器是否在计划时间触发的一个有用方法。

此命令将返回您功能最近一次激活的详细信息。例如,您可能会看到类似这样的内容:

=== 59e8e4f482874d79a8e4f48287dd79ef success 12/23 07:46:33 reminders/birthdays:0.0.6
2024-12-23T07:46:33.323205805Z stdout: Message sent for Charlie Brown. Message SID: SM85f5caeb3ec09239e0d8bdaaba2b158b

这确认了触发器已触发,功能已成功激活!🎉

注意:一旦您确认一切正常,请将cron表达式更新为您所需的计划(例如,0 9 * * *表示每天UTC时间9:00)并保存或重新部署。

关于日志的简要说明

虽然激活日志命令是检查最近执行的一个好方法,但有时您需要更详细的日志来调试或调查功能问题。DigitalOcean还提供将这些日志转发到外部日志服务的选项,使您随着时间的推移更容易监控和排除应用程序故障。

在第六天,你将学习如何直接查看日志,有效解释它们,并设置将日志转发到外部服务,如Logtail或Papertrail。这些工具将帮助你轻松掌握你功能的性能。

🎁 总结

今天你完成了以下内容:

  1. 你自动化了你的生日提醒服务(或其他任何功能),使其每天运行。
  2. 你学习了两种设置触发器的方法——通过控制面板和使用doctl CLI。
  3. 你测试了你的设置,以确保其按预期工作。

以下是本系列的前几个教程:

接下来: 现在您的服务独立运行,下一步是有效地监控它。在下一个教程中,您将学习如何查看函数日志并将其转发到外部服务,以简化跟踪和故障排除。到时见!

Source:
https://www.digitalocean.com/community/tutorials/automating-birthday-reminders-with-triggers