Zmniejszanie kosztów przechowywania logów, za pomocą automatyzacji ustawienia retencji w Amazon CloudWatch

3 czerwca 2022

Zmniejszanie kosztów przechowywania logów, za pomocą automatyzacji ustawienia retencji w Amazon CloudWatch

Domyślnie Amazon CloudWatch Logs przechowuje dane logów przez czas nieokreślony. Trwałość logów z aplikacji i systemów operacyjnych ułatwia wyszukiwanie, filtrowanie i przechowywanie logów do przyszłej analizy. Jednak wraz ze wzrostem rejestrowania obciążenia AWS, z biegiem czasu rosną również koszty przechowywania logów. Aby zmniejszyć koszty przechowywania logów, ustal polityki przechowywania logów i zastosuj je we wszystkich grupach logów. Możesz to zrobić ręcznie, ale śledzenie nowych grup logów i rozpowszechnianie aktualizacji zasad może stać się nużące.

W tym poście pokazujemy, jak zmniejszyć koszty przechowywania logów poprzez automatyzację ustawień retencji w Amazon CloudWatch. Używamy reguły Amazon EventBridge, aby wywołać funkcję AWS Lambda podczas tworzenia nowej grupy logów CloudWatch Logs. Funkcja Lambda wykonuje dwa zadania. Najpierw ustawia okres przechowywania nowej grupy logów. Po drugie, aktualizuje niezgodne ustawienia przechowywania w istniejących grupach logów. Pokażemy Ci również, jak rozszerzyć zasięg funkcji Lambda na inne regiony AWS z routingiem zdarzeń między regionami. Dostarczymy Ci także instrukcje dotyczące automatycznego wdrażania zasobów za pomocą szablonów AWS CloudFormation oraz ręcznie za pomocą AWS Management Console.

Omówienie architektury

Poniższy rysunek przedstawia zautomatyzowany proces wdrażany w solucji.

Zmniejszanie kosztow przechowywania logow, za pomoca automatyzacji ustawienia retencji w Amazon CloudWatch_1

  1. Grupa logów CloudWatch Logs jest tworzona w dowolnym z Regionów.
  2. Wywoływane jest zdarzenie CloudWatch.
  3. Reguła EventBridge wywołuje funkcję Lambda.
  4. Funkcja Lambda stosuje ustawienie retencji do nowej grupy logów. Zapewnia również zgodność istniejących grup logów w określonych regionach z ustawieniami.

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz następujące elementy.

Opis krok po kroku

Metoda 1: Automatyczne wdrożenie przy użyciu szablonów CloudFormation

Użyj tej metody, aby wdrożyć proces przedstawiony w sekcji „Architecture overview” przy użyciu szablonów CloudFormation. Aby przeprowadzić wdrożenie w jednym regionie, musisz wypełnić tylko sekcję „Deploy to one Region”.

Wdrożenie w jednym Regionie

  1. Pobierz CloudWatchLogGroupRetention-SingleRegion.yml z repozytorium GitHub.
  2. Zaloguj się do AWS Management Console i otwórz konsolę CloudFormation.
  3. Wybierz Create stack, With new resources (standard).
  4. W sekcji Specify template, wybierz Upload a template file. Następnie kliknij Choose file i prześlij CloudWatchLogGroupRetention-SingleRegion.yml. Wybierz Next.
  5. Na stronie Specify stack details wprowadź następujące parametry:
    1. Stack name: Nazwa stosu może zawierać litery (A-Z i a-z), cyfry (0-9) i myślniki (-).
    2. Lambda memory: Ilość pamięci, jaką funkcja Lambda może wykorzystać w czasie wykonywania. Możesz wprowadzić 128–1240 MB w przyrostach co 1 MB.
    3. Regions: Regiony AWS, w których chcesz obserwować tworzenie grup logów i ustawiać okresy przechowywania. Aby przeprowadzić instalację w wielu regionach, musisz wykonać czynności opisane w części „Wdrożenie w wielu regionach”.
    4. Retention: Okres retencji (w dniach).
    5. S3BucketKey: Klucz S3 pakietu wdrożeniowego (na przykład CloudWatchLogGroupRetentionSetter.py.zip).
    6. S3BucketName: Nazwa utworzonego bucketu S3.
  6. Wybierz Next.
  7. Kliknij I acknowledge that this template may create IAM resources. Wybierz Create stack.

Wdrożenie w wielu Regionach

Aby wdrożyć zasoby w wielu regionach, wykonaj następujące kroki.

Krok 1. Wdróż role Identity and Access Management (IAM)

  1. Pobierz yml z repozytorium GitHub.
  1. Zaloguj się do AWS Management Console i otwórz konsolę CloudFormation.
  2. Wybierz Create stack, With new resources (standard).
  3. W sekcji Specify template, wybierz Upload a template file. Kliknij w Choose file i prześlij AWSCloudFormationStackSetExecutionAdministrationRoles.yml. Kliknij Next.
  4. Na stronie Specify stack details wprowadź następujące parametry:
    1. Stack name: Nazwa stosu może zawierać litery (A-Z i a-z), cyfry (0-9) i myślniki (-).
    2. Administrator Account ID: Twój identyfikator konta AWS.
  5. Kliknij Next.
  6. WYbierz I acknowledge that this template may create IAM resources. Kliknij Create stack.

Krok 2. Skopiuj Amazon Resource Name (ARN) magistrali zdarzeń

  1. Pobierz CrossRegionEventRule.yaml z repozytorium GitHub.
  2. W konsoli EventBridge, wybierz Event buses z lewego panelu nawigacji.
  3. Skopiuj nazwę Amazon Resource Name (ARN) magistrali zdarzeń default.

Krok 3: Wdróż regułę EventBridge

  1. Na stronie Stack sets page w konsoli CloudFormation wybierz opcję Create stack set.
  2. W obszarze Permissions, wybierz Self-service permissions.
    1. Jako nazwę IAM role name wybierz AWSCloudFormationStackSetIAMAdministratorRole.
    2. Jako nazwę IAM execution role wybierz AWSCloudFormationStackSetIAMExecutionRole.
  3. W sekcji Specify template wybierz opcję Upload a template file. Kliknij Choose file i prześlij CrossRegionEventRule.yaml. Następnie wybierz Next.
  4. Na stronie Specify stack details, wprowadź następujące parametry:
    1. Stack name: Nazwa stosu może zawierać litery (A-Z i a-z), cyfry (0-9) i myślniki (-).
    2. Event bus ARN: ARN skopiowanej magistrali zdarzeń.
    3. Wybierz Next.
  5. Na stronie Set deployment options, wprowadź identyfikator swojego konta AWS w sekcji Accounts. Wybierz Regions w sekcji Specify regions. Następnie wybierz Next.
  6. Wybierz I acknowledge that this template may create IAM resources. Kliknij Submit.

Metoda 2: Wdrażanie ręczne za pomocą konsoli AWS Management Console

Jeśli nie znasz CloudFormation, możesz wdrożyć zasoby ręcznie za pomocą AWS Management Console.

Krok 1. Utwórz politykę Lambda IAM

W tym kroku tworzysz politykę uprawnień IAM dla funkcji Lambda, definiując jej uprawnienia. Zasada ta umożliwia funkcji dokończenie zadania polegającego na egzekwowaniu oszczędnych zasad przechowywania grup logów.

  1. Zaloguj się do konsoli AWS Management Console i otwórz konsolę uprawnień IAM.
  2. Wybierz Policies w lewym okienku nawigacji. Następnie wybierz Create Policy.
  3. Wybierz zakładkę JSON.
  4. Wpisz poniższy kod.

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "logs:CreateLogStream",

                "logs:PutRetentionPolicy",

                "logs:CreateLogGroup",

                "logs:PutLogEvents",

                "logs:DescribeLogGroups"

            ],

            "Resource": "*"

        }

    ]

}

  1. Dwukrotnie wybierz Next .
  2. Na stronie Review Policy wprowadź wymaganą nazwę polityki (na przykład LambdaExecutionRolePolicyCW).
  3. Wybierz Create Policy.

Krok 2. Utwórz rolę uprawnień IAM funkcji Lambda

W tym kroku tworzysz rolę uprawnień IAM dla funkcji z utworzonymi politykami.

  1. Na stronie Roles w konsoli uprawnień IAM wybierz opcję Create Role.
  2. Na stronie Select trusted entity zachowaj domyślny zaufany typ jednostki (AWS service). Jako Use Case wybierz Lambda. Następnie wybierz Next.
  3. Na stronie Add permissions wyszukaj i wybierz utworzoną politykę. Następnie dwukrotnie wybierz Next.
  4. Wpisz wymaganą nazwę roli (na przykład LambdaExecutionRoleCW).
  5. Wybierz Create Role.

Krok 3. Utwórz funkcję Lambda

W tym kroku tworzysz funkcję i przypisujesz jej rolę uprawnień IAM.

  1. Na stronie Functions konsoli AWS Lambda wybierz opcję Create function.
  2. Na stronie Create function zachowaj domyślną opcję Author from scratch. Wprowadź nazwę funkcji.
  3. W sekcji Basic Information wykonaj następujące czynności.
    1. Jako Runtime wybierz Python 3.9.
    2. Jako Architecture wybierz x86_64.
    3. W obszarze Permissions wybierz Change default execution role. Wybierz Use an existing role. W polu Existing role wybierz utworzoną rolę.
  4. Kliknij Create function.

Krok 4. Zmień domyślne ustawienia środowiska uruchomieniowego Python

W tym kroku zmieniasz procedurę obsługi lub metodę w kodzie funkcji, która przetwarza zdarzenia.

  1. Na stronie Function overview w sekcji Runtime settings wybierz Edit.
  2. Jako Handler zmień domyślny lambda_function.lambda_handler na CloudWatchLogGroupRetentionSetter.lambda_handler.
  3. Kliknij Save.

Krok 5. Ustaw polityki retencji

W tym kroku ustawiasz polityki retencji, które ma wymusić funkcja Lambda.

  1. Na stronie Function overview kliknij w Configuration tab.
  2. Dodaj dwie zmienne środowiskowe.
    1. Wybierz Environmental variables, Edit, Add Environmental Variable.
    2. Jako Key wpisz RETENTION_DAYS. W polu Value wprowadź region lub regiony, które chcesz uwzględnić. Oddziel wiele regionów przecinkami.
    3. Kliknij Add Environmental Variable.
    4. Jako Key wpisz RETENTION_DAYS. W polu Value wprowadź liczbę dni okresu retencji. Możesz wprowadzić 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827 lub 3653.
  3. Kliknij Save.

Krok 6. Prześlij kod funkcji Lambda

W tym kroku użyjesz pliku zapisanego w buckecie S3 do skonfigurowania kodu funkcji Lambda.

  1. Na stronie Function overview wybierz zakładkę Code.
  2. W polu Upload from wybierz Amazon S3 location.
  3. W oknie dialogowym Upload a file from Amazon S3 wprowadź adres URL łącza Amazon S3, do którego przesłałeś skrypt. Aby pobrać adres URL z konsoli S3, wybierz bucket, a następnie wybierz opcję Copy S3 URI na stronie Objects.
  4. Kliknij Save.

Krok 7. Utwórz regułę EventBridge

W tym kroku tworzysz regułę EventBridge, która będzie wywoływać funkcję Lambda podczas tworzenia grupy logów.

  1. Na stronie Rules konsoli EventBridge wybierz Create Rule.
  2. Wpisz nazwę i opcjonalny opis. Następnie wybierz Next.
  3. W sekcji Event pattern na stronie Build event pattern dla AWS Service CloudWatch logs. Jako Event type wybierz AWS API Call via CloudTrail.
  4. Wybierz Specific operation(s) i wprowadź CreateLogGroup. Wybierz Next.
  5. Na stronie Select target(s) w polu Select a target wybierz Lambda function. W polu Function wybierz utworzoną funkcję. Następnie dwukrotnie wybierz Next.
  6. Na stronie Review and Create wybierz Create rule.

Krok 8. (Opcjonalnie) Włącz routing zdarzeń między regionami

EventBridge obsługuje routing zdarzeń między regionami. Wypełnij tę sekcję, aby rozszerzyć zasięg funkcji Lambda na inne regiony.

  1. W konsoli EventBridge wybierz Event buses z lewego panelu nawigacyjnego.
  2. Skopiuj nazwę Amazon Resource Name (ARN) domyślnej magistrali zdarzeń.
  3. Wybierz inny region, który chcesz uwzględnić.
  4. Wybierz Rules, Create rule. Wpisz nazwę i opcjonalny opis. Następnie wybierz Next.
  5. W sekcji Event pattern wykonaj następujące czynności.
    1. Dla usługi AWS Service, wybierz CloudWatch logs.
    2. Jako Event type, wybierz AWS API Call via CloudTrail.
    3. Wybierz Specific operation(s) i wprowadź CreateLogGroup w polu tekstowym. Następnie wybierz Next.
  6. Na stronie Select target(s) wykonaj następujące kroki.
    1. Dla Select a target, wybierz EventBridge event bus. Następnie kliknij Event bus in a different account or Region.
    2. W przypadku Event bus as target wprowadź ARN skopiowanej magistrali zdarzeń. Następnie wybierz Next.
  7. Na stronie Review and Create page wybierz opcję Create rule. Powtórz kroki 3–7 dla każdego regionu, który chcesz uwzględnić.

Przetestuj wdrożenie

Wykonaj poniższe czynności, aby utworzyć grupę logów w celu przetestowania wdrożenia, wywołując funkcję Lambda.

  1. W konsoli CloudWatch wybierz Region z górnego paska narzędzi, który określiłeś w konfiguracji funkcji Lambda.
  2. Wybierz Logs, Log groups.
  3. Wybierz Create log group.
  4. Wprowadź nazwę grupy logów. Następnie wybierz Create.
  5. Na stronie Log groups sprawdź kolumnę Retention dla utworzonej grupy logów. Sprawdź, czy ma ustawienie retencji określone w funkcji Lambda. Sprawdź również, czy ustawienia retencji wszystkich istniejących grup logów są zgodne z tym samym okresem retencji.

Czyności końcowe

Zaloguj się do AWS Management Console i usuń zasoby, które utworzyłeś podczas solucji, w tym:

  • Bucket S3.
  • Ustawiony stos CloudFormation, jeśli został wdrożony.
  • Funkcja lambda i rola uprawnień IAM.
  • Reguła EventBridge.
  • Reguła magistrali zdarzeń, jeśli jest wdrożona.
  • Grupa logów Amazon CloudWatch Logs.

Aby uzyskać więcej informacji, zapoznaj się z artykułem How do I terminate active resources that I no longer need on my AWS account? Sprawdź każdy region, w którym alokujesz zasoby. W konsoli możesz zmienić Region za pomocą selektora Region na pasku nawigacyjnym.

Podsumowanie

Skonfigurowanie zasad retencji Amazon CloudWatch może pomóc w obniżeniu kosztów przechowywania logów. W tym poście opisaliśmy jak używać Amazon EventBridge i funkcji Lambda do automatycznego zarządzania polityką retencji dla nowych i istniejących grup logów.

Nasz proces działa w wielu regionach AWS. Możesz go rozszerzyć, aby działał na innych kontach AWS. Aby uzyskać więcej informacji, zobacz Sending and receiving Amazon EventBridge events between AWS accounts.

Aby lepiej zrozumieć wykorzystanie CloudWatch, zalecamy uruchomienie zapytania CUR (Cost and Usage Report) dla CloudWatch. To zapytanie zwraca miesięczne informacje o kosztach dla połączonych kont AWS. Aby uzyskać więcej informacji, zapoznaj się z AWS CloudWatch.

Aby zapoznać się z przeglądem kosztów CloudWatch, zapoznaj się z artykułem How can I determine why I was charged for CloudWatch usage, and then how can I reduce future charges?

Case Studies
Referencje

Firma Hostersi pozwoliła nam osadzić ogólne zagadnienia programu Well Architected Framework w kontekście naszej firmy. Oszczędziło nam to wiele czasu i pozwoliło znaleźć lepiej dopasowane rozwiązania do specyfiki naszego biznesu. WAF był świetnym katalizatorem do wprowadzenie szeregu zmian w obszarze niezawodności, szybkości i bezpieczeństwa edrone. 

Piotr Stachowicz
CTO
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.