New user sign up using AWS Builder ID
New user sign up using AWS Builder ID is currently unavailable on re:Post. To sign up, please use the AWS Management Console instead.
如何对 CloudWatch 日志进行故障排除,使其可以流式传输到我的 OpenSearch Service 域?
我无法将我的 Amazon CloudWatch 日志流式传输到我的 Amazon OpenSearch Service 域。
解决方法
我无法将多个 CloudWatch 日志组流式传输到同一 OpenSearch Service 域
默认情况下,Amazon CloudWatch 仅为每个 OpenSearch Service 域创建一个 AWS Lambda 函数。如果您设置了多个日志组以将数据索引到您的域中,则所有多个日志组均会调用同一个 Lambda 函数。当第一个日志组调用 Lambda 函数时,此调用会在您的域中创建一个索引和一个类型字段。
在 OpenSearch Service 6.0.0 或更高版本中创建的索引只能包含单一映射类型。在 5.x 版本中创建的具有多种映射类型的索引可在 OpenSearch Service 6.x 版本中继续运行。有关弃用 OpenSearch Service 映射类型的更多信息,请参阅 Elastic 网站上的移除映射类型。
当其他日志组尝试调用相同的 Lambda 函数时,会出现调用失败的情况并显示以下错误:
"reason": "Rejecting mapping update to [<index_name>] as the final mapping would have more than 1 type: [log-group-1, log-group-2]”
要解决此问题,请先使用以下语法更新您的 Lambda 函数:
var indexName = [ 'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(), ('0' + (timestamp.getUTCMonth() + 1)).slice(-2), ('0' + timestamp.getUTCDate()).slice(-2) ].join('.');
此语法为流式传输到您的 OpenSearch Service 域的各个日志组创建多个索引。
保存更新后的 Lambda 函数,即可为流式传输到您的域的多个日志组创建单独的索引。
我无法在同一 AWS 账户中流式传输到基于 VPC 的 OpenSearch Service 域
**重要信息:**在将 CloudWatch 日志组流式传输到基于虚拟私有云(VPC)的 OpenSearch Service 域之前,请更新您的 AWS Identity and Access Management(AWS 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 中的集群。
将策略附加到 Lambda 函数后,即可开始将日志流式传输到 VPC 中的 OpenSearch Service 域。
启用细粒度访问控制后,我无法将我的 CloudWatch 日志组流式传输到 OpenSearch Service 域
如果您将 CloudWatch 日志流式传输到具有细粒度访问控制的 OpenSearch Service 域,则可能会出现错误,错误内容类似于:
"{\"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_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_opensearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_opensearch_execution], requestedTenant=null]\"},\"status\":403}}"
如果您从 Lambda 函数日志收到此错误消息,则说明角色映射不完整。
**注意:**默认情况下,OpenSearch Service 会为您创建 Lambda 函数。
运行 7.9 及更高版本的 OpenSearch Service 域(包括 OpenSearch 1.x 版本)
要解决此错误消息,请完成以下步骤:
1. 打开 OpenSearch 控制面板。您可以在 OpenSearch Service 控制台的域摘要中找到 OpenSearch 控制面板的链接。
2. 在导航窗格中,选择 Security(安全)。
3. 选择 Roles(角色)。
4. 选择 all_access 角色。
5. 选择 Mapped users(已映射的用户)选项卡。
6. 在 Mapped users(已映射的用户)对话页上,选择 Manage mapping(管理映射)。
7. 在 Backend roles(后端角色)下,输入 Lambda 函数执行角色 ARN。
8. 选择 Map(映射)。现在,您的日志会流式传输到您的 OpenSearch Service 域。
有关角色映射的更多信息,请参阅将角色映射到用户。
运行 7.8 及更早版本的 OpenSearch Service 域
要解决此错误消息,请完成以下步骤:
1. 打开 OpenSearch 控制面板。您可以在 OpenSearch Service 控制台的域摘要中找到 OpenSearch 控制面板的链接。
2. 在导航窗格上,选择锁状图标。
3. 选择 Role mappings(角色映射)。
4. 选择 all_access 和 security_manager 作为您的角色。
**注意:**all_access 角色仅提供对您的集群的访问权限。根据您的用例,您还可以为集群添加细粒度访问控制。
5. 编辑 all_access 的映射。
6. 对于 Backend Role(后端角色),添加 Lambda 函数的执行角色并选择 Submit(提交)。现在,您的日志会流式传输到您的 OpenSearch Service 域。
我的 CloudWatch 日志没有传输到我的 OpenSearch Service 域
使用默认 Lambda 函数将 CloudWatch 日志流式传输到 OpenSearch Service 域时,可能会遇到以下错误:
"errorMessage": "{\"statusCode\":200,\"responseBody\":{\"took\":42,\"errors\":true}}","
**注意:**默认情况下,Lambda 错误以 200 OK 响应的形式返回。
要解决此错误,请完成以下步骤:
1. 打开默认的 Lambda 函数。
2. 找到以下代码行:
"var logFailedResponses = false;"
3. 将 var logFailedResponses 值更新为 true。此更新为使用 Lambda 函数的任何新索引请求提供了额外信息。您可以使用这些额外信息来确定索引出现问题的原因。
我遇到了 cluster_block_exception 错误
可用存储空间不足或 JVM 内存压力过大会导致集群块异常。
有关详细信息,请参阅如何解决 Amazon OpenSearch Service 集群上 JVM 内存压力高的问题?
我的 CloudWatch 订阅筛选器无法通过默认 Lambda 函数(OpenSearch Service 2.0 及更高版本)向我的集群发送数据
如果您有 CloudWatch 订阅筛选器使用默认 Lambda 函数将日志发送到 OpenSearch Service 2.x 版本,那么可能会出现错误。如果订阅筛选器无法提取日志,并出现以下错误,则说明已停用的参数导致了错误:
"{\"statusCode\":400,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"}],\"type\":\"illegal_argument_exception\",\"reason\":\"Action/metadata line [1] contains an unknown parameter [_type]\"},\"status\":400}}"
在 OpenSearch Service 版本 2.0 及更高版本中,_type 参数已从 API 端点中删除。要解决此错误,您还必须从 Lambda 函数代码中删除此参数。
1. 打开 AWS Lambda 控制台。
2. 为您的订阅筛选器选择默认 Lambda 函数。
3. 在 Code source(代码源)下查看您的函数的代码。
4. 找到代码中定义的转换函数。在此函数中,数据被转换为 OpenSearch Service 的 JSON 索引格式。这段代码的第一行内容类似于:
function transform(payload) { if (payload.messageType === 'CONTROL_MESSAGE') { return null; } var bulkRequestBody = ''; payload.logEvents.forEach(function(logEvent) { var timestamp = new Date(1 * logEvent.timestamp);
5. 在转换函数下,找到 \ _type 参数。大多数情况下,该参数在第 79 行。删除或注释掉添加了 _type 参数的代码行。删除后,您的代码将类似于:
var action = { "index": {} }; action.index._index = indexName; //action.index._type = payload.logGroup; action.index._id = logEvent.id; bulkRequestBody += [
现在,您可以成功发送索引请求。

相关内容
- AWS 官方已更新 4 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前