Cloudwatch failedinvocation错误没有可用的日志

Nat*_*n B 12 amazon-ec2 amazon-web-services amazon-ecs aws-cloudformation amazon-cloudwatch

我已经设置了一个Cloudwatch规则事件,其中在完成上一个任务定义时启动了ECS任务定义.

我可以看到事件触发任务定义但是它失败了.

此失败的唯一可见性是在规则指标中,我在其中看到指标failedinnvocations.

问题,是否有任何日志可以查看触发器失败的原因?

我可以通过管理控制台手动设置规则,一切正常.

通过云信息模板设置规则时发生错误.

我比较了两个规则,两者都是相同的,除了角色.但是,两个角色具有相同的权限.

Nic*_*rbé 22

如果规则已成功触发,但对目标的调用失败,您应该在 AWS CloudTrail 内的事件历史记录中看到 API 调用的跟踪,查看errorCodeerrorMessage属性:

{
   [..]
   "errorCode": "InvalidInputException",
   "errorMessage": "Artifacts type is required",
   [..]
}
Run Code Online (Sandbox Code Playgroud)


bar*_*kbd 15

CloudTrail 日志有所帮助。事件名称是 RunTask。问题是:“errorCode”:“InvalidParameterException”,“errorMessage”:“覆盖名为 rds-task 的容器不是 TaskDefinition 中的容器。”,

用于调试 CloudWatch 事件的 AWS 文档位于:https ://docs.aws.amazon.com/AmazonCloudWatch/latest/events/CWE_Troubleshooting.html

我打开了一个 PR 来添加用于从 CloudWatch Events 调试失败的 ECS 任务调用的文档:https :
//github.com/awsdocs/amazon-cloudwatch-events-user-guide/pull/12/files


Nat*_*n B 14

此问题是由于未将主要服务设置为包含 events.amazonaws.com。该任务无法承担该角色。

耻辱 aws 没有更好的失败调用日志记录。


Ste*_*ano 8

这让我们困扰了很多年,主要问题是Nathan B提到的角色问题,但是让我们绊倒的其他事情是Scheduled Containers将无法在awsvpc模式下工作(并且通过扩展Fargate).这是一个示例CloudFormation模板:

---
AWSTemplateFormatVersion: 2010-09-09
Description: Fee Recon infrastructure

Parameters:

  ClusterArn:
    Type: String
    Description: The Arn of the ECS Cluster to run the scheduled container on

Resources:

  TaskRole:
    Type: AWS::IAM::Role
    Properties:
      Path: /
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - sts:AssumeRole
            Effect: Allow
            Principal:
              Service:
                - ecs-tasks.amazonaws.com
        Version: 2012-10-17
      Policies:
       - PolicyName: TaskPolicy
         PolicyDocument:
           Version: 2012-10-17
           Statement:
             - Effect: Allow
               Action:
                 - 'ses:SendEmail'
                 - 'ses:SendRawEmail'
               Resource: '*'

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      TaskRoleArn: !Ref TaskRole
      ContainerDefinitions:
        - Name: !Sub my-container
          Essential: true
          Image: !Sub <aws-account-no>.dkr.ecr.eu-west-1.amazonaws.com/mycontainer
          Memory: 2048
          Cpu: 1024

  CloudWatchEventECSRole:
   Type: AWS::IAM::Role
   Properties:
     AssumeRolePolicyDocument:
       Version: 2012-10-17
       Statement:
         - Effect: Allow
           Principal:
             Service:
               - events.amazonaws.com
           Action:
             - sts:AssumeRole
     Path: /
     Policies:
       - PolicyName: CloudwatchEventsInvokeECSRunTask
         PolicyDocument:
           Version: 2012-10-17
           Statement:
             - Effect: Allow
               Action: 'ecs:RunTask'
               Resource: !Ref TaskDefinition

  TaskSchedule:
    Type: AWS::Events::Rule
    Properties:
      Description: Runs every 10 minutes
      Name: ScheduledTask
      ScheduleExpression: cron(0/10 * * * ? *)
      State: ENABLED
      Targets:
        - Id: ScheduledEcsTask
          RoleArn: !GetAtt CloudWatchEventECSRole.Arn
          EcsParameters:
            TaskDefinitionArn: !Ref TaskDefinition
            TaskCount: 1
          Arn: !Ref ClusterArn
Run Code Online (Sandbox Code Playgroud)

注意:我已将ClusterArn作为参数添加到脚本中,但当然最好使用CloudFormation ImportValue语句执行此操作.

您需要关注两个角色,第一个是TaskRole任务本身的角色():在此示例中,容器只使用SES发送电子邮件,因此它具有必要的权限.第二个角色(CloudWatchEventECSRole)是使其全部工作的角色,请注意,在其Policies数组中,原则是events.amazonaws.com,资源是模板中定义的ECS任务.


Jon*_*all 6

以防其他人来到这里寻找必要的设置,以便在 Fargate 中完成任务。除了 Stefano 的回答之外,还有一些额外的配置。在 Fargate 中运行任务需要设置执行角色,因此您需要启用 CloudWatchEventESCRole 才能使用它。将此语句添加到该角色:

{
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": [
        "arn:aws:iam::<account>:role/<executionRole>"
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 内置策略“AmazonEC2ContainerServiceEventsRole”也有 `iam:PassRole`。它执行 `"StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" }` 而不是命名资源。 (2认同)