我们正在创建一个每5分钟运行一次的cron作业,只需将“hello world”记录到我们的日志组中。这是通过AWS Cloudformation完成的,其任务只是回显“hello world”。
这是预定规则
ScheduledRule:
Type: "AWS::Events::Rule"
Properties:
Description: "ScheduledRule"
ScheduleExpression: "rate(5 minutes)"
State: "ENABLED"
Targets:
-
RoleArn:
Fn::GetAtt: [ RoleNeeded, Arn ]
Id: Cluster-Test-Cron-job
Arn:
Ref: ArnOfOurClusterTheScriptShouldExecute
EcsParameters:
TaskDefinitionArn:
Ref: TaskDefinitionThatExecutesLoggerScript
TaskCount: 1
Cloudwatch指标显示该任务已触发,但也表示FailedInvocation
。似乎我们在这里遗漏了一些东西,如果ScheduleExpression
足以使脚本每5分钟执行一次吗?我们检查了所需的角色,并且已经建议和建议的角色与策略AmazonEC2ContainerServiceEventsRole
一起使用,ArnOfOurClusterTheScriptShouldExecute
和TaskDefinitionThatExecutesLoggerScript
也起作用,因为我们测试了使用{{1}运行任务手动设置并将其记录到我们的日志组。
我发现了这个question,但这也增加了FailedInvocation指标。
我们错过了上面的设置让我们允许脚本正确执行?
答案 0 :(得分:0)
假设我们需要一个事件模式,我们看错了方向。但是这个角色就是问题所在。
有错误的角色设置
RoleWeNeed:
Type: AWS::IAM::Role
Properties:
Path: /
AssumeRolePolicyDocument: |
{
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": [ "ecs.amazonaws.com" ]},
"Action": [ "sts:AssumeRole" ]
}]
}
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole
- arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole
我们尝试通过cloudformation创建后手动更改计划规则,并注意到我们使用上述设置创建的角色虽然具有正确的策略,但在角色的下拉选项中不可用。
以下政策允许适当地提供政策,但这不会发生,因为首先,使用我们的事件规则并不可见。
arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole
设置错误
AssumeRolePolicyDocument: |
{
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": [ "ecs.amazonaws.com" ]},
"Action": [ "sts:AssumeRole" ]
}]
}
基于文档的 ecs.amazonaws.com 不会使该角色可用于计划规则所属的事件。
在IAM角色中,使用角色的信任策略中的Principal元素来指定谁可以担任该角色。
正确的设置
允许该角色可以通过 events.amazonaws.com
进行活动访问AssumeRolePolicyDocument: |
{
"Statement": [{
"Effect": "Allow",
"Principal": { "Service": [ "events.amazonaws.com" ]},
"Action": [ "sts:AssumeRole" ]
}]
}