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 Lambda i Amazon 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
W 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
W 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>