问题描述
我正在通过引用墨水 https://www.serverless.com/framework/docs/providers/aws/guide/serverless.yml/
创建一个 lambda 函数lambda 被创建,在堆栈中我没有看到任何日志组。如果我调用 lambda,会自动创建一个日志组,并将日志写入日志组内的流。
我有两个问题。
- 如何确保如果堆栈被删除,日志组不会被删除。即使堆栈被删除,我也希望将日志组与流一起保留。
- 如何标记日志组?我在 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