artykuły

Jak i po co tagowac zasoby?

Brak komentarzy

Jeśli chcesz zobaczyć kilka sposobów tagowania zasobów w chmurze AWS oraz poznać przykładowe wykorzystanie tego mechanizmu, to zapraszam Cię do przeczytania poniższego tekstu.

Jak tagować zasoby?

artykule o zarządzaniu tagami wspominałem już czym są tagi oraz jak nimi zarządzać z poziomu organizacji AWS. Dzisiaj przyjrzyjmy się w jaki sposób możemy dodawać tagi do zasobów ze szczególnym uwzględnieniem Lambd, SQS, StepFunctions i LogGroups.

Ręcznie

Pierwszy oczywisty sposób, to użycie portalu AWS i dodanie tagów ręcznie. Zobaczmy jak to zrobić na przykładnie AWS Lambda.

Cel osiągnięty, ale oczywiście nie jest to najlepszy sposób, ponieważ jest kompletnie nie utrzymywalny. Jeżeli będziemy potrzebowali postawić stacka jeszcze raz, to tagów po prostu nie będzie.

Jeśli chodzi o inne wspomniane wcześniej zasoby, to dokładnie w taki sam sposób możemy dodać tagi do SQS i StepFunctions, ale niestety LogGroups tak nie obsłużymy.

AWS CLI

Inny sposób na dodanie tagów to użycie AWS CLI. Właśnie tego sposobu możemy użyć, by edytować tagi w LogGrupach.

By to zrobić skorzystamy z dwóch komend:

  • aws logs list-tags-log-group
  • aws logs tag-log-group

Na portalu AWS nie ma możliwości sprawdzenia jakie tagi przypięte są do LogGroup. Do sprawdzenia tego wykorzystamy pierwszą komendę. Potrzebujemy tylko nazwę zasobu.

PS > aws logs list-tags-log-group --log-group-name /aws/lambda/resources-tagging-app-ReceiveEventLambda-LV0Y851C6C2Y
{
    "tags": {}
}

Nie ma aktualnie żadnego taga, więc dodajmy go.

PS > aws logs tag-log-group --log-group-name /aws/lambda/resources-tagging-app-ReceiveEventLambda-LV0Y851C6C2Y --tags service-name=resource-tagging

Na koniec sprawdźmy, czy tag faktycznie  został dodany.

PS > aws logs list-tags-log-group --log-group-name /aws/lambda/resources-tagging-app-ReceiveEventLambda-LV0Y851C6C2Y
{
    "tags": {
        "service-name": "resource-tagging"
    }
}

Użycie AWS CLI pozwala oskryptować i zautomatyzować dodawanie tagów do zasobów, niemniej nadal wymaga od nas trochę zaangażowania i powoduje, że musimy pamiętać o modyfikacjach, gdy dodajemy nowe zasoby.

Przejdźmy więc do lepszych rozwiązań.

Tagi w CloudFormation

Z pomocą przychodzi mechanizm infrastructure as a code. Dzięki temu mechanizmowi możemy oznaczać zasoby tagami zapisując infrastrukturę w pliku yaml lub xml.

Przykładowe przypisanie tagów do kolejki SQS.

Queue:
    Type: AWS::SQS::Queue
    Properties:
      Tags:
        - Key: service-name
          Value: resource-tagging

Rozwiązanie bardzo dobre, ponieważ pozwala zarządzać tagami w tym samym miejscu, co całą infrastrukturą oraz w pełni automatyzuje ten proces.
Niestety jest również kilka minusów. Po pierwsze dodając nowe zasoby musimy pamiętać o oznaczeniu ich wszystkimi stosowanymi przez nas tagami, co również powoduje rozrastanie się pliku z infrastrukturą. Największym jednak problemem jest to, że niektóre zasoby nadal nie mogą być oznaczane. Przykładem znowu są nieszczęsne LogGroupy.

Tagi na poziomie stacka CloudFormation

Innym sposobem tagowania zasobów przy użyciu CloudFormation są tagi na poziomie stacka CloudFormation. Tym razem nie dodajemy tagów podczas definiowania poszczególnych zasobów, a podczas deployowania stacka.

Możemy to zrobić używając AWS CLI,

PS > aws cloudformation deploy --tags "service-name=resource-tagging" "environment=dev"

AWS SAM,

PS > sam deploy --tags service-name=resource-tagging environment=dev

czy dotnet lambda.

PS > dotnet lambda deploy-serverless --tags "service-name=resource-tagging;environment=dev"

Dodanie taga na poziomie stacka CloudFormation powoduje propagowanie go podczas wdrażania do każdego zasobu zdefiniowanego w tym stacku. Niestety są wyjątki, które sprawiają, że nie jest to rozwiązanie idealne, którym zdecydowanie mogłoby być.

Żeby nie być gołosłownym, oto kilka problematycznych zasobów:

  • LogGruop – tagi w ogóle nie są propagowane
  • SQS – tagi są propagowane tylko podczas tworzenia zasobu, natomiast podczas updatów już nie
  • StepFunctions – dokładnie tak jak przy SQS
  • WAFv2 WebACL – tagi nie są propagowane

Lambda do tagowania zasobów

Łącząc kilka z wyżej wymienionych sposobów jesteśmy w stanie uzyskać zadowalający efekt. Na przykład tagując problematyczne zasoby w pliku z infrastrukturą oraz oznaczając stacka podczas wdrożenia, pokryjemy większość zasobów(oczywiście bez wspomnianych LogGroups).

Innym ciekawym rozwiązaniem jest wykorzystanie mechanizmów znanych z AWS CLI w kodzie. Możemy napisać prostą Lambdę, która na podstawie tagów, zdefiniowanych na poziomie stacka CloudFormation, będzie je przypinała do problematycznych zasobów.

Wspomnianą wyżej Lambdę możemy automatycznie wywoływać, gdy nastąpiło uaktualnienie jakiegokolwiek stacka CloudFormation. Wykorzystamy do tego subskrypcję na zdarzenia publikowane na EventBridge. Utworzymy subskrypcję na zdarzenie typu ExecuteChangeSet publikowane przez CloudFormation do CloudTrail, a później na EventBridge. Więcej o strukturze zdarzeń w EventBridge możesz przeczytać tutaj.

Poniżej znajduje się przykładowa implementacja przy użyciu AWS SAM.

TagResources:
    Type: AWS::Serverless::Function
    Properties:
      Events:
        CloudFormationEvent:
          Type: CloudWatchEvent
          Properties:
            Pattern:
              source:
                - aws.cloudformation
              detail-type:
                - AWS API Call via CloudTrail
              detail:
                eventSource:
                  - cloudformation.amazonaws.com
                eventName:
                  - ExecuteChangeSet

Podczas pisania kodu do propagacji tagów wykorzystamy AWS SDK. By dowiedzieć się jak dodać tag do LogGroup w .Net Core zajrzyj tutaj, a jeśli wolisz Node.js, tutaj. Oczywiście analogiczne metody dostępne są w każdym wspieranym języku programowania.

Tego typu mechanizm przygotowany w formie opensource przez Lumigo można znaleźć w AWS Serverless Application Repository oraz na GitHubie. Na chwilę obecną wspierane są tylko LogGroups, SQS oraz StepFunctions. Oczywiście jako, że jest to rozwiązanie opensource, nic nie stoi na przeszkodzie, by dołożyć wsparcie dla innych zasobów.
Dzięki temu, że aplikacja dostępna jest poprzez AWS Serverless Application Repository, jesteśmy w stanie łatwo ją wdrożyć oraz utrzymywać.

Tag Editor

Warto jeszcze wspomnieć o Tag Editorze, w którym możemy wyszukać zasoby i edytować tagi dla całej grupy. Poniżej zobaczysz również jak używać tej usługi do wyszukiwania zasobów oznaczonych tym samym tagiem.

Po co tagować zasoby?

Skoro już wiemy jak tagować zasoby, to warto również pochylić się nad tym po co w ogóle nam te tagi. Przyjrzyjmy się kilku głównym strategiom oznaczania zasobów.

Grupowanie zasobów

Najbardziej oczywistym zastosowaniem tagów w chmurze AWS jest grupowanie zasobów. Przyjrzyjmy się kilku przykładom:

  • service-name – grupowanie wszystkich zasobów należących do jednej aplikacji
  • product-names – wszystkie zasoby należące do danego produktu
  • processing-plane – rozróżnienie między zasobami do przetwarzania wsadowego, API oraz innymi typami
  • owner – grupowanie po właścicielu zasobu, którym może być na przykład zespół
  • security-sensitive – wyróżnienie zasobów posiadających wrażliwe dane

Tagi tego typu spełniają przede wszystkim dwa zadania. Po pierwsze łatwo można dowiedzieć się do kogo lub jakiej aplikacji należy zasób, wystarczy spojrzeć na tagi w jego konfiguracji.

Po drugie łatwo odnaleźć całą grupę zasobów, gdy poszukujemy na przykład wszystkich zasobów w obrębie aplikacji lub należących do tego samego właściciela.
Do wyszukiwania tego typu możemy wykorzystać AWS Resource Groups oraz Tag Editor.

W AWS Resource Groups możemy utworzyć i zapisać grupę zasobów na podstawie tagów.

Mierzenie kosztów

Wspomniane wcześniej tagi grupujące możemy również wykorzystać, by mierzyć koszta poszczególnych grup z podziałem na typy zasobów.
By to zrobić trzeba aktywować dany tag jako “Cost allocation tag”. Jak to zrobić? Wystarczy wejść na Cost allocation tags w Billing, zaznaczyć wybrane tagi i aktywować.

Teraz już możemy zacząć monitorować koszta poprzez Cost Explorer. Warto jednak pamiętać, że zliczanie kosztów rozpoczyna się w momencie aktywacji “Cost allocation taga”, a nie w oznaczenia zasobu, czyli aktywacja taga musi nastąpić jak najwcześniej.
By zobaczyć dane o konkretnej grupie musimy wybrać filtrowanie po tagu i jego wartości.

Teraz pozostało już tylko przeglądanie i analizowanie kosztów aplikacji z np. podziałem na typ zasobu. Jak łatwo zauważyć, czym więcej zasobów posiada tag informujący o tym do jakiej aplikacji należą, tym dane o kosztach będą dokładniejsze.

Jako, że kryterium grupowania zasoby zależy tylko i wyłącznie od nas, to koszta również możemy mierzyć na różnym poziomie. Nie tylko na poziomie aplikacji, ale również całego produktu oraz na przykład możemy sprawdzić ile kosztują zasoby zarządzane przez dany zespół.

Automatyka

Jednym z przykładów na wykorzystanie tagów do automatyzacji jest Lifecycle Manager, a dokładnie Snapshot Lifecycle Policy.
Zdefiniujmy nowy tag na instancji EC2, np. daily-snapshot o wartości 3 days.

Teraz możemy utworzyć politykę w Lifecycle Managerze, która będzie codziennie robić snapshot każdej instancji EC2, która jest oznaczona wyżej wspomnianym tagiem.

Nic nie stoi na przeszkodzie, by utworzyć drugą politykę, dla tego samego taga, ale z inną wartością, np. 7 days, która snapshoty będzie przechowywała przez 7 dni.

Monitoring

Jeszcze jednym sposobem wykorzystania tagów jest monitoring.
Przykładowo, jeżeli wszystkie kolejki SQS, które działają jako dead letter queue oznaczamy tagiem is-dlq o wartości true, to jesteśmy w stanie ustawić alert, który powiadomi nas o każdym nowym elemencie, który wpadnie na kolejkę tego typu. Dzięki temu możemy globalnie zdefiniować informowanie o błędach i nie martwić się obsługą w poszczególnych aplikacjach. Niestety aktualnie AWS nie daje takiej możliwości out of the box, ale jest powszechnie dostępna w narzędziach do monitorowania usług chmurowych, takich jak DataDog.

Przydatne linki

Tags: , , , , , ,

Powiązane artykuły

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

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

Menu