为 lambda 标记无服务器日志组

问题描述

我正在通过引用墨水 https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/

创建一个 lambda 函数

lambda 被创建,在堆栈中我没有看到任何日志组。如果我调用 lambda,会自动创建一个日志组,并将日志写入日志组内的流。

我有两个问题。

  1. 如何确保如果堆栈被删除,日志组不会被删除。即使堆栈被删除,我也希望将日志组与流一起保留。
  2. 如何标记日志组?我在 deploymentBucket 和 provider 中使用了堆栈标签标签。但是,日志组不会被标记

解决方法

如何确保如果堆栈被删除,日志组不会被删除。即使堆栈被删除,我也希望将日志组与流一起保留。

日志组不会被删除,因为您没有在模板中明确定义。

因为它可能在 Lambda Execution Role 中使用此预设策略。

arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

{
    "Version": "2012-10-17","Statement": [
        {
            "Effect": "Allow","Action": [
                "logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"
            ],"Resource": "*"
        }
    ]
}

如何标记日志组?我在 deploymentBucket 和 provider 中使用了堆栈标签和标签。但是,日志组不会被标记。

如果你想标记资源,那么你必须在模板中定义日志组,然后引用相同的。但不幸的是,目前还不支持标记日志组

AWS::Logs::LogGroup tag support #77 在 Cloudformation 中。您可以通过Cloudformation Custom resources

我包含了一个用于标记日志组的示例自定义资源

DeletionPolicy attribute 因为您现在将日志组创建包含在模板中。

Description: "tag log groups"
Parameters:
  LogGroupName:
    Type: "String"
    Description: "Log Groups Name"
    Default: "myloggroup"
Resources:
  myLogGroup: 
  Type: AWS::Logs::LogGroup
  DeletionPolicy: Retain
  Properties:
    LogGroupName: !Ref LogGroupName 
    RetentionInDays: 7
  LogGroupTaggingFunctionRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      ManagedPolicyArns:
        - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
      Policies:
        - PolicyName: TagLogGroupPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - logs:TagLogGroup
                Resource: "*"

  TagLogGroupFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      FunctionName: 'tag log groups'
      Handler: index.lambda_handler
      Runtime: python3.7
      Timeout: 60
      Role: !GetAtt LogGroupTaggingFunctionRole.Arn
      Code:
        ZipFile: |
          import boto3
          import json
          import os
          import cfnresponse
          sts = boto3.client('logs')
          log_group_name = os.environ['LOG_GROUP_NAME']
          def lambda_handler(event,context):
            print('Event:',json.dumps(event))
            request_type = event.get('RequestType','Update').upper()
            if request_type == 'CREATE':
              response = client.tag_log_group(
                logGroupName=log_group_name,tags={
                'Name': 'MyLogGroup'
                }
              )
              cfnresponse.send(event,context,cfnresponse.SUCCESS,{})
              print(json.dumps(response))
            else:
              cfnresponse.send(event,{})
      Environment:
        Variables:
          LOG_GROUP_NAME:
            Ref: LogGroupName

  InvokeLogGroupTaggingLambda:
    Type: AWS::CloudFormation::CustomResource
    Properties:
      ServiceToken: !GetAtt TagLogGroupFunction.Arn