我正在尝试使用 ECS Fargate 设置计划任务,但我无法弄清楚它为什么没有运行。我可以使用
RunTask
确认该任务正常工作,但是当我尝试按计划触发它时,我得到的只是一堆“失败的调用”,没有任何解释。
我确实知道该规则正在被触发,所以这是一个好兆头。请看下面的截图:
但每次触发时,都会出现“FailedInitation”。日程安排规则如下:
以及
ecsEventRole
上的默认权限,只需 ecs:runTask
:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:RunTask"
],
"Resource": [
"*"
]
}
]
}
我的预感是这个
ecsEventsRole
没有足够的权限。我应该尝试给它 ecsTaskExecutionRole
拥有的吗?
谢谢
编辑:现在
us-east-1
区域支持此功能。看评论。
虽然已经过去一年多了,AWS仍然没有一个合适的方法来查看调用日志。
正如您所知,我们可以通过
RunTask
手动调用任务,计划任务也是如此。
唯一的区别是计划任务是由 CloudWatch 规则触发的。
我们可以在
CloudTrail Event history
中轻松查看调用日志,进入那里并过滤事件名称为:RunTask
的事件并选择要检查的时间范围,找到事件并单击View Event
,您将看到错误代码和回应。
我遇到了类似的问题,即常规 ECS 计划任务未运行。
我最终通过向
ecsEventsRole
添加额外的策略来解决这个问题,该策略允许 CloudWatch Events 将 IAM 角色传递给 ECS 任务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:ListInstanceProfiles",
"iam:ListRoles",
"iam:PassRole"
],
"Resource": "*"
}
]
}
这里有一个可能的解决方法:使用 lambda 函数作为 cloudwatch 规则的目标,并在 lambda 函数代码中创建任务。
以下是 lambda 函数的示例代码: https://lobster1234.github.io/2017/12/03/run-tasks-with-aws-fargate-and-lambda/
这些链接描述了如何使用 lambda 函数打包新的 boto 版本,但这不再是必要的,因为 AWS 已经将 lambda boto 版本更新到 1.4.8
我已经测试过并且有效。
在 CloudFormation 中定义规则时,我必须确保引用了 Target RoleArn 属性
ecsEventsRole
:
Targets:
- Id: !Sub ${AWS::StackName}-cron-test-1
Arn: arn:aws:ecs:eu-west-1:<account id>:cluster/fargate-cluster
RoleArn: !Join
- ':'
- - "arn:aws:iam"
- ""
- !Ref "AWS::AccountId"
- "role/ecsEventsRole"
其中
ecsEventsRole
定义了 AmazonEC2ContainerServiceEventsRole 策略
您是否尝试过使用 aws cli 并运行
aws events put-rule
,然后运行 aws events put-targets --rule <value> --targets <value>
?我遇到了类似的问题,并且使用(最新版本的)aws cli 对我有用。
这是一个示例:
aws events put-rule --name "DailyLambdaFunction" --schedule-expression "cron(0 9 * * ? *)"
随后将以下命令全部写在一行中:
aws events put-targets --rule cli-RS-rule --targets '{"Arn":"arn:aws:ecs:1234/cluster/clustername","EcsParameters":{"LaunchType": "FARGATE","NetworkConfiguration": {"awsvpcConfiguration": {"AssignPublicIp": "ENABLED", "SecurityGroups": [ "sg-id1233" ], "Subnets": [ "subnet-1234" ] }},"TaskCount": 1,"TaskDefinitionArn": "arn:aws:ecs:1234:task-definition/taskdef"},"Id": "sampleID111","RoleArn": "arn:aws:iam:1234:role/eventrole"}'
我在使用 ECS fargate 任务调度程序时遇到了类似的问题。我已成功通过将以下策略添加到任务 IAM 角色来修复此问题。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:RunTask"
],
"Resource": [
"arn:aws:ecs:*:548503722878:task-definition/test-services-20200813124716"
],
"Condition": {
"ArnLike": {
"ecs:cluster": "arn:aws:ecs:*:548503722878:cluster/test-cluster"
}
}
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": [
"*"
],
"Condition": {
"StringLike": {
"iam:PassedToService": "ecs-tasks.amazonaws.com"
}
}
}
]
}
我发现所有的答案都缺少一个很重要的一点:
用作“ecsEventsRole”的角色(或“目标角色”,如果您从 ECS->Scheduled_tasks 查看它)必须具有对事件服务的信任才能运行任务:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "events.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
此外(如前所述)它应该具有运行任务的权限 - 通过添加预定义的 AWS 策略即可轻松实现:
AmazonEC2ContainerServiceEventsRole
我不知道它是如何工作的,但它确实有效。我在将任务调度到 ecs 时确实打开了 [自动分配公共 IP]。 我被这个错误困扰了几个小时。