在 Lambda 上 运行 时 Winston CloudWatch Transport 不创建日志
Winston CloudWatch Transport not Creating Logs When Running on Lambda
我有一个从 AWS Lambda 函数中设置为 运行 的 expressjs 应用程序。当我将此应用程序部署到 lambda 时,lambda cloudwatch 日志的控制台日志会显示(即 /aws/lambda/lambda-name),但它不会创建配置中指定的新 CloudWatch LogGroup。
如果我 运行 在本地运行 lambda 函数并生成日志,它将为本地环境创建一个 CloudWatch 日志组。
Lambda 函数正在连接到 RDS 实例,因此它们包含在 VPC 中。
已为 Lambda 分配 CloudWatchFullAccess 策略,因此它不应是权限错误。
我查看了 Lambda 日志,没有发现任何与此相关的错误。
const env = process.env.NODE_ENV || 'local'
const config = require('../../config/env.json')[env]
const winston = require('winston')
const WinstonCloudwatch = require('winston-cloudwatch')
const crypto = require('crypto')
let startTime = new Date().toISOString()
const logger = winston.createLogger({
exitOnError: false,
level: 'info',
transports: [
new winston.transports.Console({
json: true,
colorize: true,
level: 'info'
}),
new WinstonCloudwatch({
awsAccessKeyId: config.aws.accessKeyId,
awsSecretKey: config.aws.secretAccessKey,
logGroupName: 'my-api-' + env,
logStreamName: function () {
// Spread log streams across dates as the server stays up
let date = new Date().toISOString().split('T')[0]
return 'my-requests-' + date + '-' +
crypto.createHash('md5')
.update(startTime)
.digest('hex')
},
awsRegion: 'us-east-1',
jsonMessage: true
})
]
})
const winstonStream = {
write: (message, encoding) => {
// use the 'info' log level so the output will be picked up by both transports
logger.info(message)
}
}
module.exports.logger = logger
module.exports.winstonStream = winstonStream
然后在我的 Express 应用程序中。
const morgan = require('morgan')
const { winstonStream } = require('./providers/loggers')
app.use(morgan('combined', { stream: winstonStream }
确认问题与 VPC 中的 lambda 函数有关,并且未授予 public 通过子网、路由表、NAT 和互联网网关访问互联网的权限,如本 post 中所述. https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7
我相信要访问外部互联网服务,您需要您所描述的内容。
但是要访问 VPC 外部的 AWS 服务,您可以创建一个 VPC 端点。
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html
我有一个从 AWS Lambda 函数中设置为 运行 的 expressjs 应用程序。当我将此应用程序部署到 lambda 时,lambda cloudwatch 日志的控制台日志会显示(即 /aws/lambda/lambda-name),但它不会创建配置中指定的新 CloudWatch LogGroup。
如果我 运行 在本地运行 lambda 函数并生成日志,它将为本地环境创建一个 CloudWatch 日志组。
Lambda 函数正在连接到 RDS 实例,因此它们包含在 VPC 中。
已为 Lambda 分配 CloudWatchFullAccess 策略,因此它不应是权限错误。
我查看了 Lambda 日志,没有发现任何与此相关的错误。
const env = process.env.NODE_ENV || 'local'
const config = require('../../config/env.json')[env]
const winston = require('winston')
const WinstonCloudwatch = require('winston-cloudwatch')
const crypto = require('crypto')
let startTime = new Date().toISOString()
const logger = winston.createLogger({
exitOnError: false,
level: 'info',
transports: [
new winston.transports.Console({
json: true,
colorize: true,
level: 'info'
}),
new WinstonCloudwatch({
awsAccessKeyId: config.aws.accessKeyId,
awsSecretKey: config.aws.secretAccessKey,
logGroupName: 'my-api-' + env,
logStreamName: function () {
// Spread log streams across dates as the server stays up
let date = new Date().toISOString().split('T')[0]
return 'my-requests-' + date + '-' +
crypto.createHash('md5')
.update(startTime)
.digest('hex')
},
awsRegion: 'us-east-1',
jsonMessage: true
})
]
})
const winstonStream = {
write: (message, encoding) => {
// use the 'info' log level so the output will be picked up by both transports
logger.info(message)
}
}
module.exports.logger = logger
module.exports.winstonStream = winstonStream
然后在我的 Express 应用程序中。
const morgan = require('morgan')
const { winstonStream } = require('./providers/loggers')
app.use(morgan('combined', { stream: winstonStream }
确认问题与 VPC 中的 lambda 函数有关,并且未授予 public 通过子网、路由表、NAT 和互联网网关访问互联网的权限,如本 post 中所述. https://gist.github.com/reggi/dc5f2620b7b4f515e68e46255ac042a7
我相信要访问外部互联网服务,您需要您所描述的内容。 但是要访问 VPC 外部的 AWS 服务,您可以创建一个 VPC 端点。
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html