跳至内容

如何对在 CloudWatch 中按照订阅筛选器传输日志失败的问题进行故障排除?

3 分钟阅读
0

我想对在 Amazon CloudWatch 中按照订阅筛选器传输日志失败的问题进行故障排除。

简短描述

当您开始流式传输时,请检查 CloudWatch Logs 指标以确保筛选模式正确且与传入的日志事件一致。以下是故障排除时需要查看的最常见指标:

  • **ForwardedBytes:**转发到订阅目标的日志事件量(以压缩字节为单位)。
  • **ForwardedLogEvents:**转发到订阅目标的日志事件的数量。
  • **DeliveryErrors:**CloudWatch Logs 在将数据转发到订阅目标时收到错误的日志事件的数量。
  • **DeliveryThrottling:**表明 CloudWatch Logs 在将数据转发到订阅目标时受到限制的日志事件的数量。

**注意:**如果目标服务收到可重试的错误,例如限制或服务错误,则 CloudWatch Logs 会尝试发送 24 小时的数据。如果错误无法重试,例如 AccessDeniedResourceNotFound 错误,则 CloudWatch Logs 不会尝试进一步传输。

解决方法

根据您使用的目标服务,对按照订阅筛选器传输日志失败的问题进行故障排除。

Amazon Kinesis Data Streams

要解决按照订阅筛选器向 Amazon Kinesis Data Streams 传输日志失败的问题,请完成以下任务:

  • 检查您的 Kinesis 数据流是否处于活动状态。要查看状态,请使用 Kinesis 控制台DescribeStream API 调用。

  • 检查 CloudWatch 日志组和 Kinesis 数据流是否在同一 AWS 区域中。

  • 检查与订阅筛选器关联的 AWS Identity and Access Management (IAM) 角色。确保 CloudWatch Logs 具有必要的权限,可以将数据存入您的数据流。以下是角色权限策略示例:
    **注意:**将 example-region 替换为您的区域,将 example-account-id 替换为您的 AWS 账户 ID,将 example-stream-name 替换为您的数据流名称。

    {  
      "Statement": [{  
        "Effect": "Allow",  
        "Action": "kinesis:PutRecord",  
        "Resource": "arn:aws:kinesis:example-region:example-account-id:stream/example-stream-name"  
      }]  
    }
  • 检查 IAM 角色是否配置了相应的信任策略。以下是信任策略示例:
    **注意:**将 example-region 替换为您的区域,将 example-account-id 替换为您的账户 ID。

    {  
      "Statement": {  
        "Effect": "Allow",  
        "Principal": {  
          "Service": "logs.region.amazonaws.com"  
        },  
        "Action": "sts:AssumeRole",  
        "Condition": {  
          "StringLike": {  
            "aws:SourceArn": "arn:aws:logs:example-region:example-account-id:*"  
          }  
        }  
      }  
    }
  • 如果您有专用 Kinesis 数据流,请检查数据流指标以确认其正常运行。有关详细信息,请参阅使用 Amazon CloudWatch 监控 Amazon Kinesis Data Streams 服务

  • 如果您遇到跨账户日志记录问题,请参阅如何对 CloudWatch 中的跨账户日志记录问题进行故障排除?

Amazon Data Firehose

要解决按照订阅筛选器向 Amazon Data Firehose 传输日志失败的问题,请完成以下任务:

  • 检查您的 Firehose 流是否处于活动状态。要查看状态,请使用 Kinesis 控制台DescribeDeliveryStream API 调用。如果您使用数据转换功能,请确保指定的 AWS Lambda 函数存在。

  • 检查 Firehose 指标,以确认数据正在流入 Firehose。检查 IncomingBytesIncomingRecordsDataReadFromKinesisStream.BytesDataReadFromKinesisStream.Records 等指标。

  • 如果 Firehose 未接收数据,请检查 API 级别 CloudWatch 指标。问题可能源于上游。诸如 PutRecordPutRecordBatch 之类的 API 会向 Firehose 发送数据,并且必须正确调用。

  • 检查错误日志,以查看有关传输失败原因的详细信息。确保相关的 IAM 策略包含 logs:PutLogEvents 权限。以下是具有 logs:PutLogEvents 权限的 IAM 策略示例:
    **注意:**将 example-region 替换为您的区域,将 example-account-id 替换为您的账户 ID。

    {  
        "Sid": "",  
        "Effect": "Allow",  
        "Action": [  
            "logs:PutLogEvents"  
        ],  
        "Resource": [  
            "arn:aws:logs:example-region:example-account-id:log-group:/aws/kinesisfirehose/Delivery_Stream:log-stream:*",  
            "arn:aws:logs:example-region:example-account-id:log-group:%FIREHOSE_POLICY_TEMPLATE_PLACEHOLDER%:log-stream:*"  
        ]  
    }
  • 检查与您的 Firehose 流关联的 IAM 角色是否具有允许 CloudWatch Logs 存放数据的相应权限。以下是权限策略示例:
    **注意:**将 example-region 替换为您的区域,将 example-account-id 替换为您的账户 ID,将 example-stream-name 替换为您的数据流名称。

    {  
      "Statement": [{  
        "Effect": "Allow",  
        "Action": "firehose:PutRecord",  
        "Resource": "arn:aws:firehose:example-region:example-account-id:deliverystream/example-stream-name"  
      }]  
    }
  • 检查 IAM 角色是否配置了相应的信任策略。以下是信任策略示例:
    **注意:**将 example-region 替换为您的区域,将 example-account-id 替换为您的账户 ID。

    {  
      "Statement": {  
        "Effect": "Allow",  
        "Principal": { "Service": "logs.amazonaws.com" },  
        "Action": "sts:AssumeRole",  
        "Condition": {   
             "StringLike": {   
                 "aws:SourceArn": "arn:aws:example-region:example-account-id:*"  
             }   
         }  
      }  
    }
  • 如果您遇到跨账户日志记录问题,请参阅如何对 CloudWatch 中的跨账户日志记录问题进行故障排除?

  • 有关与不同目标相关的问题,请参阅 Amazon Data Firehose 故障排除

Lambda

要解决按照订阅筛选器向 Lambda 传输日志失败的问题,请完成以下任务:

  • 检查 Lambda 函数是否具有所需的基于资源的策略,以授予 CloudWatch Logs 运行您的函数的权限。以下是策略声明示例:
    **注意:**将 example-regionexample-account-idexample-lambda-functionexample-log-name 替换为您的区域、账户 ID、Lambda 函数和日志名称。

    "Statement": [  
        {  
          "Sid": "",  
          "Effect": "Allow",  
          "Principal": {  
            "Service": "logs.amazonaws.com"  
          },  
          "Action": "lambda:InvokeFunction",  
          "Resource": "arn:aws:lambda:example-region:example-account-id:function:example-lambda-function",  
          "Condition": {  
            "StringEquals": {  
              "AWS:SourceAccount": "example-account-id"  
            },  
            "ArnLike": {  
              "AWS:SourceArn": "arn:aws:logs:example-region:example-account-id:log-group:example-log-name:*"  
            }  
          }  
        }  
      ]
  • 使用以下角色策略检查 Lambda 函数的 IAM 角色是否与 lambda.amazonaws.com 存在信任关系:

    "Statement": [  
        {  
            "Effect": "Allow",  
            "Principal": {  
            "Service": "lambda.amazonaws.com"  
            },  
            "Action": "sts:AssumeRole"  
        }  
    ]

OpenSearch Service

要解决按照订阅筛选器向 Amazon OpenSearch Service 传输日志失败的问题,请完成以下任务:

相关信息

如何使用 CloudWatch 控制台创建、配置 Kinesis 订阅筛选器并对其进行故障排除?

如何对 Amazon Data Firehose 和 Amazon S3 之间的数据传输故障进行故障排除?

如何配置 CloudWatch 订阅筛选器以调用我的 Lambda 函数?