如何从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 个节点 -
- LoadFile(任务节点)
- 等待节点。你可以让这个节点等待固定的秒数。
- 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);
}
我有一个在 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 个节点 -
- LoadFile(任务节点)
- 等待节点。你可以让这个节点等待固定的秒数。
- 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);
}