feat: Support Lambda Logging Configuration (#12371)

This commit is contained in:
Max Marze 2024-02-22 15:40:51 -05:00 committed by GitHub
parent 5e604f2e1f
commit 0e465bd23c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 1 deletions

View File

@ -440,7 +440,7 @@ class AwsCompileFunctions {
functionResource.Properties.ReservedConcurrentExecutions = functionObject.reservedConcurrency; functionResource.Properties.ReservedConcurrentExecutions = functionObject.reservedConcurrency;
} }
if (!functionObject.disableLogs) { if (!functionObject.disableLogs && !functionObject?.logs?.logGroup && !this.serverless.service.provider.logs?.lambda?.logGroup) {
functionResource.DependsOn = [this.provider.naming.getLogGroupLogicalId(functionName)].concat( functionResource.DependsOn = [this.provider.naming.getLogGroupLogicalId(functionName)].concat(
functionResource.DependsOn || [] functionResource.DependsOn || []
); );
@ -629,10 +629,30 @@ class AwsCompileFunctions {
} }
} }
if (functionObject.logs || this.serverless.service.provider.logs.lambda) {
const functionLogConfig = functionObject.logs
const providerLogConfig = this.serverless.service.provider.logs.lambda
const applicationLogLevel = functionLogConfig?.applicationLogLevel || providerLogConfig?.applicationLogLevel
const logFormat = functionLogConfig?.logFormat || providerLogConfig?.logFormat
const logGroup = functionLogConfig?.logGroup || providerLogConfig?.logGroup
const systemLogLevel = functionLogConfig?.systemLogLevel || providerLogConfig?.systemLogLevel
const finalizedLogConfiguration = {}
if (applicationLogLevel && logFormat && logFormat === 'JSON') { finalizedLogConfiguration.ApplicationLogLevel = applicationLogLevel }
if (logFormat) { finalizedLogConfiguration.LogFormat = logFormat }
if (logGroup) { finalizedLogConfiguration.LogFormat = logGroup }
if (systemLogLevel && logFormat && logFormat === 'JSON') { finalizedLogConfiguration.SystemLogLevel = systemLogLevel }
if (Object.keys(finalizedLogConfiguration).length > 0) {
functionResource.Properties.LoggingConfig = finalizedLogConfiguration
}
}
this.compileFunctionUrl(functionName); this.compileFunctionUrl(functionName);
this.compileFunctionEventInvokeConfig(functionName); this.compileFunctionEventInvokeConfig(functionName);
} }
compileFunctionUrl(functionName) { compileFunctionUrl(functionName) {
const functionObject = this.serverless.service.getFunction(functionName); const functionObject = this.serverless.service.getFunction(functionName);
const cfTemplate = this.serverless.service.provider.compiledCloudFormationTemplate; const cfTemplate = this.serverless.service.provider.compiledCloudFormationTemplate;

View File

@ -16,6 +16,9 @@ module.exports = {
.filter((functionName) => !this.serverless.service.getFunction(functionName).disableLogs) .filter((functionName) => !this.serverless.service.getFunction(functionName).disableLogs)
.forEach((functionName) => { .forEach((functionName) => {
const functionObject = this.serverless.service.getFunction(functionName); const functionObject = this.serverless.service.getFunction(functionName);
if (functionObject.logs?.logGroup || this.serverless.service.provider.logs?.lambda?.logGroup) {
return
}
const logGroupLogicalId = this.provider.naming.getLogGroupLogicalId(functionName); const logGroupLogicalId = this.provider.naming.getLogGroupLogicalId(functionName);
const newLogGroup = { const newLogGroup = {
[logGroupLogicalId]: { [logGroupLogicalId]: {

View File

@ -715,6 +715,19 @@ class AwsProvider {
3288, 3653, 3288, 3653,
], ],
}, },
awsLambdaLoggingConfiguration: {
type: 'object',
properties: {
applicationLogLevel: {
type: 'string',
enum: ['DEBUG', 'ERROR', 'FATAL', 'INFO', 'TRACE', 'WARN']
},
logFormat: { type: 'string', enum: ['JSON', 'TRACE']},
logGroup: { type: 'string', pattern: '[\\.\\-_/#A-Za-z0-9]+', minLength: 1, maxLength: 512},
systemLogLevel: { type: 'string', enum: ['DEBUG', 'INFO', 'WARN'] }
},
additionalProperties: false,
},
awsLogDataProtectionPolicy: { awsLogDataProtectionPolicy: {
type: 'object', type: 'object',
properties: { properties: {
@ -1163,6 +1176,7 @@ class AwsProvider {
type: 'object', type: 'object',
properties: { properties: {
frameworkLambda: { type: 'boolean' }, frameworkLambda: { type: 'boolean' },
lambda: { $ref: '#/definitions/awsLambdaLoggingConfiguration' },
httpApi: { httpApi: {
anyOf: [ anyOf: [
{ type: 'boolean' }, { type: 'boolean' },
@ -1443,6 +1457,9 @@ class AwsProvider {
logDataProtectionPolicy: { logDataProtectionPolicy: {
$ref: '#/definitions/awsLogDataProtectionPolicy', $ref: '#/definitions/awsLogDataProtectionPolicy',
}, },
logs: {
$ref: '#/definitions/awsLambdaLoggingConfiguration'
},
maximumEventAge: { type: 'integer', minimum: 60, maximum: 21600 }, maximumEventAge: { type: 'integer', minimum: 60, maximum: 21600 },
maximumRetryAttempts: { type: 'integer', minimum: 0, maximum: 2 }, maximumRetryAttempts: { type: 'integer', minimum: 0, maximum: 2 },
memorySize: { $ref: '#/definitions/awsLambdaMemorySize' }, memorySize: { $ref: '#/definitions/awsLambdaMemorySize' },