ECS / Fargate-可以安排作业每5分钟运行一次,除非已运行该作业?

时间:2019-08-15 14:34:23

标签: amazon-ecs aws-fargate

我有一个ECS / Fargate任务,每五分钟运行一次。如果以前的实例仍在工作,是否有办法告诉它不运行?目前,我只是传递给它一个cron表达式,而cron / rate aws文档中没有任何关于阻止后续运行的信息。

通常,我正在寻找类似于Spring的@Scheduled(fixedDelay = xxx)的东西,它在完成后每五分钟运行一次。

编辑-我使用cloudformation而不是cli创建了任务

2 个答案:

答案 0 :(得分:1)

如果您将Cloudwatch Logging用于ECS应用程序,则此解决方案有效  -让脚本发出“任务已完成”或“脚本已成功完成运行”消息,以便以后进行跟踪。

  • 使用describeLogStreams函数,首先检索最新的日志流。这将是为您的案例在5分钟前运行的任务创建的数据流。
  • 有了流的名称后,请检查最后几个记录的事件(流中打印的文本),以查看流是否应该打印出预期的任务完成事件。为此,请使用getLogEvents函数。
  • 如果不是,请不要启动下一个任务并根据需要调用等待或处理
  • 安排您的脚本正常运行每5分钟运行一次。

指向aws-sdk文档的API链接如下。该脚本使用JS编写,并使用AWS-SDK(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS.html),但您可以将boto3用于python或将其他lib用于其他语言

    const logGroupName = 'logGroupName';
    this.cloudwatchlogs = new AwsSdk.CloudWatchLogs({
       apiVersion: '2014-03-28', region: 'us-east-1'
    });

 // Get the latest log stream for your task's log group. 
 // Limit results to 1 to get only one stream back.

    var descLogStreamsParams = {
      logGroupName: logGroupName,
      descending: true,
      limit: 1,
      orderBy: 'LastEventTime'
    };

    this.cloudwatchlogs.describeLogStreams(descLogStreamsParams, (err, data) => {

      // Log Stream for the previous task run..

      const latestLogStreamName = data.logStreams[0].logStreamName;

      // Call getLogEvents to read from this log stream now..

      const getEventsParams = {
        logGroupName: logGroupName,
        logStreamName: latestLogStreamName,
      };

      this.cloudwatchlogs.getLogEvents(params, (err, data) => {

        const latestParsedMessage = JSON.parse(data.events[0].message); 

        // Loop over this to get last n messages
        // ...
      });
    });

答案 1 :(得分:0)

如果使用CLI启动任务,则run-task命令将返回任务信息。

然后您可以使用它来检查该任务的状态:

aws ecs describe-tasks --cluster MYCLUSTER --tasks TASK-ARN --query 'tasks[0].lastStatus'

如果仍在运行,它将返回RUNNING,如果已停止,则返回STOPPED,等等。

请注意,Fargate在收集停止的任务方面非常积极。如果该命令返回null,则可以将其视为STOPPED