如何排查 CloudWatch Logs 的问题,使其能够流式传输至我的 Amazon ES 域?

上次更新时间:2020 年 6 月 11 日

我无法将我的 Amazon CloudWatch Logs 流式传输至我的 Amazon Elasticsearch Service (Amazon ES) 域。如何解决此问题?

解决方法

我无法将多个 CloudWatch 日志组流式传输至相同的 Amazon ES 域

在默认情况下,CloudWatch 只会为每个 Amazon ES 域创建一个 AWS Lambda 函数。如果您设置多个日志组以通过编列索引将数据传输到单个 Amazon ES 域,全部多个日志组均会调用相同的 Lambda 函数。当第一个日志组调用 Lambda 函数时,调用将会在 Amazon ES 域创建一个索引和一个类型字段。

针对 Elasticsearch 版本 6.0 或更高版本,您只可以拥有一个映射类型。相同的规则也适用于 Elasticsearch 版本 5.x 至 6.x。如需关于 Elasticsearch 映射类型的更多信息,见 Elasticsearch 上的 What are mapping types?

若其他日志组尝试调用相同的 Lambda 函数,调用将会失败,并显示以下错误消息:

"reason": "Rejecting mapping update to [<index_name>] as the final mapping would have more than 1 type: [log-group-1, log-group-2]”

要解决此问题,使用以下语法更新您的 AWS Lambda 函数:

       var indexName = [
        'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),
        ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),
        ('0' + timestamp.getUTCDate()).slice(-2) 
        ].join('.');

此语法会为流式传输至您的 Amazon ES 域的不同日志组创建多个索引。然后,保存更新后的 Lambda 函数,以便为流式传输至您的 Amazon ES 域的多个日志组创建独立的索引。

我无法在相同的 AWS 账户里流式传输至基于 VPC 的 Amazon ES 域

重要提示:在将 CloudWatch 日志组流式传输至您的基于 VPC 的 Amazon ES 域之前,确保更新您的 AWS Identity and Access Management (IAM) 角色策略。附加到对应 Lambda 函数的 IAM 角色必须附加有 AWSLambdaVPCAccessExecutionRole 策略。

以下是采用 JSON 格式的 AWSLambdaVPCAccessExecutionRole 策略:

    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
        }
    ]
}

注意:此托管策略使 Lambda 函数能够将 CloudWatch 日志组写入到 VPC 中的 Elasticsearch 集群。

在您为 Lambda 函数附加策略以后,开始将日志流式传输至您在 VPC 中的 Amazon ES 域。

当启用精细访问控制时,我无法将我的 CloudWatch 日志组流式传输至 Amazon ES 域

在通过精细访问控制将您的 CloudWatch Logs 流式传输至 Amazon ES 域时,您可能会遇到以下权限错误:

"{\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"},\"status\":403}}"

注意:在默认的情况下,Amazon ES 会为您创建一个 Lambda 函数。

如果您从 Lambda 函数日志收到此错误消息,则表示该角色映射不完整。如需关于角色映射的更多信息,见将角色映射到用户

要解决此错误消息,执行以下步骤:

1.    打开 Kibana。您可以在您的 Amazon ES 控制台的域摘要中找到 Kibana 的链接。

2.    在左侧导航窗格中,单击锁定图标。

3.    选择角色映射

4.    选择 all_accesssecurity_manager 作为您的角色。

5.    为 all_access 编辑映射。

6.    对于后端角色,添加 Lambda 函数的执行角色并选择提交。您的日志现在应流式传输至您的 Amazon ES 域。

我遇到 cluster_block_exception 错误

集群块异常由以下原因导致:

  • 可用存储空间不足
  • JVM 内存压力过高

如需关于排查集群块异常问题的更多信息,见 ClusterBlockException


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?