如何使用 CDK 删除 CDK 销毁上的 lambda 函数日志组?

How to delete lambda function log group on CDK destroy using CDK?

目前,我正在尝试从 AWS CDK 创建的 lambda 函数中删除一个日志组

这是我的堆栈目前的样子:

from aws_cdk import (
    core,
    aws_lambda
)
from aws_cdk.aws_logs import CfnLogGroup, LogGroup
from datetime import datetime
f = """
import json
from datetime import datetime

def handler(event, context):
    print(f'test {datetime.now()}')
    return {
        'statusCode': 200,
        'body': json.dumps(f'test {datetime.now()}')
    }
"""

class CdktestStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        fn = aws_lambda.Function(self, f"AndyTest-{datetime.now()}",
            runtime=aws_lambda.Runtime.PYTHON_3_8,
            handler="index.handler",
            code=aws_lambda.InlineCode(f)
        )

        lg = LogGroup.from_log_group_name(self, f"lambda_log_group-{datetime.now()}", fn.log_group.log_group_name)
        lg.apply_removal_policy(core.RemovalPolicy.DESTROY)

默认情况下,lambda 日志组在 CDK 销毁完成后保留。

我尝试过使用LogGroups管理日志来管理日志组。

我已经看到这个 用于销毁日志组,但它不会像这一行:

lg = LogGroup.from_log_group_name(self, f"lambda_log_group-{datetime.now()}", fn.log_group.log_group_name)

returns 一个 ILogGroup 并在我尝试调用

时抛出此错误
lg.apply_removal_policy(core.RemovalPolicy.DESTROY)

出现此错误:

jsii.errors.JSIIError: Cannot apply RemovalPolicy: no child or not a CfnResource. Apply the removal policy on the CfnResource directly.

我的objective是用CDK来管理日志组,不用boto3就可以在销毁时删除资源。

下面的代码通过基于名称单独创建日志组而不是从名称加载它来正常工作。具体实现见下:

from aws_cdk import core, aws_lambda
from aws_cdk.aws_logs import CfnLogGroup, LogGroup, RetentionDays
from datetime import datetime

f = """
import json
from datetime import datetime

def handler(event, context):
    print(f'test {datetime.now()}')
    return {
        'statusCode': 200,
        'body': json.dumps(f'test {datetime.now()}')
    }
"""


class CdktestStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        fn = aws_lambda.Function(
            self,
            f"AndyTest-{datetime.now()}",
            runtime=aws_lambda.Runtime.PYTHON_3_8,
            handler="index.handler",
            code=aws_lambda.InlineCode(f),
        )

        LogGroup(
            self,
            f"lambda_log_group-{datetime.now()}",
            log_group_name=f"/aws/lambda/{fn.function_name}",
            removal_policy=core.RemovalPolicy.DESTROY,
            retention=RetentionDays.ONE_DAY,
        )

请注意,如果您使用 log_retention 属性,它会创建自定义资源以自动为您生成关联的日志组。所以上面的工作正常。