Zrozumienie narzędzi IaC: AWS CDK a Terraform

Zastanawiasz się, czy wybrać AWS CDK czy Terraform? Ten artykuł pomoże Ci podjąć przemyślaną decyzję.

Technologia chmury obliczeniowej zrewolucjonizowała świat IT i danych. Sposób wdrażania i utrzymywania aplikacji, a także praktyki programistyczne – wszystko to uległo znacznym zmianom dzięki chmurze. Aktualnie wszystkie nowe aplikacje projektowane są z myślą o natywnej pracy w chmurze i kompatybilności z jej usługami.

Chmura obliczeniowa umożliwia nam tworzenie wysoce dostępnych, skalowalnych i wydajnych architektur, co sprawia, że usługi w chmurze są coraz bardziej pożądane. Wraz z tym dynamicznym rozwojem chmury pojawiła się konieczność zarządzania infrastrukturą za pomocą kodu. Ręczne zarządzanie zasobami w chmurze za pomocą konsoli może być złożone i trudne do śledzenia.

Rozwiązaniem tego problemu jest Infrastruktura jako Kod (IaC). Dzięki IaC możemy definiować nasze zasoby jako kod i wykorzystywać go do uruchamiania usług w chmurze. Używanie IaC pozwala wielu programistom na współpracę przy infrastrukturze i śledzenie wprowadzanych przez nich zmian.

Infrastruktura jako Kod w AWS

AWS jest największym i najczęściej wybieranym dostawcą usług chmurowych na świecie. Posiada własne narzędzia IaC, takie jak AWS CloudFormation lub AWS CDK, a także umożliwia korzystanie z zewnętrznych narzędzi IaC, np. Terraform. W kontekście wyboru narzędzi IaC dla AWS, Terraform, będący rozwiązaniem firmy zewnętrznej, stanowi silną konkurencję dla narzędzi zarządzanych przez AWS, czyli CloudFormation i CDK.

Przy tak wielu dostępnych opcjach i funkcjach, wybór odpowiedniego narzędzia IaC może być wyzwaniem. W tym artykule przeanalizujemy różnice między AWS CDK a Terraform. AWS CDK wewnętrznie korzysta z CloudFormation, więc aby lepiej zrozumieć relację między CloudFormation i Terraform, zachęcamy do lektury artykułu „Zrozumienie narzędzi IaC: CloudFormation vs. Terraform”.

Terraform

Terraform to narzędzie open-source do zarządzania infrastrukturą jako kod, stworzone przez Hashicorp. Jest to bardzo precyzyjne i sprawdzone narzędzie, które obsługuje nie tylko AWS, ale również innych dostawców chmury. Terraform wspiera wszystkie usługi AWS, a społeczność programistów szybko adaptuje nowe funkcje dodawane przez AWS. Kod piszemy w języku HCL (Hashicorp Configuration Language), który jest zbliżony do JSON i służy do definiowania zasobów infrastruktury.

AWS CDK

AWS CDK to nakładka na AWS CloudFormation. Aby zrozumieć, jak działa AWS CDK, warto poznać podstawy AWS CloudFormation. AWS CloudFormation to narzędzie zarządzane przez AWS, które pozwala na definiowanie infrastruktury w formacie YML lub JSON. Choć formaty te są łatwe do odczytania, nie są pełnoprawnymi językami programowania. Brakuje im natywnego wsparcia dla pętli i funkcji, co utrudnia zarządzanie dużymi infrastrukturami. W tym miejscu pojawia się AWS CDK.

AWS CDK jest nakładką na AWS CloudFormation, która umożliwia korzystanie z popularnych języków programowania, takich jak Java czy Python, do zarządzania infrastrukturą. Ułatwia to pisanie i utrzymywanie kodu.

Terraform vs. AWS CDK: Różnice

#1. Język i łatwość użycia

Język i łatwość użycia to kluczowe aspekty różnicujące AWS CDK i Terraform.

Zacznijmy od Terraform. Do definiowania zasobów używa języka zbliżonego do JSON, czyli HCL (HashiCorp Configuration Language). Jest on dość prosty, a dokumentacja jest zrozumiała i łatwa do śledzenia, nawet dla początkujących.

Spójrzmy na przykładowy kod tworzenia wiadra S3:

resource "aws_s3_bucket" "my_s3_bucket" {
  bucket = "my-tf-bucket"

  tags = {
    Name        = "My bucket"
    Environment = "Dev"
  }
}

Kod jest prosty do odczytania, a więcej parametrów dostępnych dla tego zasobu można znaleźć w dokumentacji Terraform.

Jak już wspomniano, AWS CDK jest nakładką na CloudFormation, umożliwiającą definiowanie zasobów w językach programowania. Oto przykładowy kod AWS CDK do stworzenia wiadra S3:

import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';

export class BucketStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    new s3.Bucket(this, 'MyFirstBucket', {
      bucketName: 'my-first-bucket',
    });
 }
}

Kod Terraform może wydawać się nieco bardziej przejrzysty, ale zarówno kod Terraform, jak i CDK są stosunkowo proste. Jeśli planujesz używać IaC do niewielkiego projektu, zarówno Terraform, jak i CDK są świetnymi opcjami pod względem języka i łatwości użycia.

Jednak wybierając narzędzie IaC do dużego projektu z wieloma programistami, Terraform ma pewną wadę. Chociaż jest prosty, HCL to nowy język i trzeba będzie przeszkolić programistów w zakresie jego użycia, co może być problematyczne. Ponadto, manipulowanie danymi w Terraform nie jest tak łatwe jak w innych językach programowania. Na przykład iteracja po listach, obiektach i przekształcanie wartości nie jest tak intuicyjne, szczególnie dla początkujących.

Osobiście, z punktu widzenia łatwości użycia, preferuję AWS CDK od Terraform. Podczas pracy z Terraform zdarzały się sytuacje, gdy trzeba było stosować obejścia lub skomplikowane skrypty, aby osiągnąć zamierzony efekt. Kontrola nad danymi i łatwość manipulacji danymi w językach AWS CDK to duża zaleta.

#2. Zakres

Terraform to wielochmurowe narzędzie IaC, co oznacza, że można go używać nie tylko z AWS, ale również z innymi dostawcami, np. Azure czy GCP. Terraform jest idealny do wdrożeń w wielu chmurach i korzystania z usług różnych dostawców w jednej aplikacji.

W przeszłości zdarzały się awarie globalnych platform spowodowane problemami z usługami konkretnego dostawcy. Obecnie posiadanie więcej niż jednego dostawcy usług chmurowych dla jednej aplikacji to rozsądne rozwiązanie.

AWS CDK jest narzędziem IaC oferowanym przez AWS i jest ograniczony tylko do chmury AWS.

Biorąc pod uwagę zakres, Terraform jest bezsprzecznym zwycięzcą. Ma sens, aby programiści używali jednego narzędzia dla wszystkich platform chmurowych.

#3. Wydajność

Wydajność zazwyczaj nie jest najważniejszym kryterium wyboru narzędzia IaC, ale może mieć znaczenie w dużych projektach. Terraform wdraża zasoby za pomocą AWS SDK, podczas gdy kod CDK najpierw jest konwertowany na szablony CloudFormation, a następnie wdrażany.

Terraform powinien działać nieco szybciej niż AWS CDK, głównie ze względu na czas potrzebny CDK do konwersji kodu na szablon CloudFormation.

#4. Modułowość

Zarówno Terraform, jak i AWS CDK umożliwiają tworzenie modułów. Terraform posiada natywne wsparcie dla modułów. Można tworzyć własne moduły i hostować je w prywatnym rejestrze, do użytku w organizacji. Terraform oferuje również publiczny rejestr modułów, gdzie można znaleźć moduły do użytku publicznego.

W AWS CDK można tworzyć funkcje, klasy wielokrotnego użytku i udostępniać kod w organizacji. Jest to duża zaleta AWS CDK. W innym narzędziu AWS IAC, CloudFormation, nie ma możliwości tworzenia i ponownego wykorzystywania kodu jako modułów. Można korzystać z zagnieżdżonych stosów w CloudFormation, ale użycie AWS CDK jest o wiele bardziej eleganckim rozwiązaniem.

Podsumowując, oba narzędzia są pod tym względem porównywalne.

#5. Kontrola i Zarządzanie

Dostęp do konsoli AWS jest kontrolowany przez IAM (Identity and Access Management). Zarówno AWS CDK, jak i Terraform umożliwiają stosowanie zasad uprawnień, które pozwalają na autoryzowanie lub odrzucanie konkretnych akcji. Te uprawnienia pozwalają na szczegółową kontrolę nad działaniami na koncie.

Oprócz kontroli dostępu do zasobów za pomocą uprawnień, Terraform oferuje zasady jako kod Sentinel. Sentinel umożliwia tworzenie szczegółowych zasad kontrolujących działania użytkownika w Terraform.

Podsumowanie

Ponieważ AWS CDK wewnętrznie korzysta z CloudFormation, sugerujemy zapoznać się z artykułem „CloudFormation vs. Terraform”, aby lepiej zrozumieć różnice między AWS CDK i Terraform.

Ogólnie rzecz biorąc, zarówno AWS CDK, jak i Terraform są dojrzałymi i potężnymi narzędziami. Terraform ma pewne niedogodności w kwestii manipulacji danymi, ale po opanowaniu tego narzędzia, korzystanie z obejść i transformacji danych staje się łatwiejsze. W przypadku środowisk wielochmurowych Terraform jest oczywistym wyborem. Jeśli jednak pracujesz tylko z AWS, AWS CDK jest doskonałą alternatywą.