适用于 JavaScript CloudWatch Logs 的 AWS 开发工具包 - GetLogEventsCommand 未获取日志,可能是由于日志流大小问题?

问题描述 投票:0回答:1

我通过 AWS Elastic Beanstalk 在 Docker 平台上部署了多个 Node.js 应用程序。我可以通过 AWS 控制台轻松手动下载每个环境的完整日志。假设我有两个 AWS Elastic Beanstalk 环境:

env-a
env-b

我已开始在 Node 应用程序中使用适用于 JavaScript 的 AWS 开发工具包,特别是

@aws-sdk/client-cloudwatch-logs
,以便我可以以编程方式获取日志、在自定义 UI 中呈现它们,并根据需要进行自己的分析。

我正在运行以下代码以获取给定应用程序的日志事件(伪代码):

// IMPORTS

const { 
  CloudWatchLogsClient, 
  DescribeLogStreamsCommand,
  GetLogEventsCommand
} = require("@aws-sdk/client-cloudwatch-logs");

// SETUP

const awsCloudWatchClient = new CloudWatchLogsClient({
  region: process.env.AWS_REGION,
});

// APPLICATION CODE

const logGroupName = getLogGroupName(); 

// Get the log streams for the given log group. 
const logStreamRes = await awsCloudWatchClient.send(new DescribeLogStreamsCommand({
  descending: true,
  logGroupName,
  orderBy: 'LastEventTime',
  limit: 50,
}))

// For testing purposes, I'll just use the first log stream name I find. 
const logStreamName = logStreamRes.logStreams[0].logStreamName;

// Get the log events for the first log stream. 
const logEventRes = await awsCloudWatchClient.send(new GetLogEventsCommand({
  logGroupName,
  logStreamName,
}));

const logEvents = logEventRes.events; 

现在,我可以使用此代码毫无问题地获取

env-a
的日志事件。但是,当我尝试获取
GetLogEventsCommand
的日志时,env-b
always
返回一个空集合。如果我通过 AWS 控制台手动下载日志,我绝对可以看到日志存在 - 但由于我尚不清楚的原因,AWS SDK 似乎无法识别这一点。

这里有一些有趣的细节,可能有助于诊断问题。

env-a
在 Elastic Beanstalk 中配置,以便每个新部署(一天可能发生多次)都会替换 EC2 实例。另一方面,配置
env-b
以便将新应用程序代码部署到现有 EC2 实例,而无需实际替换它们。由于日志流映射到 EC2 实例,因此
env-a has a high number of pretty small log streams whereas 
env-b` 为其每个长期存在的 EC2 实例提供了三个非常大的日志流。日志的大小很容易>1 MB。

考虑到

GetLogEventsCommand
返回大小最大为 1 MB 的响应,我是否达到了某个大小限制,并且 AWS 开发工具包通过为
env-b
返回 0 个日志事件来处理它?我尝试在上面的
limit
上设置
GetLogEventsCommand
,但仍然导致 AWS 开发工具包为
env-a
返回 0 个事件。

另一个有趣的注意事项:如果我转到 Amazon CloudWatch > 日志组并选择

env-a
的日志组,我可以毫无问题地查看每个日志流的日志事件。如果我尝试查看
env-b
的三个非常大的日志流的日志事件,我会在控制台上遇到“速率超出”错误。这似乎证实日志流的事件计数对于 AWS 控制台和 AWS SDK 来说太大而无法处理,尽管我不确定。

我可以做些什么来让 AWS SDK 获取

env-b
的日志吗?我如何进一步确认日志流大小过大是罪魁祸首?如果是这样的话,我能做些什么吗?清除日志?

或者这可能是我没有看到的其他问题?

amazon-web-services aws-sdk amazon-cloudwatchlogs
1个回答
0
投票

问题的另一个潜在原因可能是 IAM 权限。环境是否作为不同的 IAM 角色运行?理想情况下,您的日志仅允许各种开发人员和 beanstalk 帐户访问。两个环境的日志组需要显式允许另一个环境的 IAM 角色。

我怀疑由于您得到的是一个空列表(表面上找到了日志组,但不是流),这不是问题,但觉得值得一提。

© www.soinside.com 2019 - 2024. All rights reserved.