27

我正在尝试使用 ECS Fargate 设置计划任务,但我无法弄清楚它为什么没有运行。我可以使用确认任务正常工作,RunTask但是当我尝试按计划触发它时,我得到的只是一堆“FailedInvocations”,没有任何解释。

我确实知道规则正在被触发,所以这是一个好兆头。请看下面的截图:

在此处输入图像描述

但是每次触发它时,只有一个“FailedInvocation”。这是调度规则:

在此处输入图像描述

并且默认权限ecsEventRole只是ecs:runTask

在此处输入图像描述

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:RunTask"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

我的直觉说这ecsEventsRole没有足够的权限。我应该尝试给它那些ecsTaskExecutionRole吗?

谢谢

编辑:现在us-east-1区域支持此功能。看评论。

4

6 回答 6

26

尽管已经一年多了,AWS 仍然没有正确的方法来查看调用日志。

如您所知,我们可以RunTask手动调用任务,计划任务也是如此。

唯一的区别是计划任务由 CloudWatch 规则触发。

我们可以很容易地看到调用日志CloudTrail Event history,去那里过滤事件名称:RunTask并选择您要检查的时间范围,找到事件并单击View Event,您将看到错误代码和响应。

于 2019-08-08T07:31:39.770 回答
15

我遇到了一个类似的问题,即常规 ECS 计划任务没有运行。

我最终通过添加一个ecsEventsRole允许 CloudWatch Events 将 IAM 角色传递给 ECS 任务的附加策略来解决它:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:ListInstanceProfiles",
                "iam:ListRoles",
                "iam:PassRole"
            ],
            "Resource": "*"
        }
    ]
}
于 2018-01-17T06:49:08.157 回答
3

这是一个可能的解决方法:使用 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

我已经测试过了,它可以工作。

于 2018-01-15T21:14:56.913 回答
2

在 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策略

于 2020-04-30T13:28:17.967 回答
0

我对 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"
                }
            }
        }
    ]
}
于 2020-08-20T11:43:49.767 回答
0

您是否尝试过使用 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"}'
于 2018-09-07T20:19:35.913 回答