如何从Lambda enable/disable AWS Lambda 的桂冠

How to enable/disable the cron of AWS LambdaB from LambdaA

我有一个在 S3 事件上触发的 Lambda (LoadFile)。这种情况每年发生一次或两次。

加载文件后,午夜时分,需要激活加载的数据。有一个 lambda (ActivateData) 可以做到这一点。有一个 cron 事件会在午夜 运行 这个 lambda。该事件在创建时 'disabled'。

加载数据后,LoadFile lambda 如何 'enable' ActivateData lambda 的 cron 事件?

为了奖励积分,ActivateData lambda 如何禁用它自己的 cron 事件?

我特别感兴趣 Java。

SAM 模板使用以下内容指定 ActivateData lambda:

  Events:
    ActivateFileDataEvent:
      Type: Schedule
      Properties:
        Schedule: cron(0 0 * * ? *)
        Description: Activates an already loaded file
        Enabled: false

我认为 cron 不是处理此用例的最理想方式。大多数时候它会处于禁用状态。更好的方法可能是使用现有的两个 Lambda 函数来使用 AWS Step Functions。

Step 函数将包含 3 个节点 -

  1. LoadFile(任务节点)
  2. 等待节点。你可以让这个节点等待固定的秒数。
  3. ActivateData(任务节点)。

唯一棘手的部分是决定等待节点必须等待多长时间。这可以在您的 LoadFile Lambda 中决定。您可以在那里获取 currentTime 并计算下一个 12 AM 之前剩余的秒数。并在您的 Step Functions 状态中设置此值,以便 Wait 节点可以拾取它。

如果您不想破坏 LoadData Lambda 函数中的逻辑,您可以在单独的 Lambda 函数中解耦时间计算逻辑,并将这个新函数再次作为任务节点放入您的 Step Function 中。

与大多数事情一样,一旦你弄明白了,它真的很简单。

在 SAM 中:

  • 将要启用的事件名称存储为加载文件 Lambda 中的环境变量
  • 在策略部分为该 lambda 提供必要的权限。

然后这段代码就成功了。 ActivateData lambda 一旦 运行 就必须被禁用,这样它就不会在每晚午夜再次 运行。

AmazonEventBridge eventBridge = AmazonEventBridgeClientBuilder.defaultClient();
EnableRuleRequest request = new EnableRuleRequest();
request.setName(System.getenv("ACTIVATE_EVENT_NAME"));
try {
  EnableRuleResult result = eventBridge.enableRule(request);
} catch (Throwable t){
  log.error("Something went wrong, event is still disabled.",t);
}