将 CloudWatch 日志发送到数据库

Send CloudWatch logs to database

我正在尝试将我们的 Cloudwatch 日志保存在内部部署的 Postgres 数据库中。我目前正在将日志导出到 S3 并保存在 DynamoDB 中。我现在的要求是使用节点和 AWS js-SDK 将它保存在我们的数据库中。我对 node 和 js-SDK 不是很了解,所以我会非常感谢任何想法。

我尝试了一个简单的实现。

const pools = require('../src/common/db'),
const AWS = require('aws-sdk');

// set the cwl
let cwl = new AWS.CloudWatchLogs({
  region: 'us-east-1',
  accessKeyId: 'ABCD1234',
  secretAccessKey: 'MNBV76543',
  Bucket: 'My_bucket'
});

// Get the events
cwl.getLogEvents({
  logGroupName: 'OurLogGroupname',
  logStreamName: 'specifiedLogstream'
}, (error, success ) =>{
  if(error){
    console.log(error)
  }
  console.log(success)
})

// Try saving to db
let sql = ''
pools.query_db('abc', 'INSERT INTO logging.aws_logs(request_id, duration, billed_duration) VALUES (?,?,?)', function(err, res){
  if(err) return callback(err);
  callback();
})

如果您真的想将来自 Cloudwatch 的所有消息存储到数据库中,我更喜欢以下方式:

  • 向您的 Cloudwatch 日志组添加订阅

  • 此订阅可以配置为触发 Lambda

  • Lambda 将具有以下逻辑:

    1. 从事件变量中提取消息
    2. 准备您的 SQL 声明
    3. 连接到数据库(如果不可能重试)
    4. 执行 SQL 语句(如果不可能重试)
    5. 完成

关于如何提取 Cloudwatch 订阅调用消息的一个很好的例子是将这些日志发送到 Opensearch(搜索蓝图)