【问题标题】:Cloudwatch failedinvocation error no logs available [closed]Cloudwatch failedinvocation 错误没有可用的日志 [关闭]
【发布时间】:2018-07-14 03:29:33
【问题描述】:

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

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

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

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

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

当我通过 cloudformation 模板设置规则时出现错误。

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

【问题讨论】:

  • 能否请您发布您的模板的相关部分?

标签: amazon-web-services amazon-ec2 amazon-cloudformation amazon-cloudwatch amazon-ecs


【解决方案1】:

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

{
   [..]
   "errorCode": "InvalidInputException",
   "errorMessage": "Artifacts type is required",
   [..]
}

【讨论】:

  • 谢谢你。这是我能够弄清楚我的 CloudWatch 规则实际发生了什么的唯一方法。
  • 我认为这应该是正确的答案。感谢您发布此内容。
  • 这是我发现发生了什么的方法。我启用了 cloudtrail 并在 cloudwatch 上搜索它以查找问题。谢谢你的回答
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这困扰了我们很久,主要问题是 Nathan B 提到的角色问题 但让我们感到困惑的其他事情是计划容器在 awsvpc 模式下无法工作(以及扩展 Fargate) s>。这是一个示例 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
    
      SecurityGroup:
        Type: String
        Description: The security group the task will use
    
      Subnet0:
        Type: String
        Description: A subnet that the task will run in
    
      Subnet1:
        Type: String
        Description: A subnet that the task will run in
    
    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
                NetworkConfiguration:
                  AwsVpcConfiguration:
                    SecurityGroups:
                      - !Ref SecurityGroup
                    Subnets:
                      - !Ref PrivateSubnet0
                      - !Ref PrivateSubnet1
              Arn: !Ref ClusterArn
    

    注意:我已将 ClusterArn 作为参数添加到脚本以及您希望任务在其中运行的安全组和子网中。

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

    【讨论】:

    • 我认为它实际上可以使用awsvpc模式,但您需要明确指定网络策略(mismo.team/…
    • 在撰写本文时,此答案是正确的,但您现在可以了,我会更新答案。
    【解决方案4】:

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

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

    【讨论】:

    • 感谢您发布此信息!我遇到了我认为类似的问题。如果您可以分享更多有关您找到的解决方案的信息,那可能会帮助我完成这项工作。非常感谢您提供的更多细节。
    • 对于未来的读者:我发现实际上记录了事件,包括调用失败的错误消息。只需转到 cloudtrail -> 事件历史记录。
    • @RobbertvandenBogerd 关于过滤的任何提示?我没有找到任何特定于调用的内容。
    • 不是真的,只是尝试调用你正在测试的东西,看看在那一刻发生了哪些事件。祝你好运
    【解决方案5】:

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

    {
        "Effect": "Allow",
        "Action": "iam:PassRole",
        "Resource": [
            "arn:aws:iam::<account>:role/<executionRole>"
        ]
    }
    

    【讨论】:

    • 内置策略“AmazonEC2ContainerServiceEventsRole”也有iam:PassRole。它使用"StringLike": { "iam:PassedToService": "ecs-tasks.amazonaws.com" } 而不是命名资源。
    • 这是我遗漏的部分......如果文档说“触发器需要使用的策略需要这些权限:......”真的会很有帮助:......”
    【解决方案6】:

    我也没有看到我的 lambda 正在执行,但我确实在 CloudWatch Events 中找到了 FailedInvocations 的证据(但只能通过 Event Rule Metrics 链接,该链接将我带到 https://console.aws.amazon.com/cloudwatch/home?region={your_aws_region}#metricsV2:graph=~();query=~'*7bAWS*2fEvents*2cRuleName*7d*2{Lambda_Physical_ID}

    我也没有在控制台中看到“触发器”,所以我退后一步,决定使用 Events 属性集进行更“简单”的 SAM 部署,然后查看处理后的模板以确定它是如何实现的在那种情况下完成了。下面是我最终用来实现“EventBridge”以让 ScheduledEvent 触发我的 Lambda(在我的例子中是别名,这就是我发现这个的原因)。

    安排调用的简单 SAM 方法

    (将此属性添加到您的 AWS::Serverless::Function)

    Events:
      InvokeMyLambda:
        Type: Schedule
        Properties:
          Schedule: rate(1 minute)
          Description: Run SampleLambdaFunction once every minute.
          Enabled: True
    

    通过查看 CloudFormation 中转换后的模板并与没有 Events 的版本进行比较,我能够识别出不是在预期的 AWS::Events::Rule 上(这是我期望看到的调用 lambad 的内容),但我也看到了 AWS::Lambda::Permission。

    希望这也是让调用正常工作所需要的(并且不需要丢失的日志来查看原因):P

    工作方法

    MyLambdaScheduledEvent:
      Type: AWS::Events::Rule
      Properties:
        Name: MyLambdaScheduledEvent
        EventBusName: "default"
        State: ENABLED
        ScheduleExpression: rate(5 minutes) # same as cron(0/5 * * * ? *)
        Description: Run MyLambda once every 5 minutes.
        Targets:
        - Id: EventMyLambdaScheduled
          Arn: !Ref MyLambda
    MyLambdaScheduledEventPermission:
      Type: AWS::Lambda::Permission
      Properties:
        Action: lambda:InvokeFunction
        Principal: events.amazonaws.com
        FunctionName: !Ref MyLambda
        SourceArn: !GetAtt MyLambdaScheduledEvent.Arn
    

    【讨论】:

      【解决方案7】:

      对于在 Fargate 上设置计划任务并使用 Terraform 设置云的人来说,请查看此模块。 https://github.com/dxw/terraform-aws-ecs-scheduled-task

      它有助于通过 CloudEvents 设置计划任务并设置正确的 IAM 角色。

      【讨论】:

      • 谢谢。正如 Jonny Cundall 的回答所说,具有“iam:PassRole”操作的角色应该用于 CloudWatchEvent 服务。
      【解决方案8】:

      我花了很长时间尝试解决此问题,当通过命令行创建 ECS 计划任务时,该任务已创建但从未启动。 感谢这篇文章,我通过查看 CloudTrail 中的 EventHistory 发现 ECS 实例已全部死亡,并且没有 EC2 实例在运行!

      {
         [..]
       "errorCode": "InvalidParameterException",
       "errorMessage": "No Container Instances were found in your cluster.",
         [..]
      }
      

      【讨论】:

        【解决方案9】:

        对我来说——我的目标是一个 SQS FIFO 队列。它变得很明显 - 在没有 FIFO 的情况下重新创建队列之后一切正常。

        所以根本原因是没有启用内容重复数据删除。 (在启用队列时 - 我不需要它。亚马逊 - 请帮助 EventBridge 跟踪这些失败的调用

        同时 - 我向更新的文档提交了 PR https://github.com/awsdocs/amazon-cloudwatch-events-user-guide/pull/14

        【讨论】:

          猜你喜欢
          • 2018-09-12
          • 2020-02-07
          • 2019-03-25
          • 2019-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-08
          • 1970-01-01
          相关资源
          最近更新 更多