我有一个ECS / Fargate任务,每五分钟运行一次。如果以前的实例仍在工作,是否有办法告诉它不运行?目前,我只是传递给它一个cron表达式,而cron / rate aws文档中没有任何关于阻止后续运行的信息。
通常,我正在寻找类似于Spring的@Scheduled(fixedDelay = xxx)的东西,它在完成后每五分钟运行一次。
编辑-我使用cloudformation而不是cli创建了任务
答案 0 :(得分:1)
如果您将Cloudwatch Logging用于ECS应用程序,则此解决方案有效 -让脚本发出“任务已完成”或“脚本已成功完成运行”消息,以便以后进行跟踪。
describeLogStreams
函数,首先检索最新的日志流。这将是为您的案例在5分钟前运行的任务创建的数据流。getLogEvents
函数。指向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
。