Обновить существующую группу журналов с помощью CloudFormation - PullRequest
0 голосов
/ 13 марта 2019

У меня есть лямбда, в которой есть группа журналов, скажем, LG-1, для которой для срока хранения задано значение Никогда не истекает (по умолчанию). Мне нужно изменить это никогда не истекает до 1 месяца. Я делаю это с помощью CloudFormation. Поскольку группа журналов уже существует, когда я пытаюсь снова развернуть свою лямбду с изменениями в шаблоне как:

LambdaFunctionLogGroup:
Type: 'AWS::Logs::LogGroup'
DependsOn: MyLambda
Properties:
  RetentionInDays: 30
  LogGroupName: !Join 
    - ''
    - - /aws/lambda/
      - !Ref MyLambda

обновление завершается с ошибкой:

[LogGroup Name] уже существует.

Одно из возможных решений - удалить группу журналов, а затем снова создать ее с новыми изменениями, как показано выше, что прекрасно работает.

Но мне нужно сделать это без удаления группы журналов, так как это приведет к удалению всех предыдущих журналов, которые у меня есть.

Есть ли какое-нибудь решение, которое возможно?

Ответы [ 2 ]

3 голосов
/ 13 марта 2019

Я думаю, что невозможно манипулировать ресурсами из CF, которые уже существуют вне стека.

Один из обходных путей - изменить имя лямбды, например my-lambda-v2, чтобы сохранить старую группу журналов вместе с новой.

Через месяц вы можете удалить старый.

1 голос
/ 14 марта 2019

Используйте настраиваемый ресурс лямбда в вашем облаке. Пользовательский ресурс будет запущен автоматически с первого раза и обновит политику хранения существующей группы журналов. Если вам это нужно, вы можете каждый раз запускать свой собственный лямбда-ресурс, а затем использовать шаблонизатор, такой как jinja2.

import boto3

client = boto3.client('logs')
response = client.put_retention_policy(
    logGroupName='string',
    retentionInDays=123
)

Вы можете в основном заставить свой шаблон CF делать (почти) все, что вы хотите, используя Custom Resource

Дополнительная информация (Boto3, вы можете найти соответствующий SDK для языка, который вы используете) - https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/logs.html#CloudWatchLogs.Client.put_retention_policy

РЕДАКТИРОВАТЬ: В шаблоне CloudFormation это будет выглядеть примерно так:

  LogRetentionSetFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: src
      Handler: set_retention_period.handler
      Role: !GetAtt LambdaRole.Arn
      DeploymentPreference:
        Type: AllAtOnce

  PermissionForLogRetentionSetup:
    Type: AWS::Lambda::Permission
    Properties:
      Action: lambda:invokeFunction
      FunctionName:
        Fn::GetAtt: [ LogRetentionSetFunction, Arn ]
      Principal: lambda.amazonaws.com

  InvokeLambdaFunctionToSetLogRetention:
    DependsOn: [PermissionForLogRetentionSetup]
    Type: Custom::SetLogRetention
    Properties:
      ServiceToken: !GetAtt LogRetentionSetFunction.Arn
      StackName: !Ref AWS::StackName
      AnyVariable: "Choose whatever you want to send"     
      Tags:
        'owner': !Ref owner
        'task': !Ref task

Лямбда-функция будет иметь код, который устанавливает сохранение журнала в соответствии с кодом, который я уже указывал ранее.

Для получения дополнительной информации, пожалуйста, Google "пользовательский ресурс лямбда с поддержкой". Также, чтобы вы начали, я добавил чернила ниже: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

...