CloudFormation Drift Detection

W poniższym artykulę przedstawie Wam czym jest mechanizm Drift Detection oraz przedstawię na małym przykładzie jak on działa w CloudFormation.

1. Co to jest CloudFormation Drift?

CloudFormation Drift jest to mechanizm, który pozwoli nam wykryć zmiany w naszej infrastrukturze, które zostały wykonane np z poziomu AWS CLI lub konsoli, zamiast w naszym szablonie CloudFormation. Wykorzystywanie mechanizmu drift pomoże nam uniknąć błędów podczas aktualizacji infrastruktury, zapobiegnie replikacji stacku oraz wielu wielu innych.

2. Wykorzystanie mechanizmu drift

Sprawdzimy na prostym przykładzie jak sprawdzić, czy nasza infrastruktura jest w pełni zgodna, z tym co mamy w szablonie. Jako przykład posłuży nam bucket S3, w tym celu wykorzystamy poniższy szablon, zapiszmy go do pliku s3.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: "S3 Bucket for test drift"
Parameters:
  S3BucketName:
    Type: String
Resources:
  DummyServer:
    Type: "AWS::S3::Bucket"
    Properties:
      BucketName: !Ref S3BucketName

Mamy szablon zapisany, teraz czas utworzyć stack, zrobimy to przy pomocy poniższego polecenia

aws cloudformation create-stack --stack-name drift-stack --template-body=file://s3.yaml --parameters ParameterKey=S3BucketName,ParameterValue=s3ucketfordrifttest

Oczywiście w stack-name oraz ParameterValue, możecie wprowadzić swoje dane 🙂 Po wykonaniu polecenia powinniśmy dostać StackId. W pierwszej kolejności sprawdzimy drift w przypadku kiedy infrastruktura zgadza się z tym, co mamy w szablonie. W tym celu będziemy musieli wykonać dwa polecenia. Pierwsze, które odpali nam mechanizm drift na naszym stacku

aws cloudformation detect-stack-drift --stack-name drift-stack

W odpowiedzi dostaniemy identyfikator StackDriftDetectionId, u mnie wyglądało to tak

{
"StackDriftDetectionId": "b15ba670-b842-11ee-8df6-068e3cb322eb"
}

Następnie, musimy wykonać polecenie, które da nam więcej informacji odnośnie naszego StackDriftDetectionId, robimy to przy pomocy polecenia

aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id <code class="language-json">b15ba670-b842-11ee-8df6-068e3cb322eb

Zwrotka będzie wyglądała mniej więcej tak

{
    "StackId": "arn:aws:cloudformation:eu-central-1:111111111111:stack/drift-stack/60359260-b842-11ee-8f4f-0aba8714604f",
    "StackDriftDetectionId": "b15ba670-b842-11ee-8df6-068e3cb322eb",
    "StackDriftStatus": "IN_SYNC",
    "DetectionStatus": "DETECTION_COMPLETE",
    "DriftedStackResourceCount": 0,
    "Timestamp": "2024-01-21T09:50:41.653000+00:00"
}

StactDriftStatus IN_SYNC oraz DetectionsStatus DETECTION_COMPLETE oznaczają, że wszystko szablon pokrywa się z tym, co mamy na infrastrukturze. Po więcej informacji odnośnie możliwych statusów, odsyłam bezpośrednio do dokumentacji AWS https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-stack-drift.html#drift-status-codes, ponieważ nie ma sensu duplikować informacji ze sprawdzonego źródła.

Ok sprawdziliśmy jak działa drift dla nie zmienionego środowiska, ale teraz dla przykładu usuńmy nasz bucket S3 z poziomu AWS CLI przy pomocy polecenia

aws s3 rb s3://s3ucketfordrifttest

I wykonajmy ponownie polecenie na uruchomienie mechanizmu drift oraz na dokładniejszy opis statusu, dla przypomnienia poniższe polecenia

aws cloudformation detect-stack-drift --stack-name drift-stack

aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id id_z_polecenia_powyżej

W tym wypadku zwrotka, mówi nam zupełnie co innego

{
    "StackId": "arn:aws:cloudformation:eu-central-1:11111111111:stack/drift-stack/e8745270-b83c-11ee-a8e5-026c08240e5d",
    "StackDriftDetectionId": "e45b2b40-b83d-11ee-ba3b-0acebedc54d1",
    "StackDriftStatus": "DRIFTED",
    "DetectionStatus": "DETECTION_COMPLETE",
    "DriftedStackResourceCount": 1,
    "Timestamp": "2024-01-21T09:17:25.876000+00:00"
}

StackDriftStatus mówi nam o tym, że została wykryta zmiana, natomiast DriftedStackResourceCount, mówi nam o tym, że został zmieniony jeden zasób.

3. Jaki zasób został zmieniony?

Posiadamy informacje, że jeden zasób został zmieniony, tylko jak sprawdzić o który chodzi?

W tym celu wystarczy wykonać poniższe polecenie

aws cloudformation describe-stack-resource-drifts --stack-name drift-stack

I w efekcie zobaczymy informację odnośnie tego, co zostało zmienione oraz jaki ma status

    "StackResourceDrifts": [
        {
            "StackId": "arn:aws:cloudformation:eu-central-1:177394270612:stack/drift-stack/b173be20-b849-11ee-969a-02978ac50df1",
            "LogicalResourceId": "DummyServer",
            "PhysicalResourceId": "s3ucketfordrifttest",
            "ResourceType": "AWS::S3::Bucket",
            "StackResourceDriftStatus": "DELETED",
            "Timestamp": "2024-01-21T10:43:20.512000+00:00"
        }
    ]
}

W naszym wypadku, jest to StackResourceDriftStatus, ponieważ usuneliśmy nasz bucket S3. Możliwe, są 4 statusy przedstawione poniżej

  • DELETED: The resource differs from its expected template configuration because the resource has been deleted.
  • MODIFIED: One or more resource properties differ from their expected values (as defined in the stack template and any values specified as template parameters).
  • IN_SYNC: The resource’s actual configuration matches its expected template configuration.
  • NOT_CHECKED: AWS CloudFormation does not currently return this value.

To by było na tyle, mam nadzieję, że mój post zmotywuje wielu z Was do wykorzystywania mechanizmu drift w CloudFormation 🙂

Related Posts