Cloudwatch failedinvocation 错误没有可用的日志 [关闭]

Posted

技术标签:

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

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

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

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

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

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

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

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

【问题讨论】:

能否请您发布您的模板的相关部分? 【参考方案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*2Lambda_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

【讨论】:

以上是关于Cloudwatch failedinvocation 错误没有可用的日志 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

是否有工具可以使用CloudWatch putMetric API将整个内容从AWS QLDB表发布到Cloudwatch?

由于 heredoc,Cloudwatch 警报创建失败

AWS Cloudwatch get-metric-statistics 命令返回的是指标名称,而不是自定义 cloudwatch 指标的值

为啥 Cloudwatch 停止记录 Sagemaker?

Cloudwatch 将日志记录到 Elastic Search 服务配置

如何使用 cloudformation 模板创建 cloudwatch 事件?