Przetwarzanie warunkowe w szablonach Cloudformation


W przypadku, gdy tworzenie zasobów przy pomocy szablonów Cloudformation musimy uzależnić od pewnych warunków (na przykład wartości paramtrów) na ratunek przychodzą wbudowane mechanizmu serwisu AWS. W tym artykule opiszę techniki posługiwania się Sekcją warunkową (ang. Conditions) oraz funkcjami warunkowymi.

Funkcje warunkowe

Podstawową funkcją warunkową Cloudformation jest funkcja Fn::If, która w szablonach JSON ma następujący schemat "Fn::If": [nazwa_warunku, wartosc_prawda, wartosc_falsz], którym przypomina standardowy operator ternarny obecny między innymi w językach z rodziny C warunek ? wartosc_prawda : wartosc_falsz. Działanie funkcji polega na tym, że jeżeli wartość logiczna zdefiniowana w sekcji warunkowej jako nazwa_warunek równa się true to wynikiem działania funkcji jest wartosc_prawda. W przeciwnym wypadku funkcja zwróci wartosc_falsz. Wartość, która powinna być zwrócona może być podana jawnie, lub być wynikiem obliczenia innej funkcji. Na przykład "Fn:If": ["MojeDokumentyIstnieje", "Fn:GetAtt": ["MojeDokumenty", "WebsiteUrl"], "https://s3.amazonaws.com/moje_dokumenty"] zwróci wynik działania funkcji Fn:GetAtt jeżeli warunek MojeDokumentyIstnieje jest prawdziwy.

Sekcja warunkowa

Postawą działania funkcji warunkowej są warunki, które definiuje się w sekcji Conditions szablonu CloudFormation. Każy z warunków zdefinowanych w tej grupie ma unikatową nazwę, a jego wartość wynika z zastosowania funkcji, które odpowiadają operatorom logicznym: Fn::And, Fn::Or, Fn::Not oraz funkcji porównania Fn::Equals. Do utworzony warunków można odwołać się w wywołaniach funkcji Fn::If albo przez atrybut Condition, który można utworzyć dla każdego zasobu.

Przykład

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters" {
    "System": {
	  "Description": "Okresla, czy system jest produkcyjny czy testowy",
	  "AllowedValues": ["prod", "test", "beta"],
	  "Type": "String"
	}
  },
  "Conditions": {
    "TestSystem": {
	  "Fn::Or": [
	    Fn::Equals[{"Ref": "System"}, "test"],
		Fn::Equals[{"Ref": "System"}, "beta"]
	   ]
	  }
	}
  },
  "Resources": {
    "Dane": {
	  "Type": "AWS::S3::Bucket",
	  "Resources": {
	    "BucketName": {"Fn::If": [
		  "TestSystem",
		  "dane-testowe",
		  "dane-produkcyjne"
		]}
	  }
	},
	"UsunDane": {
	  "Type": "AWS::Lambda::Function",
	  "Condition": "TestSystem",
	  "Resources": {
	    "FunctionName": "usun-dane-fn"
	  }
	}
  }
}

Nazwa kubełka zostanie określona przy pomocy funkcji Fn::If. Jeżeli warunek TestSystem jest fałszywy, to funkcja UsunDane nie zostanie wogóle utworzona (bo jej istnienie nie jest uzasadnione na systemie produkcyjnym.

Zobacz też