artykułyawsmonitoring

Ustawianie retencji logów w Amazon CloudWatch

Brak komentarzy

Ustawienie retencji logów w Amazon CloudWatch może zapobiec przechowywaniu niepotrzebnych logów przez długi czas i obniżyć koszty tej usługi. Z artykułu dowiesz się jak to zrobić dla zasobów AWS LambdaAmazon ECS. W tym celu posłużymy się stackami stworzonych za pomocą AWS CloudFormation lub AWS SAM.

Nowy stack CloudFormation/SAM

W nowym stacku AWS CloudFormation lub AWS SAM powinniśmy od początku stworzyć i skonfigurować odpowiedni zasób LogGroup odpowiadający za grupowanie logów konkretnego komponentu. Powinniśmy to zrobić w nieco inny sposób dla każdego typu zasobu AWS.

CloudWatch logs w AWS Lambda

AWS Lambda nie ma możliwości jawnego skonfigurowania zasobu LogGroup. Zamiast tego musimy zastosować małą sztuczkę. Nie możemy określić niestandardowej grupy logów dołączonej do AWS Lambda, ale możemy wykorzystać fakt, że AWS Lambda tworzy grupę o z góry znanej nazwie. Nazwa takiej grupy zawsze wygląda w taki sposób: /aws/lambda/<twoja-nazwa-funkcji-aws-lambda>. Posadając taką wiedzę, możemy stworzyć grupę logów zanim funkcja AWS Lambda stworzy ją w pierwszym wywołaniu. W tym celu należy zdefiniować nowy zasób w szablonie SAM w ten sposób:

Resources:
  ...
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: "/aws/lambda/<your-lambda-function-name>"
      RetentionInDays: <retention-in-days>

Warto również stworzyć zależność między funkcją AWS Lambda a grupą logów, aby zapobiec przedwczesnemu tworzeniu funkcji AWS Lambda:

Resources:
  ...  
  YourLambdaFunction:
    Type: AWS::Serverless::Function
    DependsOn: LogGroup
    ...

O tym, w jaki sposób możesz stworzyć funkcję AWS Lambda od zera dowiesz się w jednym z artkułów:

CloudWatch logs w Amazon ECS

AWS ECS możemy jawnie skonfigurować grupę logów. W tym celu powinniśmy stworzyć zasób LogGroup jak w przykładzie AWS Lambda:

Resources:
  ...
  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: "<your-log-group-name>"
      RetentionInDays: <retention-in-days>

Następnie możemy określić grupę logów w zasobie typu AWS::ECS::TaskDefinition:

  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      ...
      ContainerDefinitions:
        - Name: <service-name>
          LogConfiguration:
            LogDriver: awslogs
            Options:
              awslogs-group: !Ref LogGroup
              awslogs-region: !Ref AWS::Region
              awslogs-stream-prefix: ecs

Istniejący stack CloudFormation/SAM

W celu konfiguracji retencji w istniejącym stacku CloudFormation/SAM, powinniśmy najpierw zaimportować istniejącą grupę logów do interesującego nas stacka.

AWS CloudFormation

Korzystając z CloudFormation powinniśmy zdefiniować podstawowy zasób AWS::Logs::LogGroup w szablonie stacka, do którego chcemy zaimportować grupę logów:

Resources:
  ...
  LogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: "<your-log-group-name>"

Ważną właściwością jest tutaj DeletionPolicy. Zdefiniowanie jej jest niezbędne wykonania operacji importu. Za pomocą tak zmodyfikowanego szablonu jesteśmy w stanie wykonać import CloudFormation poprzez AWS CLI lub AWS Management Console. Po udanej operacji powinniśmy zmienić grupę logującą w celu wprowadzenia okresu retencji i zaktualizować stack.

Resources:
  ...
  LogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: "<your-log-group-name>"
      RetentionInDays: <retention-in-days>

AWS SAM

Nie ma możliwości importowania zasobów AWS za pomocą szablonu AWS SAM. Zamiast tego, musimy skorzystać z przetworzonego szablonu w AWS CloudFormation. Powinniśmy pobrać przetworzony szablon stacka CloudFormation, w którym chcemy dokonać zmian:

W pobranym szablonie powinniśmy dokonać zmian podobnych do tych ze scenariusza CloudFormation. Warto zauważyć, że tym razem musimy zmodyfikować plik JSON, zamiast YAML.

{
  ...  
  "Resources": {
    ...
	"LogGroup": {
	  "Type": "AWS::Logs::LogGroup",
	  "DeletionPolicy": "Retain",
          "Properties": {
            "LogGroupName": "<your-log-group-name>"
          }
        }
  }
}

Po dokonaniu importu szablonu w formacie JSON, powinniśmy dodać ten sam wpis w szablonie SAM i rozszerzyć grupę logującą o ustawienia retencji:

Resources:
  ...
  LogGroup:
    Type: AWS::Logs::LogGroup
    DeletionPolicy: Retain
    Properties:
      LogGroupName: "<your-log-group-name>"
      RetentionInDays: <retention-in-days>

Tags: , ,

Powiązane artykuły

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Wypełnij to pole
Wypełnij to pole
Proszę wprowadzić prawidłowy adres e-mail.
You need to agree with the terms to proceed

Menu