我编写了一个 CloudFormation 模板,用于每隔 X 小时通过 Fargate 任务部署一个容器。频率由堆栈用户通过参数决定,然后使用调度表达式规则进行调度。
我的问题是何时第一次调用计划表达式规则?假设我有规则每 6 小时运行一次容器。规则应该立即运行该任务,然后每 6 小时再次运行一次,还是先等待 6 小时,然后第一次运行该任务?
我无法确定原因,但如果我将相同的 CloudFormation 模板上传到 AWS,大约 50% 的时间任务会立即执行,大约 50% 的时间会等待 X 小时才能完成任务第一次运行。我认为这可能是我的模板中的一个奇怪的竞争条件,因此我将计划的表达式规则设置为依赖于其他所有内容,使其最后运行并确保它需要的所有内容都已构建,但这没有什么区别。
AWS docs状态速率表达式在您创建计划事件规则时启动,然后按其定义的计划运行。
,但我不确定这是否意味着它在创建时开始运行或开始等待。我希望有人能帮助我弄清楚 AWS 的行为。
我的CloudFormation模板的相关部分供引用:
"Parameters": {
"ExecutionFrequency": {
"AllowedValues": [2, 4, 6,],
"Description": "The number of hours to wait in between runs.",
"Type": "Number"
}
},
"Resources": {
"ScheduleRule": {
"Properties": {
"Description": "Schedules the Fargate task to run every X hours.",
"Name": "myRule"
"ScheduleExpression": {
"Fn::Join": ["", ["rate(", {"Ref": "ExecutionFrequency"}, " hours)"]]
},
"State": "ENABLED",
"Targets": [
{
"Arn": "myClusterArn",
"EcsParameters": {
"LaunchType": "FARGATE",
"NetworkConfiguration": {
"AwsVpcConfiguration": {
"AssignPublicIp": "ENABLED",
"SecurityGroups": "mySecurityGroup",
"Subnets": ["mySubnet"]
}
},
"PlatformVersion": "LATEST",
"TaskCount": 1,
"TaskDefinitionArn": "myTaskDef"
},
"Id": "myTaskDef",
"RoleArn": "myRoleArn"
}
]
},
"Type": "AWS::Events::Rule"
}
}
最佳答案
这不是确定的,但我认为该规则会在 x 小时后立即运行。
当您的容器未运行时,您应该检查 Cloudtrail 的启动任务或运行任务 Api 操作,以查看是否尝试运行它,但第一次实际失败但第二次成功 - 如果您也在创建,则可能会这样Cloudwatch 用于运行任务的 IAM 角色。
您尚未显示所有模板,但假设 Cloudwatch 用于运行任务的角色也在模板中,请尝试在模板外部创建该角色并从模板内引用它,看看这是否为您提供一致的行为.
可能存在竞争条件。无论您将模板部署到哪个区域,该角色始终在 us-east-1 区域(底层)中创建。我之前怀疑过竞争条件,我唯一能想到的是创建角色的异步调用已经完成,但角色本身还没有准备好,尽管在模板中使用了 DependsOn 属性,但我当然可以完全错误。
关于aws-cloudformation - AWS Fargate 任务计划表达式规则首次运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69136906/